[commit] r2379 - OSCogVM as per VMMaker.oscog-eem.55. Implement shallowCopy (primitiveClone) and

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[commit] r2379 - OSCogVM as per VMMaker.oscog-eem.55. Implement shallowCopy (primitiveClone) and

commits-3
 
Author: eliot
Date: 2011-04-26 12:24:15 -0700 (Tue, 26 Apr 2011)
New Revision: 2379

Removed:
   branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h
Modified:
   branches/Cog/image/VMMaker-Squeak4.1.changes
   branches/Cog/image/VMMaker-Squeak4.1.image
   branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c
   branches/Cog/platforms/unix/vm/sqUnixVMProfile.c
   branches/Cog/src/vm/cointerp.c
   branches/Cog/src/vm/cointerp.h
   branches/Cog/src/vm/gcc3x-cointerp.c
Log:
OSCogVM as per VMMaker.oscog-eem.55.  Implement shallowCopy (primitiveClone) and
copyFrom: (primitiveCopyObject) correctly for contexts.  Change package name to
correct Monticello branch  convention.  Use trunk linux LocalePlugin source.


Modified: branches/Cog/image/VMMaker-Squeak4.1.changes
===================================================================
--- branches/Cog/image/VMMaker-Squeak4.1.changes 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/image/VMMaker-Squeak4.1.changes 2011-04-26 19:24:15 UTC (rev 2379)
@@ -178019,4 +178019,224 @@
  FFIPlugin ReentrantARMFFIPlugin ReentrantFFIPlugin ReentrantPPCBEFFIPlugin
  NewsqueakIA32ABIPlugin NewsqueakIA32ABIPluginAttic)!
 
-----QUIT----{1 April 2011 . 12:31:53 pm} VMMaker-Squeak4.1.image priorSource: 7347139!
\ No newline at end of file
+----QUIT----{1 April 2011 . 12:31:53 pm} VMMaker-Squeak4.1.image priorSource: 7347139!
+
+----STARTUP----{26 April 2011 . 11:37:37 am} as /Users/eliot/Cog/oscogvm/image/VMMaker-Squeak4.1.image!
+
+
+InterpreterPrimitives removeSelector: #primitiveContextAt!
+
+InterpreterPrimitives removeSelector: #primitiveContextAtPut!
+
+InterpreterPrimitives removeSelector: #primitiveContextSize!
+!InterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:02' prior: 36472637!
+primitiveCopyObject
+ "Primitive. Copy the state of the receiver from the argument.
+ Fail if receiver and argument are of a different class.
+ Fail if the receiver or argument are non-pointer objects.
+ Fail if receiver and argument have different lengths (for indexable objects).
+ "
+ | rcvr arg length |
+ self methodArgumentCount = 1 ifFalse:
+ [^self primitiveFail].
+ arg := self stackObjectValue: 0.
+ rcvr := self stackObjectValue: 1.
+
+ self failed ifTrue:[^nil].
+ (objectMemory isPointers: rcvr) ifFalse:
+ [^self primitiveFail].
+ (objectMemory fetchClassOfNonInt: rcvr) = (objectMemory fetchClassOfNonInt: arg) ifFalse:
+ [^self primitiveFail].
+ length := objectMemory lengthOf: rcvr.
+ length = (objectMemory lengthOf: arg) ifFalse:
+ [^self primitiveFail].
+
+ "Now copy the elements"
+ 0 to: length-1 do:[:i|
+ objectMemory storePointer: i ofObject: rcvr withValue: (objectMemory fetchPointer: i ofObject: arg)].
+
+ "Note: The above could be faster for young receivers but I don't think it'll matter"
+ self pop: 1. "pop arg; answer receiver"
+! !
+!StackInterpreter class methodsFor: 'translation' stamp: 'eem 4/25/2011 19:08'!
+prepareToBeAddedToCodeGenerator: aCodeGen
+ "Override to delete InterpreterPrimitives methods we override."
+ aCodeGen removeVariable: 'cogit'.
+ self selectors do:
+ [:sel|
+ (superclass whichClassIncludesSelector: sel) ifNotNil:
+ [aCodeGen removeMethodForSelector: sel]]! !
+!StackInterpreterPrimitives methodsFor: 'primitive support' stamp: 'eem 4/26/2011 10:10'!
+cloneContext: aContext
+ | cloned spouseFP sp |
+ <var: #spouseFP type: #'char *'>
+ cloned := objectMemory clone: aContext.
+ cloned ~= 0 ifTrue:
+ [0 to: StackPointerIndex do:
+ [:i|
+ objectMemory
+ storePointerUnchecked: i
+ ofObject: cloned
+ withValue: (self externalInstVar: i ofContext: aContext)].
+ MethodIndex to: ReceiverIndex do:
+ [:i|
+ objectMemory
+ storePointerUnchecked: i
+ ofObject: cloned
+ withValue: (self fetchPointer: i ofObject: aContext)].
+ (self isStillMarriedContext: aContext)
+ ifTrue:
+ [spouseFP := self frameOfMarriedContext: aContext.
+ sp := (self stackPointerIndexForFrame: spouseFP) - 1.
+ 0 to: sp do:
+ [:i|
+ objectMemory
+ storePointerUnchecked: i + CtxtTempFrameStart
+ ofObject: cloned
+ withValue: (self temporary: i in: spouseFP)]]
+ ifFalse:
+ [sp := (self fetchStackPointerOf: aContext) - 1.
+ 0 to: sp do:
+ [:i|
+ objectMemory
+ storePointerUnchecked: i + CtxtTempFrameStart
+ ofObject: cloned
+ withValue: (self fetchPointer: i ofObject: aContext)]].
+ sp + CtxtTempFrameStart + 1 to: (objectMemory lengthOf: aContext) - 1 do:
+ [:i|
+ objectMemory
+ storePointerUnchecked: i
+ ofObject: cloned
+ withValue: objectMemory nilObject]].
+ ^cloned! !
+!StackInterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:30'!
+primitiveClone
+ "Return a shallow copy of the receiver.
+ Special-case non-single contexts (because of context-to-stack mapping).
+ Can't fail for contexts cuz of image context instantiation code (sigh)."
+
+ | receiver newCopy |
+ receiver := self stackTop.
+ (objectMemory isIntegerObject: receiver)
+ ifTrue:
+ [newCopy := receiver]
+ ifFalse:
+ [(self isContextNonInt: receiver)
+ ifTrue:
+ [newCopy := self cloneContext: receiver]
+ ifFalse:
+ [newCopy := objectMemory clone: receiver].
+ newCopy = 0 ifTrue:
+ [^self primitiveFailFor: PrimErrNoMemory]].
+ self pop: 1 thenPush: newCopy! !
+!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'!
+primitiveContextAt
+ | index value aContext spouseFP hdr fmt totalLength fixedFields stSize |
+ <var: #spouseFP type: #'char *'>
+ index := self stackTop.
+ (objectMemory isIntegerObject: index) ifFalse:
+ [^self primitiveFail].
+ index := objectMemory integerValueOf: index.
+ aContext := self stackValue: 1.
+ "Duplicating much of stObject:at:put: here allows stObject:at:put: to omit tests for contexts."
+ hdr := objectMemory baseHeader: aContext.
+ (objectMemory isContextHeader: hdr) ifFalse: "might be an instance of a subclass"
+ [value := self stObject: aContext at: index.
+ ^self pop: 2 thenPush: value].
+ self externalWriteBackHeadFramePointers.
+ (self isStillMarriedContext: aContext) ifFalse:
+ [fmt := objectMemory formatOfHeader: hdr.
+ totalLength := objectMemory lengthOf: aContext baseHeader: hdr format: fmt.
+ fixedFields := objectMemory fixedFieldsOf: aContext format: fmt length: totalLength.
+ stSize := self stackPointerForMaybeMarriedContext: aContext.
+ (index between: 1 and: stSize) ifFalse:
+ [^self primitiveFail].
+ value := self subscript: aContext with: (index + fixedFields) format: fmt.
+ ^self pop: 2 thenPush: value].
+ spouseFP := self frameOfMarriedContext: aContext.
+ (index between: 1 and: (self stackPointerIndexForFrame: spouseFP)) ifFalse:
+ [^self primitiveFail].
+ value := self temporary: index - 1 in: spouseFP.
+ self pop: 2 thenPush: value! !
+!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'!
+primitiveContextAtPut
+ | index value aContext spouseFP hdr fmt totalLength fixedFields stSize |
+ <var: #spouseFP type: #'char *'>
+ value := self stackTop.
+ index := self stackValue: 1.
+ aContext := self stackValue: 2.
+ (objectMemory isIntegerObject: index) ifFalse:
+ [^self primitiveFail].
+ "Duplicating much of stObject:at:put: here allows stObject:at:put: to omit tests for contexts."
+ hdr := objectMemory baseHeader: aContext.
+ index := objectMemory integerValueOf: index.
+ (objectMemory isContextHeader: hdr) ifFalse: "might be an instance of a subclass"
+ [self stObject: aContext at: index put: value.
+ ^self pop: 3 thenPush: value].
+ self externalWriteBackHeadFramePointers.
+ (self isStillMarriedContext: aContext) ifFalse:
+ [fmt := objectMemory formatOfHeader: hdr.
+ totalLength := objectMemory lengthOf: aContext baseHeader: hdr format: fmt.
+ fixedFields := objectMemory fixedFieldsOf: aContext format: fmt length: totalLength.
+ stSize := self stackPointerForMaybeMarriedContext: aContext.
+ (index between: 1 and: stSize) ifFalse:
+ [^self primitiveFail].
+ self subscript: aContext with: (index + fixedFields) storing: value format: fmt.
+ ^self pop: 3 thenPush: value].
+ spouseFP := self frameOfMarriedContext: aContext.
+ (index between: 1 and: (self stackPointerIndexForFrame: spouseFP)) ifFalse:
+ [^self primitiveFail].
+ self temporary: index - 1 in: spouseFP put: value.
+ ^self pop: 3 thenPush: value! !
+!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'!
+primitiveContextSize
+ | rcvr sz hdr fmt totalLength fixedFields |
+ rcvr := self stackTop.
+ hdr := objectMemory baseHeader: rcvr.
+ fmt := objectMemory formatOfHeader: hdr.
+ totalLength := objectMemory lengthOf: rcvr baseHeader: hdr format: fmt.
+ fixedFields := objectMemory fixedFieldsOf: rcvr format: fmt length: totalLength.
+ (objectMemory isContextHeader: hdr)
+ ifTrue:
+ [self externalWriteBackHeadFramePointers.
+ sz := self stackPointerForMaybeMarriedContext: rcvr]
+ ifFalse: [sz := totalLength - fixedFields].
+ self successful ifTrue:
+ [self pop: 1 thenPush: (objectMemory integerObjectOf: sz)]! !
+!StackInterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:04'!
+primitiveCopyObject
+ "Primitive. Copy the state of the receiver from the argument.
+ Fail if receiver and argument are of a different class.
+ Fail if the receiver or argument are non-pointer objects.
+ Fail if the receiver or argument are contexts (because of context-to-stack mapping).
+ Fail if receiver and argument have different lengths (for indexable objects).
+ "
+ | rcvr arg length |
+ self methodArgumentCount = 1 ifFalse:
+ [^self primitiveFail].
+ arg := self stackObjectValue: 0.
+ rcvr := self stackObjectValue: 1.
+
+ self failed ifTrue:[^nil].
+ (objectMemory isPointers: rcvr) ifFalse:
+ [^self primitiveFail].
+ ((self isContextNonInt: rcvr)
+ or: [self isContextNonInt: arg]) ifTrue:
+ [^self primitiveFail].
+ (objectMemory fetchClassOfNonInt: rcvr) = (objectMemory fetchClassOfNonInt: arg) ifFalse:
+ [^self primitiveFail].
+ length := objectMemory lengthOf: rcvr.
+ length = (objectMemory lengthOf: arg) ifFalse:
+ [^self primitiveFail].
+
+ "Now copy the elements"
+ 0 to: length-1 do:[:i|
+ objectMemory storePointer: i ofObject: rcvr withValue: (objectMemory fetchPointer: i ofObject: arg)].
+
+ "Note: The above could be faster for young receivers but I don't think it'll matter"
+ self pop: 1. "pop arg; answer receiver"
+! !
+
+"VMMaker"!
+
+----QUIT----{26 April 2011 . 12:13:26 pm} VMMaker-Squeak4.1.image priorSource: 7348282!
\ No newline at end of file

