source: trunk/stdcode/globstr.c@ 3

Last change on this file since 3 was 3, checked in by erdmann, 8 years ago

fixing 2 bugs in mmi_customdll.c, unpacking STDCODE.RAR into its own directory, removing all binaries (.obj, .exe) from repo

  • Property svn:eol-style set to native
File size: 11.8 KB
Line 
1
2// ù Ä ÄÄÄÄÍÍ = Ä ù Ä = ÍÍÄÄÄÄ Ä ù
3// ³ ³
4// ÜÛÛÛÛÛÛÛÜ ÜÛÜ ÜÛÛÛÛÛÛÛÛÜ ú úÄÄÄÍÄÄÍÄÍÍÄÄÍÍÍÍÄÍÍÍÍÍÍÍÍÍÎÄ
5// ³ ÛÛÛÛßßßÛÛÛÛ ÛÛÛÛÛ ÛÛÛß ßÛÛÛ ³ MINSTALL Front-End º
6// º ÛÛÛÛÜÜÜÛÛÛÛ ÛÛÛÛÛ ÛÛÛÜ ÜÛÛÛ º ú ÄÄÄÄÍÄÍÍÄÄÍÍÍÍÄÍÍÍÍÍÍÍÍÄÍÍÍÍÍÎÄ
7// º ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛß º Section: MMOS/2 for eCS º
8// º ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ßÛÛÛÛÜ º ³ Created: 28/10/02 º
9// ³ ßÛÛß ßÛÛß ßÛß ßÛÛß ßÛÛß ³ ³ Last Modified: ³
10// ÜÜÜ ³ Number Of Modifications: 000 ³
11// ù ÜÛÛß ù ³ INCs required: *none* ³
12// ÄÄÄÄÄÄÄ ÜÛÛß º Written By: Martin Kiewitz ³
13// ³ Ú¿Ú¿³ÜÛÛÛÜÜÛÛÛÜ ³ º (c) Copyright by ³
14// º ÀÙ³ÀÙßÛÛÛßßÜÛÛß º º AiR ON-Line Software '02 ú
15// º ÄÄÄÄÄÄÄ ÜÛÛÝ º º All rights reserved.
16// º ÜÛÛÛÄÄÄÄÄÄÄÄÄ º ÄÎÍÍÍÄÍÍÍÍÍÄÍÍÍÍÄÍÍÄÄÍÄÄÍÄÄÄúÄÄ ú
17// º ÜÛÛÛݳ ³Ú¿³³Ä º
18// ³ ÜÛÛÛÛ Àij³ÀÙ³Ä ³
19// ßÛÛÛÛÝÄÄÄÄÄÄÄÄÄÄ
20// ³ ßß ³
21// ù ÄŽ-=’iç éï-Liïî SéŸâW’çî=-ÃÄÄ ù
22
23#define INCL_NOPMAPI
24#define INCL_BASE
25#define INCL_DOSMODULEMGR
26#include <os2.h>
27
28#include <global.h>
29#include <globstr.h>
30
31PCHAR STRING_GetCmdLinePtr (void) {
32 PTIB ptib;
33 PPIB ppib;
34 PCHAR CmdLinePtr;
35
36 DosGetInfoBlocks(&ptib, &ppib);
37 CmdLinePtr = STRING_SkipASCIIZ(ppib->pib_pchcmd, NULL);
38 while (*CmdLinePtr==' ')
39 CmdLinePtr++;
40 return CmdLinePtr;
41 }
42
43BOOL STRING_Copy (PSZ DestString, ULONG DestMaxLength, PCHAR StringBegin, PCHAR StringEnd) {
44 ULONG BytesToCopy = StringEnd-StringBegin;
45
46 if (BytesToCopy>=DestMaxLength)
47 return FALSE;
48 memcpy (DestString, StringBegin, BytesToCopy);
49 DestString += BytesToCopy;
50 *DestString = 0;
51 return TRUE;
52 }
53
54BOOL STRING_CopyPSZ (PSZ DestString, ULONG DestMaxLength, PSZ String) {
55 ULONG StringLen = strlen(String);
56
57 if (StringLen>=DestMaxLength)
58 return FALSE;
59 memcpy (DestString, String, StringLen);
60 DestString += StringLen;
61 *DestString = 0; // Terminating NUL
62 return TRUE;
63 }
64
65// Combines 2 Strings and also checks for buffer-overflow
66// if returns false, DestString buffer is too small
67BOOL STRING_CombinePSZ (PSZ DestString, ULONG DestMaxLength, PSZ String1, PSZ String2) {
68 ULONG String1Len = strlen(String1);
69 ULONG String2Len = strlen(String2);
70
71 DestMaxLength--; // We need one char as NUL...
72 if ((String1Len+String2Len+1)>DestMaxLength)
73 return FALSE;
74 memcpy (DestString, String1, String1Len);
75 DestString += String1Len;
76 memcpy (DestString, String2, String2Len);
77 DestString += String2Len;
78 *DestString = 0; // Terminating NUL
79 return TRUE;
80 }
81
82// If EndPos==0 -> Won't do buffer overflow checking... only used on KNOWN data
83PCHAR STRING_SkipASCIIZ (PCHAR StartPos, PCHAR EndPos) {
84 PCHAR CurPos = StartPos;
85 if (!EndPos) {
86 while (*CurPos!=0) // <-- Badass code!
87 CurPos++;
88 return CurPos+1;
89 }
90 while (CurPos<EndPos) {
91 if (*CurPos==0)
92 return CurPos+1;
93 CurPos++;
94 }
95 return NULL;
96 }
97
98PCHAR STRING_GetASCIIZString (PCHAR DestPtr, ULONG DestMaxSize, PCHAR StartPos, PCHAR EndPos) {
99 PCHAR CurPos = StartPos;
100 CHAR CurChar;
101
102 while ((CurPos<EndPos) && (DestMaxSize>0)) {
103 CurChar = *CurPos; CurPos++;
104 *DestPtr = CurChar; DestPtr++; DestMaxSize--;
105 if (CurChar==0) { // Copy till and including NUL
106 return CurPos;
107 }
108 }
109 return NULL; // EOB encountered instead of NUL
110 }
111
112PCHAR STRING_GetASCIIZNumericValue (PULONG DestPtr, PCHAR StartPos, PCHAR EndPos) {
113 PCHAR CurPos = StartPos;
114 CHAR CurChar;
115 ULONG DigitChars = 0;
116 CHAR TempBuffer[12];
117
118 // First we check, if hexadecimal escape is found '0x'
119 if (((StartPos+2)<EndPos) && (*(PUSHORT)CurPos==0x7830)) {
120 CurPos += 2;
121 while (CurPos<EndPos) {
122 CurChar = *CurPos;
123 if (CurChar==0) break; // NUL ends the string...
124 if (!(((CurChar>=0x30) && (CurChar<=0x39)) || ((CurChar>=0x41) && (CurChar<=0x46)) || (CurChar=='L')))
125 return NULL; // Invalid value
126 CurPos++; DigitChars++;
127 }
128 } else {
129 while (CurPos<EndPos) {
130 CurChar = *CurPos;
131 if (CurChar==0) break; // NUL ends the string...
132 if (!((CurChar>=0x30) && (CurChar<=0x39) || (CurChar=='L')))
133 return NULL; // Invalid value
134 CurPos++; DigitChars++;
135 }
136 }
137 if ((DigitChars) && (CurPos<EndPos)) { // We found any valid chars?
138 *DestPtr = strtoul(StartPos, NULL, 0);
139 return CurPos+1;
140 }
141 return NULL;
142 }
143
144// Generates a String and escapes '\' and '"' chars and puts result in DestString
145// Replies 0 on buffer-overflow (or NUL variable) otherwise length of result
146PCHAR STRING_BuildEscaped (PCHAR DestPtr, PULONG DestMaxSizePtr, PSZ StringPtr) {
147 CHAR CurChar;
148 PCHAR CurDestPos = DestPtr;
149 ULONG DestMaxSize = *DestMaxSizePtr;
150 PCHAR MaxDestPos = DestPtr+DestMaxSize;
151
152 while ((CurDestPos<MaxDestPos)) {
153 CurChar = *StringPtr;
154 if (CurChar==0) { // End-of-String?
155 *CurDestPos = 0;
156 *DestMaxSizePtr -= CurDestPos-DestPtr;
157 return CurDestPos;
158 } else if (CurChar==0x0D) { // CR? -> '\n'
159 *CurDestPos = 0x5C; CurDestPos++;
160 if (CurDestPos<MaxDestPos) {
161 *CurDestPos = 'n'; CurDestPos++;
162 }
163 } else {
164 if ((CurChar==0x5C) | (CurChar==0x22)) { // Escape '\' and '"'
165 *CurDestPos = 0x5C; CurDestPos++;
166 }
167 *CurDestPos = CurChar; CurDestPos++;
168 }
169 StringPtr++;
170 }
171 CurDestPos--;
172 *CurDestPos = 0; // Set terminating NUL anyway
173 *DestMaxSizePtr = 0; // No bytes left
174 return NULL; // for security
175 }
176
177PCHAR STRING_GetEndOfLinePtr (PCHAR CurPos, PCHAR EndPos) {
178 PCHAR LineEndPos = CurPos;
179
180 while ((LineEndPos<EndPos) && (*LineEndPos!=0x0D))
181 LineEndPos++; // Look for End-Of-Line...
182 return LineEndPos;
183 }
184
185CHAR STRING_GetValidChar (PCHAR *CurPosPtr, PCHAR EndPos, PULONG CurLineNo) {
186 PCHAR CurPos = *CurPosPtr;
187 CHAR CurChar;
188
189 while (CurPos<EndPos) {
190 CurChar = *CurPos;
191 if (CurChar==0x0D) *CurLineNo += 1;
192 if ((CurChar!=0x0D) && (CurChar!=' ')) { // Search for not CR nor space
193 *CurPosPtr = CurPos;
194 return CurChar;
195 }
196 CurPos++;
197 }
198 *CurPosPtr = CurPos;
199 return 0;
200 }
201
202PCHAR STRING_SkipString (PCHAR StartPos, PCHAR EndPos) {
203 PCHAR CurPos = StartPos;
204 CHAR CurChar;
205
206 if (*CurPos=='"') {
207 CurPos++;
208 while (CurPos<EndPos) {
209 CurChar = *CurPos;
210 switch (CurChar) {
211 case 0x0D:
212 return NULL; // Incomplete string, but CR
213 case '"':
214 return CurPos+1; // Found End-Of-String
215 case 0x5C:
216 CurPos++; break;
217 }
218 CurPos++;
219 }
220 } else {
221 while ((CurPos<EndPos) && (*CurPos!=' ') && (*CurPos!='='))
222 CurPos++;
223 return CurPos;
224 }
225 return NULL;
226 }
227
228PCHAR STRING_SkipNumericValue (PCHAR StartPos, PCHAR EndPos) {
229 PCHAR CurPos = StartPos;
230 CHAR CurChar;
231
232 while (CurPos<EndPos) {
233 CurChar = toupper(*CurPos);
234 if (CurChar=='L') {
235 CurPos++; break; // 'L' is value terminator and is skipped
236 }
237 if ((CurChar==0x0D) || (CurChar=='"') || (CurChar==';') || (CurChar==',') || (CurChar==' ') || (CurChar==']') || (CurChar==')'))
238 break; // "normal" ending characters...
239 CurPos++;
240 }
241 return CurPos;
242 }
243
244// Extracts a string from an ASCII string using the \ escape mechanismn
245PCHAR STRING_GetString (PCHAR DestPtr, ULONG DestMaxSize, PCHAR StartPos, PCHAR EndPos) {
246 PCHAR CurPos = StartPos;
247 ULONG TmpLen = 0;
248 PCHAR CurDestPtr = DestPtr;
249 CHAR CurChar;
250
251 // One less, because of terminating Zero
252 DestMaxSize--;
253
254 if (*StartPos=='"') {
255 CurPos++; // Skip over '"'
256 // Now take over any chars till '"' including escape mechanismn
257 while (CurPos<EndPos) {
258 CurChar = *CurPos;
259 if (CurChar=='"') {
260 *CurDestPtr = 0; return CurPos+1;
261 }
262 if ((CurChar==0x0D) || (CurChar==0)) break;
263 if (CurChar==0x5C) { // is escape mechanismn
264 CurPos++;
265 if (CurPos>=EndPos) break;
266 }
267 if (DestMaxSize>0) {
268 *CurDestPtr++ = CurChar; DestMaxSize--;
269 }
270 CurPos++;
271 }
272 return 0; // End-Of-Line reached during String
273 } else {
274 while (CurPos<EndPos) {
275 CurChar = *CurPos;
276 if ((CurChar==' ') || (CurChar=='=') || (CurChar==0x0D) || (CurChar==0))
277 break; // End-Of-String
278 if (DestMaxSize>0) {
279 *CurDestPtr++ = CurChar; DestMaxSize--;
280 }
281 CurPos++;
282 }
283 *CurDestPtr = 0;
284 return CurPos;
285 }
286 }
287
288// Extracts a value (e.g. '0', '0L', '0x0' and '0x0L') including error checking
289// Needs to be called using CurPos == First digit of value
290PCHAR STRING_GetNumericValue (PULONG DestPtr, PCHAR StartPos, PCHAR EndPos) {
291 PCHAR CurPos = StartPos;
292 CHAR CurChar = 0;
293 ULONG DigitChars = 0;
294
295 // First we check, if hexadecimal escape is found '0x'
296 if (((StartPos+2)<EndPos) && (*(PUSHORT)CurPos==0x7830)) {
297 CurPos += 2;
298 while (CurPos<EndPos) {
299 CurChar = toupper(*CurPos);
300 if (CurChar=='L') {
301 CurPos++; break; // 'L' is value terminator and is skipped
302 }
303 if ((CurChar==0) || (CurChar=='=') || (CurChar==0x0D) || (CurChar=='"') || (CurChar==';') || (CurChar==',') || (CurChar==' ') || (CurChar==']') || (CurChar==')'))
304 break; // "normal" ending characters...
305 if (!(((CurChar>=0x30) && (CurChar<=0x39)) || ((CurChar>=0x41) && (CurChar<=0x46))))
306 return NULL; // Invalid value
307 CurPos++; DigitChars++;
308 }
309 } else {
310 while (CurPos<EndPos) {
311 CurChar = toupper(*CurPos);
312 if (CurChar=='L') {
313 CurPos++; break; // 'L' is value terminator and is skipped
314 }
315 if ((CurChar==0) || (CurChar=='=') || (CurChar==0x0D) || (CurChar=='"') || (CurChar==';') || (CurChar==',') || (CurChar==' ') || (CurChar==']') || (CurChar==')'))
316 break; // "normal" ending characters...
317 if (!((CurChar>=0x30) && (CurChar<=0x39)))
318 return NULL; // Invalid value
319 CurPos++; DigitChars++;
320 }
321 }
322 if (DigitChars) { // We found any valid chars?
323 *DestPtr = strtoul(StartPos, NULL, 0);
324 return CurPos;
325 }
326 return NULL;
327 }
328
329// Isolates one word of a string. Replies with next StartPos, if successful
330// otherwise NULL. Will set WordBeginPos and WordLength accordingly.
331// Example: 'A brown fox jumped over an assembler'
332// IsolateWord -> 'A'
333// IsolateWord -> 'brown'
334// etc.
335PCHAR STRING_IsolateWord (PCHAR *WordBeginPosPtr, PULONG WordLengthPtr, PCHAR StartPos, PCHAR EndPos) {
336 while ((StartPos<EndPos) && ((*StartPos==' ') || (*StartPos=='-') || (*StartPos=='.') || (*StartPos==',')))
337 StartPos++;
338 if (StartPos<EndPos) {
339 *WordBeginPosPtr = StartPos;
340 *WordLengthPtr = 0;
341 while ((StartPos<EndPos) && (*StartPos!=' ') && (*StartPos!='-') && (*StartPos!='.') && (*StartPos!=',')) {
342 StartPos++; (*WordLengthPtr)++; }
343 return StartPos;
344 }
345 return NULL;
346 }
Note: See TracBrowser for help on using the repository browser.