Changeset 551 for trunk/dll/string.c
- Timestamp:
- Feb 28, 2007, 2:33:51 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/string.c
r333 r551 29 29 #pragma alloc_text(STRINGS,LoadStrings,GetPString) 30 30 31 static char **strs, *str;32 static ULONG 31 static char **strs, *str; 32 static ULONG numStr; 33 33 34 34 //== LoadStrings() load strings from file == 35 35 36 BOOL LoadStrings 36 BOOL LoadStrings(char *filename) 37 37 { 38 BOOL 39 ULONG size,len,totalsize;40 USHORT vermajor = 0,verminor = 0;38 BOOL ok = FALSE; 39 ULONG size, len, totalsize; 40 USHORT vermajor = 0, verminor = 0; 41 41 register char *p; 42 42 register ULONG x; 43 FILE 44 APIRET 43 FILE *fp; 44 APIRET rc; 45 45 46 46 /* Load strings from requested file or FM3RES.STR … … 52 52 filename = "FM3RES.STR"; 53 53 numStr = 0; 54 if (str)54 if (str) 55 55 DosFreeMem(str); 56 56 strs = NULL; 57 57 str = NULL; 58 58 59 fp = _fsopen(filename, "rb",SH_DENYWR);59 fp = _fsopen(filename, "rb", SH_DENYWR); 60 60 if (fp) { 61 if(fread(&numStr, 62 sizeof(numStr), 63 1, 64 fp) && 65 numStr == IDS_NUMSTRS && 66 fread(&len,sizeof(len),1,fp) && 67 fread(&vermajor,sizeof(vermajor),1,fp) && 68 fread(&verminor,sizeof(verminor),1,fp) && 69 (vermajor >= VERMAJORBREAK && 70 (vermajor > VERMAJORBREAK || 71 verminor >= VERMINORBREAK))) { 72 fseek(fp,0,SEEK_END); 61 if (fread(&numStr, 62 sizeof(numStr), 63 1, 64 fp) && 65 numStr == IDS_NUMSTRS && 66 fread(&len, sizeof(len), 1, fp) && 67 fread(&vermajor, sizeof(vermajor), 1, fp) && 68 fread(&verminor, sizeof(verminor), 1, fp) && 69 (vermajor >= VERMAJORBREAK && 70 (vermajor > VERMAJORBREAK || verminor >= VERMINORBREAK))) { 71 fseek(fp, 0, SEEK_END); 73 72 size = ftell(fp) - ((sizeof(ULONG) * 2) + (sizeof(USHORT) * 2)); 74 73 if (size && size == len) { 75 fseek(fp,(sizeof(ULONG) * 2) + (sizeof(USHORT) * 2),SEEK_SET);76 77 78 79 80 81 82 83 84 rc = DosAllocMem((PPVOID)&str,totalsize,85 74 fseek(fp, (sizeof(ULONG) * 2) + (sizeof(USHORT) * 2), SEEK_SET); 75 /* NOTE: Make one memory object for both str and strs 76 * for efficiency. 77 */ 78 totalsize = size + sizeof(ULONG); 79 totalsize += (totalsize % sizeof(ULONG)); 80 len = totalsize; 81 totalsize += (numStr * sizeof(char *)); 82 totalsize += 4; 83 rc = DosAllocMem((PPVOID) & str, totalsize, 84 PAG_COMMIT | PAG_READ | PAG_WRITE); 86 85 if (!rc && str) { 87 88 if(fread(str,1,size,fp) == size) {89 90 for(x = 0;x < numStr;x++) {91 if(p - str >= size)92 93 94 while(*p)95 96 97 98 if(x == numStr)99 100 101 if(ok)102 103 DosSetMem(str,totalsize,PAG_COMMIT | PAG_READ);104 86 strs = (char **)(str + len); 87 if (fread(str, 1, size, fp) == size) { 88 p = str; 89 for (x = 0; x < numStr; x++) { 90 if (p - str >= size) 91 break; 92 strs[x] = p; 93 while (*p) 94 p++; 95 p++; 96 } 97 if (x == numStr) 98 ok = TRUE; 99 } 100 if (ok) 101 /* set pages to readonly */ 102 DosSetMem(str, totalsize, PAG_COMMIT | PAG_READ); 103 } 105 104 } 106 105 } … … 110 109 if (!ok) { 111 110 numStr = 0; 112 if (str)111 if (str) 113 112 DosFreeMem(str); 114 113 str = NULL; … … 119 118 } 120 119 121 122 120 //== GetPString() return a readonly pointer to the requested string in memory == 123 121 124 char *GetPString 122 char *GetPString(ULONG id) 125 123 { 126 124 return id < numStr && str && strs && strs[id] ? strs[id] : NullStr; 127 125 } 128 126 129 130 127 //== StringsLoaded() return TRUE is strings loaded 131 128 132 BOOL StringsLoaded 129 BOOL StringsLoaded(void) 133 130 { 134 131 return numStr && str && strs; 135 132 }
Note:
See TracChangeset
for help on using the changeset viewer.