Modified: branches/Cog/image/VMMaker-Squeak4.1.image
===================================================================
(Binary files differ)

Modified: branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c
===================================================================
--- branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c 2011-04-26 19:24:15 UTC (rev 2379)
@@ -1,137 +1,751 @@
-/*
- *  sqUnixLocale.c
- *     SqueakLocale stubs for Unix, so we can have the timezone.
+/* sqUnixLocale.c -- support for POSIX locales
+ *
+ *   Copyright (C) 1996-2005 by Ian Piumarta and other authors/contributors
+ *                              listed elsewhere in this file.
+ *   All rights reserved.
+ *  
+ *   This file is part of Unix Squeak.
+ *
+ *   Permission is hereby granted, free of charge, to any person obtaining a copy
+ *   of this software and associated documentation files (the "Software"), to deal
+ *   in the Software without restriction, including without limitation the rights
+ *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *   copies of the Software, and to permit persons to whom the Software is
+ *   furnished to do so, subject to the following conditions:
+ *
+ *   The above copyright notice and this permission notice shall be included in
+ *   all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ *   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ *   SOFTWARE.
  */
 
-#include "sqUnixLocale.h"
+/* Author: [hidden email]
+ *
+ * Last edited: 2008-11-10 13:25:18 by piumarta on ubuntu.piumarta.com
+ */
 
