source: trunk/dll/string.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.7 KB
Line 
1#define INCL_DOS
2#define INCL_WIN
3
4#include <os2.h>
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <share.h>
9#include <io.h>
10#include "fm3dll.h"
11#include "fm3str.h"
12#include "version.h"
13
14#pragma alloc_text(STRINGS,LoadStrings,GetPString)
15
16static char **strs,*str;
17static ULONG numStr;
18
19
20BOOL LoadStrings (char *filename) {
21
22 /*
23 * Load strings from FM3RES.STR, with some error-checking.
24 * Return TRUE on success, FALSE on error.
25 */
26
27 BOOL ret = FALSE;
28 ULONG size,len,totalsize;
29 USHORT vermajor = 0,verminor = 0;
30 register char *p;
31 register ULONG x;
32 FILE *fp;
33
34 if(!filename)
35 filename = "FM3RES.STR";
36 numStr = 0;
37 if(str)
38 DosFreeMem(str);
39 strs = NULL;
40 str = NULL;
41
42 fp = _fsopen(filename,
43 "rb",
44 SH_DENYWR);
45 if(fp) {
46 if(fread(&numStr,
47 sizeof(numStr),
48 1,
49 fp) &&
50 numStr == IDS_NUMSTRS &&
51 fread(&len,sizeof(len),1,fp) &&
52 fread(&vermajor,sizeof(vermajor),1,fp) &&
53 fread(&verminor,sizeof(verminor),1,fp) &&
54 (vermajor >= VERMAJORBREAK &&
55 (vermajor > VERMAJORBREAK ||
56 verminor >= VERMINORBREAK))) {
57 fseek(fp,0,SEEK_END);
58 size = ftell(fp) - ((sizeof(ULONG) * 2) + (sizeof(USHORT) * 2));
59 if(size &&
60 size == len) {
61 fseek(fp,(sizeof(ULONG) * 2) + (sizeof(USHORT) * 2),SEEK_SET);
62 /*
63 * NOTE: Make one memory object for both str and strs
64 * for efficiency.
65 */
66 totalsize = size + sizeof(ULONG);
67 totalsize += (totalsize % sizeof(ULONG));
68 len = totalsize;
69 totalsize += (numStr * sizeof(char *));
70 totalsize += 4;
71 if(!DosAllocMem((PPVOID)&str,totalsize,
72 PAG_COMMIT | PAG_READ | PAG_WRITE) &&
73 str) {
74 strs = (char **)(str + len);
75 if(fread(str,1,size,fp) == size) {
76 p = str;
77 for(x = 0;x < numStr;x++) {
78 if(p - str >= size)
79 break;
80 strs[x] = p;
81 while(*p)
82 p++;
83 p++;
84 }
85 if(x == numStr)
86 ret = TRUE;
87 }
88 if(ret)
89 /* set pages to readonly */
90 DosSetMem(str,
91 totalsize,
92 PAG_COMMIT | PAG_READ);
93 }
94 }
95 }
96 fclose(fp);
97 }
98
99 if(!ret) {
100 numStr = 0;
101 if(str)
102 DosFreeMem(str);
103 str = NULL;
104 strs = NULL;
105 }
106
107 return ret;
108}
109
110
111char *GetPString (ULONG id) {
112
113 /*
114 * return a readonly pointer to the requested string in memory
115 */
116
117 return (id < numStr && str && strs && strs[id]) ? strs[id] : NullStr;
118}
119
120
121BOOL StringsLoaded (void) {
122
123 return (numStr && str && strs);
124}
Note: See TracBrowser for help on using the repository browser.