00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _H_utility
00027 #define _H_utility
00028
00029 #ifdef LOCALE
00030 #undef LOCALE
00031 #endif
00032
00033 struct callFunctionItem
00034 {
00035 char *name;
00036 void (*func)(void *);
00037 int priority;
00038 struct callFunctionItem *next;
00039 short int environmentAware;
00040 void *context;
00041 };
00042
00043 struct trackedMemory
00044 {
00045 void *theMemory;
00046 struct trackedMemory *next;
00047 struct trackedMemory *prev;
00048 size_t memSize;
00049 };
00050
00051 #define UTILITY_DATA 55
00052
00053 struct utilityData
00054 {
00055 struct callFunctionItem *ListOfCleanupFunctions;
00056 struct callFunctionItem *ListOfPeriodicFunctions;
00057 short GarbageCollectionLocks;
00058 short GarbageCollectionHeuristicsEnabled;
00059 short PeriodicFunctionsEnabled;
00060 short YieldFunctionEnabled;
00061 long EphemeralItemCount;
00062 long EphemeralItemSize;
00063 long CurrentEphemeralCountMax;
00064 long CurrentEphemeralSizeMax;
00065 void (*YieldTimeFunction)(void);
00066 int LastEvaluationDepth ;
00067 struct trackedMemory *trackList;
00068 };
00069
00070 #define UtilityData(theEnv) ((struct utilityData *) GetEnvironmentData(theEnv,UTILITY_DATA))
00071
00072
00073 #define IsUTF8Start(ch) (((ch) & 0xC0) != 0x80)
00074 #define IsUTF8MultiByteStart(ch) ((((unsigned char) ch) >= 0xC0) && (((unsigned char) ch) <= 0xF7))
00075 #define IsUTF8MultiByteContinuation(ch) ((((unsigned char) ch) >= 0x80) && (((unsigned char) ch) <= 0xBF))
00076
00077 #ifdef _UTILITY_SOURCE_
00078 #define LOCALE
00079 #else
00080 #define LOCALE extern
00081 #endif
00082
00083 #define DecrementGCLocks() EnvDecrementGCLocks(GetCurrentEnvironment())
00084 #define IncrementGCLocks() EnvIncrementGCLocks(GetCurrentEnvironment())
00085 #define RemovePeriodicFunction(a) EnvRemovePeriodicFunction(GetCurrentEnvironment(),a)
00086
00087 LOCALE void InitializeUtilityData(void *);
00088 LOCALE void PeriodicCleanup(void *,intBool,intBool);
00089 LOCALE intBool AddCleanupFunction(void *,char *,void (*)(void *),int);
00090 LOCALE intBool EnvAddPeriodicFunction(void *,char *,void (*)(void *),int);
00091 LOCALE intBool AddPeriodicFunction(char *,void (*)(void),int);
00092 LOCALE intBool RemoveCleanupFunction(void *,char *);
00093 LOCALE intBool EnvRemovePeriodicFunction(void *,char *);
00094 LOCALE char *AppendStrings(void *,char *,char *);
00095 LOCALE char *StringPrintForm(void *,char *);
00096 LOCALE char *AppendToString(void *,char *,char *,size_t *,size_t *);
00097 LOCALE char *InsertInString(void *,char *,size_t,char *,size_t *,size_t *);
00098 LOCALE char *AppendNToString(void *,char *,char *,size_t,size_t *,size_t *);
00099 LOCALE char *EnlargeString(void *,size_t,char *,size_t *,size_t *);
00100 LOCALE char *ExpandStringWithChar(void *,int,char *,size_t *,size_t *,size_t);
00101 LOCALE struct callFunctionItem *AddFunctionToCallList(void *,char *,int,void (*)(void *),
00102 struct callFunctionItem *,intBool);
00103 LOCALE struct callFunctionItem *AddFunctionToCallListWithContext(void *,char *,int,void (*)(void *),
00104 struct callFunctionItem *,intBool,void *);
00105 LOCALE struct callFunctionItem *RemoveFunctionFromCallList(void *,char *,
00106 struct callFunctionItem *,
00107 int *);
00108 LOCALE void DeallocateCallList(void *,struct callFunctionItem *);
00109 LOCALE unsigned long ItemHashValue(void *,unsigned short,void *,unsigned long);
00110 LOCALE void YieldTime(void *);
00111 LOCALE short SetGarbageCollectionHeuristics(void *,short);
00112 LOCALE void EnvIncrementGCLocks(void *);
00113 LOCALE void EnvDecrementGCLocks(void *);
00114 LOCALE short EnablePeriodicFunctions(void *,short);
00115 LOCALE short EnableYieldFunction(void *,short);
00116 LOCALE struct trackedMemory *AddTrackedMemory(void *,void *,size_t);
00117 LOCALE void RemoveTrackedMemory(void *,struct trackedMemory *);
00118 LOCALE void UTF8Increment(char *,size_t *);
00119 LOCALE size_t UTF8Offset(char *,size_t);
00120 LOCALE size_t UTF8Length(char *);
00121 LOCALE size_t UTF8CharNum(char *,size_t);
00122
00123 #endif
00124
00125
00126
00127