-sqInt sqLocInitialize(void) {
- return 1;
+#include "sq.h"
+#include "LocalePlugin.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/time.h>
+#include <locale.h>
+#include <langinfo.h>
+
+
+#define CODELEN 2 /* 2 for ISO two-letter codes, 3 for UN three-letter codes */
+
+
+#define DEFAULT_LOCALE "en_US.ISO8859-1"
+
+#if (CODELEN == 2)
+#  define DEFAULT_COUNTRY "US"
+#  define DEFAULT_LANGUAGE "en"
+#elif (CODELEN == 3)
+#  define DEFAULT_COUNTRY "USA"
+#  define DEFAULT_LANGUAGE "eng"
+#else
+#  error -- CODELEN must be 2 or 3
+#endif
+
+
+static const char *localeString= 0;
+static struct lconv *localeConv= 0;
+
+
+/*** SUNDRY STUPIDITY ***/
+
+
+#if (CODELEN == 3)
+
+static struct CountryCode
+{
+  const char *iso, *un;
 }
+countryCodes[] = {
+  /* ISO   UN   COUNTRY */
+  { "AD", "AND" }, /* Andorra */
+  { "AE", "ARE" }, /* United Arab Emirates */
+  { "AF", "AFG" }, /* Afghanistan */
+  { "AG", "ATG" }, /* Antigua and Barbuda */
+  { "AI", "AIA" }, /* Anguilla */
+  { "AL", "ALB" }, /* Albania */
+  { "AM", "ARM" }, /* Armenia */
+  { "AN", "ANT" }, /* Netherlands Antilles */
+  { "AO", "AGO" }, /* Angola */
+  { "AQ", "ATA" }, /* Antarctica */
+  { "AR", "ARG" }, /* Argentina */
+  { "AS", "ASM" }, /* American Samoa */
+  { "AT", "AUT" }, /* Austria */
+  { "AU", "AUS" }, /* Australia */
+  { "AW", "ABW" }, /* Aruba */
+  { "AX", "ALA" }, /* Aland Islands */
+  { "AZ", "AZE" }, /* Azerbaijan */
+  { "BA", "BIH" }, /* Bosnia and Herzegovina */
+  { "BB", "BRB" }, /* Barbados */
+  { "BD", "BGD" }, /* Bangladesh */
+  { "BE", "BEL" }, /* Belgium */
+  { "BF", "BFA" }, /* Burkina Faso */
+  { "BG", "BGR" }, /* Bulgaria */
+  { "BH", "BHR" }, /* Bahrain */
+  { "BI", "BDI" }, /* Burundi */
+  { "BJ", "BEN" }, /* Benin */
+  { "BM", "BMU" }, /* Bermuda */
+  { "BN", "BRN" }, /* Brunei Darussalam */
+  { "BO", "BOL" }, /* Bolivia */
+  { "BR", "BRA" }, /* Brazil */
+  { "BS", "BHS" }, /* Bahamas */
+  { "BT", "BTN" }, /* Bhutan */
+  { "BV", "BVT" }, /* Bouvet Island */
+  { "BW", "BWA" }, /* Botswana */
+  { "BY", "BLR" }, /* Belarus */
+  { "BZ", "BLZ" }, /* Belize */
+  { "CA", "CAN" }, /* Canada */
+  { "CC", "CCK" }, /* Cocos (Keeling) Islands */
+  { "CD", "COD" }, /* Congo, Democratic Republic of the */
+  { "CF", "CAF" }, /* Central African Republic */
+  { "CG", "COG" }, /* Congo, Republic of the */
+  { "CH", "CHE" }, /* Switzerland */
+  { "CI", "CIV" }, /* Cote D'Ivoire */
+  { "CK", "COK" }, /* Cook Islands */
+  { "CL", "CHL" }, /* Chile */
+  { "CM", "CMR" }, /* Cameroon */
+  { "CN", "CHN" }, /* China */
+  { "CO", "COL" }, /* Colombia */
+  { "CR", "CRI" }, /* Costa Rica */
+  { "CS", "SCG" }, /* Serbia and Montenegro */
+  { "CU", "CUB" }, /* Cuba */
+  { "CV", "CPV" }, /* Cape Verde */
+  { "CX", "CXR" }, /* Christmas Island */
+  { "CY", "CYP" }, /* Cyprus */
+  { "CZ", "CZE" }, /* Czech Republic */
+  { "DE", "DEU" }, /* Germany */
+  { "DJ", "DJI" }, /* Djibouti */
+  { "DK", "DNK" }, /* Denmark */
+  { "DM", "DMA" }, /* Dominica */
+  { "DO", "DOM" }, /* Dominican Republic */
+  { "DZ", "DZA" }, /* Algeria */
+  { "EC", "ECU" }, /* Ecuador */
+  { "EE", "EST" }, /* Estonia */
+  { "EG", "EGY" }, /* Egypt */
+  { "EH", "ESH" }, /* Western Sahara */
+  { "ER", "ERI" }, /* Eritrea */
+  { "ES", "ESP" }, /* Spain */
+  { "ET", "ETH" }, /* Ethiopia */
+  { "FI", "FIN" }, /* Finland */
+  { "FJ", "FJI" }, /* Fiji */
+  { "FK", "FLK" }, /* Falkland Islands (Islas Malvinas) */
+  { "FM", "FSM" }, /* Micronesia, Federated States of */
+  { "FO", "FRO" }, /* Faroe Islands */
+  { "FR", "FRA" }, /* France */
+  { "FX", "FXX" }, /* France, Metropolitan */
+  { "GA", "GAB" }, /* Gabon */
+  { "GB", "GBR" }, /* United Kingdom */
+  { "GD", "GRD" }, /* Grenada */
+  { "GE", "GEO" }, /* Georgia */
+  { "GF", "GUF" }, /* French Guiana */
+  { "GH", "GHA" }, /* Ghana */
+  { "GI", "GIB" }, /* Gibraltar */
+  { "GL", "GRL" }, /* Greenland */
+  { "GM", "GMB" }, /* Gambia */
+  { "GN", "GIN" }, /* Guinea */
+  { "GP", "GLP" }, /* Guadeloupe */
+  { "GQ", "GNQ" }, /* Equatorial Guinea */
+  { "GR", "GRC" }, /* Greece */
+  { "GS", "SGS" }, /* South Georgia and the South Sandwich Islands */
+  { "GT", "GTM" }, /* Guatemala */
+  { "GU", "GUM" }, /* Guam */
+  { "GW", "GNB" }, /* Guinea-Bissau */
+  { "GY", "GUY" }, /* Guyana */
+  { "HK", "HKG" }, /* Hong Kong */
+  { "HM", "HMD" }, /* Heard Island and McDonald Islands */
+  { "HN", "HND" }, /* Honduras */
+  { "HR", "HRV" }, /* Croatia */
+  { "HT", "HTI" }, /* Haiti */
+  { "HU", "HUN" }, /* Hungary */
+  { "ID", "IDN" }, /* Indonesia */
+  { "IE", "IRL" }, /* Ireland */
+  { "IL", "ISR" }, /* Israel */
+  { "IN", "IND" }, /* India */
+  { "IO", "IOT" }, /* British Indian Ocean Territory */
+  { "IQ", "IRQ" }, /* Iraq */
+  { "IR", "IRN" }, /* Iran */
+  { "IS", "ISL" }, /* Iceland */
+  { "IT", "ITA" }, /* Italy */
+  { "JM", "JAM" }, /* Jamaica */
+  { "JO", "JOR" }, /* Jordan */
+  { "JP", "JPN" }, /* Japan */
+  { "KE", "KEN" }, /* Kenya */
+  { "KG", "KGZ" }, /* Kyrgyzstan */
+  { "KH", "KHM" }, /* Cambodia */
+  { "KI", "KIR" }, /* Kiribati */
+  { "KM", "COM" }, /* Comoros */
+  { "KN", "KNA" }, /* Saint Kitts and Nevis */
+  { "KP", "PRK" }, /* North Korea */
+  { "KR", "KOR" }, /* South Korea */
+  { "KW", "KWT" }, /* Kuwait */
+  { "KY", "CYM" }, /* Cayman Islands */
+  { "KZ", "KAZ" }, /* Kazakstan */
+  { "LA", "LAO" }, /* Lao People's Democratic Republic */
+  { "LB", "LBN" }, /* Lebanon */
+  { "LC", "LCA" }, /* Saint Lucia */
+  { "LI", "LIE" }, /* Liechtenstein */
+  { "LK", "LKA" }, /* Sri Lanka */
+  { "LR", "LBR" }, /* Liberia */
+  { "LS", "LSO" }, /* Lesotho */
+  { "LT", "LTU" }, /* Lithuania */
+  { "LU", "LUX" }, /* Luxembourg */
+  { "LV", "LVA" }, /* Latvia */
+  { "LY", "LBY" }, /* Libya */
+  { "MA", "MAR" }, /* Morocco */
+  { "MC", "MCO" }, /* Monaco */
+  { "MD", "MDA" }, /* Moldova */
+  { "MG", "MDG" }, /* Madagascar */
+  { "MH", "MHL" }, /* Marshall Islands */
+  { "MK", "MKD" }, /* Macedonia */
+  { "ML", "MLI" }, /* Mali */
+  { "MM", "MMR" }, /* Burma */
+  { "MN", "MNG" }, /* Mongolia */
+  { "MO", "MAC" }, /* Macau */
+  { "MP", "MNP" }, /* Northern Mariana Islands */
+  { "MQ", "MTQ" }, /* Martinique */
+  { "MR", "MRT" }, /* Mauritania */
+  { "MS", "MSR" }, /* Montserrat */
+  { "MT", "MLT" }, /* Malta */
+  { "MU", "MUS" }, /* Mauritius */
+  { "MV", "MDV" }, /* Maldives */
+  { "MW", "MWI" }, /* Malawi */
+  { "MX", "MEX" }, /* Mexico */
+  { "MY", "MYS" }, /* Malaysia */
+  { "MZ", "MOZ" }, /* Mozambique */
+  { "NA", "NAM" }, /* Namibia */
+  { "NC", "NCL" }, /* New Caledonia */
+  { "NE", "NER" }, /* Niger */
+  { "NF", "NFK" }, /* Norfolk Island */
+  { "NG", "NGA" }, /* Nigeria */
+  { "NI", "NIC" }, /* Nicaragua */
+  { "NL", "NLD" }, /* Netherlands */
+  { "NO", "NOR" }, /* Norway */
+  { "NP", "NPL" }, /* Nepal */
+  { "NR", "NRU" }, /* Nauru */
+  { "NU", "NIU" }, /* Niue */
+  { "NZ", "NZL" }, /* New Zealand */
+  { "OM", "OMN" }, /* Oman */
+  { "PA", "PAN" }, /* Panama */
+  { "PE", "PER" }, /* Peru */
+  { "PF", "PYF" }, /* French Polynesia */
+  { "PG", "PNG" }, /* Papua New Guinea */
+  { "PH", "PHL" }, /* Philippines */
+  { "PK", "PAK" }, /* Pakistan */
+  { "PL", "POL" }, /* Poland */
+  { "PM", "SPM" }, /* Saint Pierre and Miquelon */
+  { "PN", "PCN" }, /* Pitcairn Island */
+  { "PR", "PRI" }, /* Puerto Rico */
+  { "PS", "PSE" }, /* Palestinian Territory, Occupied */
+  { "PT", "PRT" }, /* Portugal */
+  { "PW", "PLW" }, /* Palau */
+  { "PY", "PRY" }, /* Paraguay */
+  { "QA", "QAT" }, /* Qatar */
+  { "RE", "REU" }, /* Reunion */
+  { "RO", "ROU" }, /* Romania */
+  { "RU", "RUS" }, /* Russia */
+  { "RW", "RWA" }, /* Rwanda */
+  { "SA", "SAU" }, /* Saudi Arabia */
+  { "SB", "SLB" }, /* Solomon Islands */
+  { "SC", "SYC" }, /* Seychelles */
+  { "SD", "SDN" }, /* Sudan */
+  { "SE", "SWE" }, /* Sweden */
+  { "SG", "SGP" }, /* Singapore */
+  { "SH", "SHN" }, /* Saint Helena */
+  { "SI", "SVN" }, /* Slovenia */
+  { "SJ", "SJM" }, /* Svalbard */
+  { "SK", "SVK" }, /* Slovakia */
+  { "SL", "SLE" }, /* Sierra Leone */
+  { "SM", "SMR" }, /* San Marino */
+  { "SN", "SEN" }, /* Senegal */
+  { "SO", "SOM" }, /* Somalia */
+  { "SR", "SUR" }, /* Suriname */
+  { "ST", "STP" }, /* Sao Tome and Principe */
+  { "SV", "SLV" }, /* El Salvador */
+  { "SY", "SYR" }, /* Syria */
+  { "SZ", "SWZ" }, /* Swaziland */
+  { "TC", "TCA" }, /* Turks and Caicos Islands */
+  { "TD", "TCD" }, /* Chad */
+  { "TF", "ATF" }, /* French Southern and Antarctic Lands */
+  { "TG", "TGO" }, /* Togo */
+  { "TH", "THA" }, /* Thailand */
+  { "TJ", "TJK" }, /* Tajikistan */
+  { "TK", "TKL" }, /* Tokelau */
+  { "TM", "TKM" }, /* Turkmenistan */
+  { "TN", "TUN" }, /* Tunisia */
+  { "TO", "TON" }, /* Tonga */
+  { "TL", "TLS" }, /* East Timor */
+  { "TR", "TUR" }, /* Turkey */
+  { "TT", "TTO" }, /* Trinidad and Tobago */
+  { "TV", "TUV" }, /* Tuvalu */
+  { "TW", "TWN" }, /* Taiwan */
+  { "TZ", "TZA" }, /* Tanzania */
+  { "UA", "UKR" }, /* Ukraine */
+  { "UG", "UGA" }, /* Uganda */
+  { "UM", "UMI" }, /* United States Minor Outlying Islands */
+  { "US", "USA" }, /* United States of America */
+  { "UY", "URY" }, /* Uruguay */
+  { "UZ", "UZB" }, /* Uzbekistan */
+  { "VA", "VAT" }, /* Holy See (Vatican City) */
+  { "VC", "VCT" }, /* Saint Vincent and the Grenadines */
+  { "VE", "VEN" }, /* Venezuela */
+  { "VG", "VGB" }, /* British Virgin Islands */
+  { "VI", "VIR" }, /* Virgin Islands, U.S. */
+  { "VN", "VNM" }, /* Vietnam */
+  { "VU", "VUT" }, /* Vanuatu */
+  { "WF", "WLF" }, /* Wallis and Futuna */
+  { "WS", "WSM" }, /* Samoa */
+  { "YE", "YEM" }, /* Yemen */
+  { "YT", "MYT" }, /* Mayotte */
+  { "ZA", "ZAF" }, /* South Africa */
+  { "ZM", "ZMB" }, /* Zambia */
+  { "ZW", "ZWE" }, /* Zimbabwe */
+  { 0, 0 }
+};
 
-/************** Country and language ******************/
+static struct LanguageCode
+{
+  const char *iso, *un;
+}
+languageCodes[] = {
+  /* ISO   UN   LANGUAGE */
+  { "ab", "abk" }, /* Abkhazian */
+  { "aa", "aar" }, /* Afar */
+  { "af", "afr" }, /* Afrikaans */
+  { "sq", "alb" },      /* Albanian */
+  { "sq", "sqi" },      /* Albanian */
+  { "am", "amh" },      /* Amharic */
+  { "ar", "ara" },      /* Arabic */
+  { "hy", "arm" },      /* Armenian */
+  { "hy", "hye" },      /* Armenian */
+  { "as", "asm" },      /* Assamese */
+  { "ay", "aym" },      /* Aymara */
+  { "az", "aze" },      /* Azerbaijani */
+  { "ba", "bak" },      /* Bashkir */
+  { "eu", "baq" },      /* Basque */
+  { "eu", "eus" },      /* Basque */
+  { "bn", "ben" },      /* Bengali */
+  { "bh", "bih" },      /* Bihari */
+  { "bi", "bis" },      /* Bislama */
+  { "be", "bre" },      /* Breton */
+  { "bg", "bul" },      /* Bulgarian */
+  { "my", "bur" },      /* Burmese */
+  { "my", "mya" },      /* Burmese */
+  { "be", "bel" },      /* Byelorussian */
+  { "ca", "cat" },      /* Catalan */
+  { "zh", "chi" },      /* Chinese */
+  { "zh", "zho" },      /* Chinese */
+  { "co", "cos" },      /* Corsican */
+  { "cs", "ces" },      /* Czech */
+  { "cs", "cze" },      /* Czech */
+  { "da", "dan" },      /* Danish */
+  { "nl", "dut" },      /* Dutch */
+  { "nl", "nla" },      /* Dutch */
+  { "dz", "dzo" },      /* Dzongkha */
+  { "en", "eng" },      /* English */
+  { "eo", "epo" },      /* Esperanto */
+  { "et", "est" },      /* Estonian */
+  { "fo", "fao" },      /* Faroese */
+  { "fj", "fij" },      /* Fijian */
+  { "fi", "fin" },      /* Finnish */
+  { "fr", "fra" },      /* French */
+  { "fr", "fre" },      /* French */
+  { "fy", "fry" },      /* Frisian */
+  { "gl", "glg" },      /* Gallegan */
+  { "ka", "geo" },      /* Georgian */
+  { "ka", "kat" },      /* Georgian */
+  { "de", "deu" },      /* German */
+  { "de", "ger" },      /* German */
+  { "el", "ell" },      /* Greek, Modern (1453-) */
+  { "el", "gre" },      /* Greek, Modern (1453-) */
+  { "kl", "kal" },      /* Greenlandic */
+  { "gn", "grn" },      /* Guarani */
+  { "gu", "guj" },      /* Gujarati */
+  { "ha", "hau" },      /* Hausa */
+  { "he", "heb" },      /* Hebrew */
+  { "hi", "hin" },      /* Hindi */
+  { "hu", "hun" },      /* Hungarian */
+  { "is", "ice" },      /* Icelandic */
+  { "is", "isl" },      /* Icelandic */
+  { "id", "ind" },      /* Indonesian */
+  { "ia", "ina" },      /* Interlingua (International Auxiliary language Association) */
+  { "iu", "iku" },      /* Inuktitut */
+  { "ik", "ipk" },      /* Inupiak */
+  { "ga", "gai" },      /* Irish */
+  { "ga", "iri" },      /* Irish */
+  { "it", "ita" },      /* Italian */
+  { "ja", "jpn" },      /* Japanese */
+  { "jv", "jav" },      /* Javanese */
+  { "jw", "jaw" },      /* Javanese */
+  { "kn", "kan" },      /* Kannada */
+  { "ks", "kas" },      /* Kashmiri */
+  { "kk", "kaz" },      /* Kazakh */
+  { "km", "khm" },      /* Khmer */
+  { "rw", "kin" },      /* Kinyarwanda */
+  { "ky", "kir" },      /* Kirghiz */
+  { "ko", "kor" },      /* Korean */
+  { "ku", "kur" },      /* Kurdish */
+  { "oc", "oci" },      /* Langue d'Oc (post 1500) */
+  { "lo", "lao" },      /* Lao */
+  { "la", "lat" },      /* Latin */
+  { "lv", "lav" },      /* Latvian */
+  { "ln", "lin" },      /* Lingala */
+  { "lt", "lit" },      /* Lithuanian */
+  { "mk", "mac" },      /* Macedonian */
+  { "mk", "mak" },      /* Macedonian */
+  { "mg", "mlg" },      /* Malagasy */
+  { "ms", "may" },      /* Malay */
+  { "ms", "msa" },      /* Malay */
+  { "ml", "mlt" },      /* Maltese */
+  { "mi", "mao" },      /* Maori */
+  { "mi", "mri" },      /* Maori */
+  { "mr", "mar" },      /* Marathi */
+  { "mo", "mol" },      /* Moldavian */
+  { "mn", "mon" },      /* Mongolian */
+  { "na", "nau" },      /* Nauru */
+  { "ne", "nep" },      /* Nepali */
+  { "no", "nor" },      /* Norwegian */
+  { "or", "ori" },      /* Oriya */
+  { "om", "orm" },      /* Oromo */
+  { "pa", "pan" },      /* Panjabi */
+  { "fa", "fas" },      /* Persian */
+  { "fa", "per" },      /* Persian */
+  { "pl", "pol" },      /* Polish */
+  { "pt", "por" },      /* Portuguese */
+  { "ps", "pus" },      /* Pushto */
+  { "qu", "que" },      /* Quechua */
+  { "rm", "roh" },      /* Rhaeto-Romance */
+  { "ro", "ron" },      /* Romanian */
+  { "ro", "rum" },      /* Romanian */
+  { "rn", "run" },      /* Rundi */
+  { "ru", "rus" },      /* Russian */
+  { "sm", "smo" },      /* Samoan */
+  { "sg", "sag" },      /* Sango */
+  { "sa", "san" },      /* Sanskrit */
+  { "sh", "scr" },      /* Serbo-Croatian */
+  { "sn", "sna" },      /* Shona */
+  { "sd", "snd" },      /* Sindhi */
+  { "si", "sin" },      /* Singhalese */
+  { "ss", "ssw" },      /* Siswant */
+  { "sk", "slk" },      /* Slovak */
+  { "sk", "slo" },      /* Slovak */
+  { "sl", "slv" },      /* Slovenian */
+  { "so", "som" },      /* Somali */
+  { "st", "sot" },      /* Sotho, Southern */
+  { "es", "esl" },      /* Spanish */
+  { "es", "spa" },      /* Spanish */
+  { "su", "sun" },      /* Sudanese */
+  { "sw", "swa" },      /* Swahili */
+  { "sv", "sve" },      /* Swedish */
+  { "sv", "swe" },      /* Swedish */
+  { "tl", "tgl" },      /* Tagalog */
+  { "tg", "tgk" },      /* Tajik */
+  { "ta", "tam" },      /* Tamil */
+  { "tt", "tat" },      /* Tatar */
+  { "te", "tel" },      /* Telugu */
+  { "th", "tha" },      /* Thai */
+  { "bo", "bod" },      /* Tibetan */
+  { "bo", "tib" },      /* Tibetan */
+  { "ti", "tir" },      /* Tigrinya */
+  { "to", "tog" },      /* Tonga (Nyasa) */
+  { "ts", "tso" },      /* Tsonga */
+  { "tn", "tsn" },      /* Tswana */
+  { "tr", "tur" },      /* Turkish */
+  { "tk", "tuk" },      /* Turkmen */
+  { "tw", "twi" },      /* Twi */
+  { "ug", "uig" },      /* Uighur */
+  { "uk", "ukr" },      /* Ukrainian */
+  { "ur", "urd" },      /* Urdu */
+  { "uz", "uzb" },      /* Uzbek */
+  { "vi", "vie" },      /* Vietnamese */
+  { "vo", "vol" },      /* Volap�k */
+  { "cy", "cym" },      /* Welsh */
+  { "cy", "wel" },      /* Welsh */
+  { "wo", "wol" },      /* Wolof */
+  { "xh", "xho" },      /* Xhosa */
+  { "yi", "yid" },      /* Yiddish */
+  { "yo", "yor" },      /* Yoruba */
+  { "za", "zha" },      /* Zhuang */
+  { "zu", "zul" },      /* Zulu */
+  { 0, 0 }
+};
+  
+#endif /* CODELEN == 3 */
 
-/* write the country code into the string ptr. ISO 3166 is the relevant source
- * here; see http://www.unicode.org/onlinedat/countries.html for details.
- * Using the 3 character Alpha-3 codes */
-void sqLocGetCountryInto(char * str) {
- str[0]=0;
- str[1]=0;
- str[2]=0;
+
+/* Answer a canonical, sanitised locale string.
+ */
+static const char *getlocale(void)
+{
+  const char *locale= 0;
+
+  /* Use LC_ALL or LANG or current OS locale or some suitable default,
+     in that order.  Convert "C" and POSIX locales to the default,
+     along with anything else that seems malformed. */
+
+  if ((   !(locale= getenv("LC_ALL")))
+      && (!(locale= getenv("LANG")))
+      && (!(locale= setlocale(LC_ALL, 0))))
+    return DEFAULT_LOCALE;
+  else if ((!strcmp(locale, "C")) || (!strcmp(locale, "POSIX"))
+   || strchr(locale, ' ') || strchr(locale, '/'))
+    return DEFAULT_LOCALE;
+
+  return locale;
 }
 
-/* write the 3 char string describing the language in use into string ptr.
- * ISO 639 is the relevant source here;
- * see http://www.w3.org/WAI/ER/IG/ert/iso639.html
- * for details */
-void sqLocGetLanguageInto(char * str) {
- str[0]=0;
- str[1]=0;
- str[2]=0;
+
+/* Answer the 2- or 3-letter country code CC within one of:
+ * _CC
+ * _CC.PP
+ * ll_CC
+ * ll_CC.PP
+ */
+static const char *getCountry(void)
+{
+  static const char *country= 0;
+
+  if (!country)
+    {
+      static char buf[4]= { 0, 0, 0, 0 };
+      const char *l, *r;
+
+      if ((l= strrchr(localeString, '_')))
+ {
+  ++l;
+  if (!(r= strchr(l, '.'))) r= strchr(l, '\0');
+#        if (CODELEN == 2)
+  if (r - l == 2)
+    {
+      strncpy(buf, l, 2);
+      country= buf;
+    }
+#        else /* CODELEN == 3 */
+  if (r - l == 3)
+    {
+      strncpy(buf, l, 3);
+      country= buf;
+    }
+  else if (r - l == 2)
+    {
+      struct CountryCode *cc= countryCodes;
+      strncpy(buf, l, 2);
+      while ((!country) && cc->iso)
+ if (!strcasecmp(cc->iso, buf))
+  country= cc->un;
+ else
+  ++cc;
+    }
+#        endif /* CODELEN == 3 */
+ }
+
+      if (!country)
+ country= DEFAULT_COUNTRY;
+    }
+
+  return country;
 }
 
-/***************** Currency ********************/
 
-/* return 1 (true) if the currency symbol is to be placed in front of the
- *currency amount */
-sqInt sqLocCurrencyNotation(void) {
- return 1;
+/* Answer the 2- or 3-letter language code ll within one of:
+ * ll
+ * ll.PP
+ * ll_CC
+ * ll_CC.PP
+ */
+static const char *getLanguage(void)
+{
+  static const char *language= 0;
+
+  if (!language)
+    {
+      static char buf[4]= { 0, 0, 0, 0 };
+
+      if (isalpha(localeString[0]) && isalpha(localeString[1])
+  && ((localeString[2] == '.') || (localeString[2] == '_') || !localeString[2]))
+ {
+  strncpy(buf, localeString, 2);
+#        if (CODELEN == 2)
+  language= buf;
+#        elif (CODELEN == 3)
+  {
+    struct LanguageCode *lc= languageCodes;
+    while ((!language) && lc->iso)
+      if (!strcasecmp(lc->iso, buf))
+ language= lc->un;
+      else
+ ++lc;
+  }
+#        endif /* CODELEN == 3 */
+ }
+      if (!language)
+ language= DEFAULT_LANGUAGE;
+    }
+  return language;
 }
 
-/* return the length in chars of the curency symbol string */
-sqInt sqLocCurrencySymbolSize(void) {
- return 1;
+
+/* CURRENCY */
+
+/* Answer true if the currency symbol is to be placed in front of the
+ * currency value */
+sqInt sqLocCurrencyNotation(void)
+{
+  return localeConv->p_cs_precedes;
 }
-/* write the currency symbol into the string ptr */
-void sqLocGetCurrencySymbolInto(char * str) {
- strcpy(str, "$");
+
+/* Store the currency symbol into the given string.
+ */
+void sqLocGetCurrencySymbolInto(char *str)
+{
+  strcpy(str, localeConv->currency_symbol);
 }
 
+sqInt sqLocCurrencySymbolSize(void)
+{
+  return strlen(localeConv->currency_symbol);
+}
 
-/***************** Numbers and measurements **************/
 
-/* return true if the metric measurements system is to be used, false otherwise
- * (USA is about it) */
-sqInt sqLocMeasurementMetric(void) {
- return 1;
+
+/* NUMBERS AND MEASUREMENTS */
+
+
+/* Answer true if the metric measurements system is to be used.
+ */
+sqInt sqLocMeasurementMetric(void)
+{
+  return 1;
 }
 
-/* write the 1 char used for digit grouping into string ptr.
- * Usually this is . or ,  as in 1,000,000 */
-void sqLocGetDigitGroupingSymbolInto(char * str) {
- strncpy(str, ",", 1);
+
+/* Store the seperator for thousands into the given string.
+ */
+void sqLocGetDigitGroupingSymbolInto(char *str)
+{
+  strcpy(str, localeConv->thousands_sep);
 }
 
-/* write the 1 char used for decimal separation into string ptr.
- * Usually this is . or , */
-void sqLocGetDecimalSymbolInto(char * str) {
- strncpy(str, ".", 1);
+
+/* Store the decimal point into the given string.
+ */
+void sqLocGetDecimalSymbolInto(char *str)
+{
+  strcpy(str, localeConv->decimal_point);
 }
 
 
-/****************** time and date *********************/
+/* TIME AND DATE */
 
-sqInt sqLocGetVMOffsetToUTC(void) {
- /* return 0 for now */
- return 0;
+
+/* Answer the offset between local time and VM time.  (Despite the
+ * function name, this is how it is used.)
+ */
+sqInt sqLocGetVMOffsetToUTC(void)
+{
+  return 0;
 }
 
-sqInt sqLocGetTimezoneOffset(void) {
+/* Answer the offset to (number of minutes EAST of) GMT.
+ */
+sqInt sqLocGetTimezoneOffset(void)
+{
+  /* Match the behaviour of convertToSqueakTime(). */
+#ifdef HAVE_TM_GMTOFF
+  time_t now= time(0);
+  return localtime(&now)->tm_gmtoff / 60;
+#else
+# ifdef HAVE_TIMEZONE
+  extern long timezone;
+  extern int daylight;
+  return daylight * 60 - timezone / 60;
+# else
+#  error: cannot determine timezone correction
+# endif
+#endif
+}
 
- struct tm * timeBlock;
- time_t theTime;
- theTime = time((time_t)NULL);
- timeBlock = localtime(&theTime);
- return timeBlock->tm_gmtoff / 60;
+/* Answer true if DST is in use.
+ */
+sqInt sqLocDaylightSavings(void)
+{
+  time_t now= time(0);
+  return localtime(&now)->tm_isdst > 0;
 }
 
-/* return true if DST is in use, false otherwise */
-sqInt sqLocDaylightSavings(void) {
- struct tm * timeBlock;
- time_t theTime;
- theTime = time((time_t)NULL);
- timeBlock = localtime(&theTime);
- return timeBlock->tm_isdst;
+/* Answer the number of characters in the long date format.
+ */
+sqInt sqLocLongDateFormatSize(void)
+{
+  return strlen(nl_langinfo(D_FMT));
 }
 
-/* return the size in chars of the long date format string */
-sqInt sqLocLongDateFormatSize(void) {
- return 0;
+/* Store the long date format into the given string.
+*/
+void sqLocGetLongDateFormatInto(char *str)
+{
+  strcpy(str, nl_langinfo(D_FMT));
 }
 
-/*Write the string describing the long date formatting into string ptr.
- * Format is made up of
- * d day, m month, y year,
- * double symbol is null padded, single not padded (m=6, mm=06)
- * dddd weekday
- * mmmm month name */
-void sqLocGetLongDateFormatInto(char * str) {
- strcpy(str, "");
+/* Answer the number of characters in the short date format.
+ */
+sqInt sqLocShortDateFormatSize(void)
+{
+  return strlen(nl_langinfo(D_FMT));
 }
 
-/* return the size in chars of the short date format string */
-sqInt sqLocShortDateFormatSize(void) {
- return 0;
+/* Store the short date format into the given string.
+ */
+void sqLocGetShortDateFormatInto(char *str)
+{
+  strcpy(str, nl_langinfo(D_FMT));
 }
 
-/*Write the string describing the short date formatting into string ptr.
- * Format is made up of
- * d day, m month, y year,
- * double symbol is null padded, single not padded (m=6, mm=06)
- * dddd weekday
- * mmmm month name */
-void sqLocGetShortDateFormatInto(char * str) {
- strcpy(str, "");
+/* Answer the number of characters in the time format.
+ */
+sqInt sqLocTimeFormatSize(void)
+{
+  return strlen(nl_langinfo(T_FMT));
 }
 
-/* return the size in chars of the time format string */
-sqInt sqLocTimeFormatSize(void) {
- return 0;
+/* Store the time format into the given string.
+ */
+void sqLocGetTimeFormatInto(char *str)
+{
+  strcpy(str, nl_langinfo(T_FMT));
 }
-/* write the string describing the time formatting into string ptr.
- * Format is made up of
- * h hour (h 12, H 24), m minute, s seconds, x (am/pm String)
- * double symbol is null padded, single not padded (h=6, hh=06)  */
-void sqLocGetTimeFormatInto(char * str) {
- strcpy(str, "");
+
+
+sqInt sqLocInitialize(void)
+{
+  if (!(localeString= setlocale(LC_ALL, "")))
+    setlocale(LC_ALL, localeString= getlocale());
+  localeConv= localeconv();
+  return 1;
 }
+
+
+void sqLocGetCountryInto(char * str)
+{
+  strcpy(str, getCountry());
+}
+
+void sqLocGetLanguageInto(char * str)
+{
+  strcpy(str, getLanguage());
+}
+

Deleted: branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h
===================================================================
--- branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h 2011-04-26 19:24:15 UTC (rev 2379)
@@ -1,10 +0,0 @@
-/*
- *  sqUnixLocale.h
- *  SqueakLocale stubs
- */
-
-#include "sqMemoryAccess.h"
-#include <time.h>
-#include <locale.h>
-#include "sq.h"
-

Modified: branches/Cog/platforms/unix/vm/sqUnixVMProfile.c
===================================================================
--- branches/Cog/platforms/unix/vm/sqUnixVMProfile.c 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/platforms/unix/vm/sqUnixVMProfile.c 2011-04-26 19:24:15 UTC (rev 2379)
@@ -184,12 +184,16 @@
 static void
 histogramSIGPROFhandler(int sig, siginfo_t *info, ucontext_t *uap)
 {
-#if __APPLE__ && __MACH__ && __i386__
+#if __DARWIN_UNIX03 && __APPLE__ && __MACH__ && __i386__
+ pctype pc = uap->uc_mcontext->__ss.__eip;
+#elif __APPLE__ && __MACH__ && __i386__
  pctype pc = uap->uc_mcontext->ss.eip;
 #elif __APPLE__ && __MACH__ && __ppc__
  pctype pc = uap->uc_mcontext->ss.srr0;
 #elif __linux__ && __i386__
  pctype pc = uap->uc_mcontext.gregs[REG_EIP];
+#elif __FreeBSD__ && __i386__
+ pctype pc = uap->uc_mcontext.mc_eip;
 #else
 # error need to implement extracting pc from a ucontext_t on this system
 #endif
@@ -302,6 +306,8 @@
  pctype pc = uap->uc_mcontext->ss.srr0;
 #elif __linux__ && __i386__
  pctype pc = uap->uc_mcontext.gregs[REG_EIP];
+#elif __FreeBSD__ && __i386__
+ pctype pc = uap->uc_mcontext.mc_eip;
 #else
 # error need to implement extracting pc from a ucontext_t on this system
 #endif

Modified: branches/Cog/src/vm/cointerp.c
===================================================================
--- branches/Cog/src/vm/cointerp.c 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/src/vm/cointerp.c 2011-04-26 19:24:15 UTC (rev 2379)
@@ -1,9 +1,9 @@
 /* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b
    from
- CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7
+ CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b
  */
-static char __buildInfo[] = "CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -746,7 +746,7 @@
 EXPORT(sqInt) primitiveCompareBytes(void);
 static void primitiveConstantFill(void);
 static void primitiveContextAt(void);
-static void primitiveContextAtPut(void);
+static sqInt primitiveContextAtPut(void);
 static void primitiveContextSize(void);
 static void primitiveContextXray(void);
 static void primitiveControlVMProfiling(void);
@@ -1865,7 +1865,7 @@
  /* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.54]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.55]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 static volatile int sendTrace;
 
@@ -24225,21 +24225,82 @@
 }
 
 
-/* Return a shallow copy of the receiver. */
+/* Return a shallow copy of the receiver.
+ Special-case non-single contexts (because of context-to-stack mapping).
+ Can't fail for contexts cuz of image context instantiation code (sigh). */
 
 static void
 primitiveClone(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt cloned;
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+    sqInt i;
     sqInt newCopy;
+    sqInt receiver;
     char *sp;
+    sqInt sp1;
+    char *spouseFP;
+    sqInt value;
+    sqInt valuePointer;
+    sqInt valuePointer1;
 
- newCopy = clone(longAt(GIV(stackPointer)));
- if (newCopy == 0) {
- /* begin primitiveFail */
- if (GIV(primFailCode) == 0) {
- GIV(primFailCode) = 1;
+ receiver = longAt(GIV(stackPointer));
+ if ((receiver & 1)) {
+ newCopy = receiver;
+ }
+ else {
+ if (((((usqInt) (longAt(receiver))) >> 12) & 31) == ClassMethodContextCompactIndex) {
+ /* begin cloneContext: */
+ VM_LABEL(0cloneContext);
+ cloned = clone(receiver);
+ if (cloned != 0) {
+ for (i = 0; i <= StackPointerIndex; i += 1) {
+ /* begin storePointerUnchecked:ofObject:withValue: */
+ valuePointer = externalInstVarofContext(i, receiver);
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
+ }
+ for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+ }
+ if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+ && (!(isWidowedContext(receiver)))) {
+ /* begin frameOfMarriedContext: */
+ value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+ /* begin withoutSmallIntegerTags: */
+ assert((value & 1));
+ spouseFP = pointerForOop(value - 1);
+ sp1 = (stackPointerIndexForFrame(spouseFP)) - 1;
+ for (i = 0; i <= sp1; i += 1) {
+ /* begin storePointerUnchecked:ofObject:withValue: */
+ valuePointer1 = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
+ ? (i < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
+ ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs - i) * BytesPerWord))
+ : longAt(((spouseFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - i) * BytesPerWord)))
+ : (i < ((frameNumArgs1 = byteAt((spouseFP + FoxIFrameFlags) + 1)))
+ ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - i) * BytesPerWord))
+ : longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - i) * BytesPerWord))));
+ longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), valuePointer1);
+ }
+ }
+ else {
+ sp1 = (fetchStackPointerOf(receiver)) - 1;
+ for (i = 0; i <= sp1; i += 1) {
+ longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+ }
+ }
+ for (i = ((sp1 + CtxtTempFrameStart) + 1); i <= ((lengthOf(receiver)) - 1); i += 1) {
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj));
+ }
+ }
+ newCopy = cloned;
  }
- return;
+ else {
+ newCopy = clone(receiver);
+ }
+ if (newCopy == 0) {
+ GIV(primFailCode) = PrimErrNoMemory; return;
+ }
  }
  /* begin pop:thenPush: */
  longAtput(sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord), newCopy);
@@ -25333,7 +25394,7 @@
  GIV(stackPointer) = sp2;
 }
 
-static void
+static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt aContext;
@@ -25367,7 +25428,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  hdr = longAt(aContext);
  index = (index >> 1);
@@ -25376,7 +25437,7 @@
  /* begin pop:thenPush: */
  longAtput(sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp;
- return;
+ return null;
  }
  /* begin externalWriteBackHeadFramePointers */
  assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
@@ -25460,7 +25521,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  /* begin subscript:with:storing:format: */
  VM_LABEL(0subscriptwithstoringformat);
@@ -25514,7 +25575,7 @@
  /* begin pop:thenPush: */
  longAtput(sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp1;
- return;
+ return null;
  }
  /* begin frameOfMarriedContext: */
  value1 = longAt((aContext + BaseHeaderSize) + (SenderIndex << ShiftForWord));
@@ -25526,7 +25587,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  /* begin temporary:in:put: */
  VM_LABEL(0temporaryinput);
@@ -25549,7 +25610,7 @@
  /* begin pop:thenPush: */
  longAtput(sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp2;
- return;
+ return null;
 }
 
 static void
@@ -25775,10 +25836,12 @@
 
 
 /* Primitive. Copy the state of the receiver from the argument.
- Fail if receiver and argument are of a different class.
+ Fail if receiver and argument are of a different class.
  Fail if the receiver or argument are non-pointer objects.
- Fail if receiver and argument have different lengths (for indexable
- objects).  */
+ Fail if the receiver or argument are contexts (because of context-to-stack
+ mapping). Fail if receiver and argument have different lengths (for
+ indexable objects).
+ */
 
 static void
 primitiveCopyObject(void)
@@ -25834,13 +25897,21 @@
  }
  return;
  }
- if (!((fetchClassOf(rcvr)) == (fetchClassOf(arg)))) {
+ if ((((((usqInt) (longAt(rcvr))) >> 12) & 31) == ClassMethodContextCompactIndex)
+ || (((((usqInt) (longAt(arg))) >> 12) & 31) == ClassMethodContextCompactIndex)) {
  /* begin primitiveFail */
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
  return;
  }
+ if (!((fetchClassOfNonInt(rcvr)) == (fetchClassOfNonInt(arg)))) {
+ /* begin primitiveFail */
+ if (GIV(primFailCode) == 0) {
+ GIV(primFailCode) = 1;
+ }
+ return;
+ }
  /* begin lengthOf: */
  header = longAt(rcvr);
  /* begin lengthOf:baseHeader:format: */
@@ -25863,7 +25934,7 @@
  length = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
  goto l3;
  }
-l3: /* end lengthOf:baseHeader:format: */;
+l3: /* end lengthOf: */;
  if (!(length == (lengthOf(arg)))) {
  /* begin primitiveFail */
  if (GIV(primFailCode) == 0) {

Modified: branches/Cog/src/vm/cointerp.h
===================================================================
--- branches/Cog/src/vm/cointerp.h 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/src/vm/cointerp.h 2011-04-26 19:24:15 UTC (rev 2379)
@@ -1,5 +1,5 @@
 /* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b
  */
 
 

Modified: branches/Cog/src/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/src/vm/gcc3x-cointerp.c 2011-04-01 20:00:15 UTC (rev 2378)
+++ branches/Cog/src/vm/gcc3x-cointerp.c 2011-04-26 19:24:15 UTC (rev 2379)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b
    from
- CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7
+ CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b
  */
-static char __buildInfo[] = "CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -749,7 +749,7 @@
 EXPORT(sqInt) primitiveCompareBytes(void);
 static void primitiveConstantFill(void);
 static void primitiveContextAt(void);
-static void primitiveContextAtPut(void);
+static sqInt primitiveContextAtPut(void);
 static void primitiveContextSize(void);
 static void primitiveContextXray(void);
 static void primitiveControlVMProfiling(void);
@@ -1868,7 +1868,7 @@
  /* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.54]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.55]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 static volatile int sendTrace;
 
@@ -24229,21 +24229,82 @@
 }
 
 
-/* Return a shallow copy of the receiver. */
+/* Return a shallow copy of the receiver.
+ Special-case non-single contexts (because of context-to-stack mapping).
+ Can't fail for contexts cuz of image context instantiation code (sigh). */
 
 static void
 primitiveClone(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt cloned;
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+    sqInt i;
     sqInt newCopy;
+    sqInt receiver;
     char *sp;
+    sqInt sp1;
+    char *spouseFP;
+    sqInt value;
+    sqInt valuePointer;
+    sqInt valuePointer1;
 
- newCopy = clone(longAt(GIV(stackPointer)));
- if (newCopy == 0) {
- /* begin primitiveFail */
- if (GIV(primFailCode) == 0) {
- GIV(primFailCode) = 1;
+ receiver = longAt(GIV(stackPointer));
+ if ((receiver & 1)) {
+ newCopy = receiver;
+ }
+ else {
+ if (((((usqInt) (longAt(receiver))) >> 12) & 31) == ClassMethodContextCompactIndex) {
+ /* begin cloneContext: */
+ VM_LABEL(0cloneContext);
+ cloned = clone(receiver);
+ if (cloned != 0) {
+ for (i = 0; i <= StackPointerIndex; i += 1) {
+ /* begin storePointerUnchecked:ofObject:withValue: */
+ valuePointer = externalInstVarofContext(i, receiver);
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
+ }
+ for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+ }
+ if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+ && (!(isWidowedContext(receiver)))) {
+ /* begin frameOfMarriedContext: */
+ value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+ /* begin withoutSmallIntegerTags: */
+ assert((value & 1));
+ spouseFP = pointerForOop(value - 1);
+ sp1 = (stackPointerIndexForFrame(spouseFP)) - 1;
+ for (i = 0; i <= sp1; i += 1) {
+ /* begin storePointerUnchecked:ofObject:withValue: */
+ valuePointer1 = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
+ ? (i < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
+ ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs - i) * BytesPerWord))
+ : longAt(((spouseFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - i) * BytesPerWord)))
+ : (i < ((frameNumArgs1 = byteAt((spouseFP + FoxIFrameFlags) + 1)))
+ ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - i) * BytesPerWord))
+ : longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - i) * BytesPerWord))));
+ longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), valuePointer1);
+ }
+ }
+ else {
+ sp1 = (fetchStackPointerOf(receiver)) - 1;
+ for (i = 0; i <= sp1; i += 1) {
+ longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+ }
+ }
+ for (i = ((sp1 + CtxtTempFrameStart) + 1); i <= ((lengthOf(receiver)) - 1); i += 1) {
+ longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj));
+ }
+ }
+ newCopy = cloned;
  }
- return;
+ else {
+ newCopy = clone(receiver);
+ }
+ if (newCopy == 0) {
+ GIV(primFailCode) = PrimErrNoMemory; return;
+ }
  }
  /* begin pop:thenPush: */
  longAtput(sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord), newCopy);
@@ -25337,7 +25398,7 @@
  GIV(stackPointer) = sp2;
 }
 
-static void
+static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt aContext;
@@ -25371,7 +25432,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  hdr = longAt(aContext);
  index = (index >> 1);
@@ -25380,7 +25441,7 @@
  /* begin pop:thenPush: */
  longAtput(sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp;
- return;
+ return null;
  }
  /* begin externalWriteBackHeadFramePointers */
  assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
@@ -25464,7 +25525,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  /* begin subscript:with:storing:format: */
  VM_LABEL(0subscriptwithstoringformat);
@@ -25518,7 +25579,7 @@
  /* begin pop:thenPush: */
  longAtput(sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp1;
- return;
+ return null;
  }
  /* begin frameOfMarriedContext: */
  value1 = longAt((aContext + BaseHeaderSize) + (SenderIndex << ShiftForWord));
@@ -25530,7 +25591,7 @@
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
- return;
+ return null;
  }
  /* begin temporary:in:put: */
  VM_LABEL(0temporaryinput);
@@ -25553,7 +25614,7 @@
  /* begin pop:thenPush: */
  longAtput(sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value);
  GIV(stackPointer) = sp2;
- return;
+ return null;
 }
 
 static void
@@ -25779,10 +25840,12 @@
 
 
 /* Primitive. Copy the state of the receiver from the argument.
- Fail if receiver and argument are of a different class.
+ Fail if receiver and argument are of a different class.
  Fail if the receiver or argument are non-pointer objects.
- Fail if receiver and argument have different lengths (for indexable
- objects).  */
+ Fail if the receiver or argument are contexts (because of context-to-stack
+ mapping). Fail if receiver and argument have different lengths (for
+ indexable objects).
+ */
 
 static void
 primitiveCopyObject(void)
@@ -25838,13 +25901,21 @@
  }
  return;
  }
- if (!((fetchClassOf(rcvr)) == (fetchClassOf(arg)))) {
+ if ((((((usqInt) (longAt(rcvr))) >> 12) & 31) == ClassMethodContextCompactIndex)
+ || (((((usqInt) (longAt(arg))) >> 12) & 31) == ClassMethodContextCompactIndex)) {
  /* begin primitiveFail */
  if (GIV(primFailCode) == 0) {
  GIV(primFailCode) = 1;
  }
  return;
  }
+ if (!((fetchClassOfNonInt(rcvr)) == (fetchClassOfNonInt(arg)))) {
+ /* begin primitiveFail */
+ if (GIV(primFailCode) == 0) {
+ GIV(primFailCode) = 1;
+ }
+ return;
+ }
  /* begin lengthOf: */
  header = longAt(rcvr);
  /* begin lengthOf:baseHeader:format: */
@@ -25867,7 +25938,7 @@
  length = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
  goto l3;
  }
-l3: /* end lengthOf:baseHeader:format: */;
+l3: /* end lengthOf: */;
  if (!(length == (lengthOf(arg)))) {
  /* begin primitiveFail */
  if (GIV(primFailCode) == 0) {