1 | // included into convert.c
|
---|
2 | // utility functions
|
---|
3 |
|
---|
4 | /*
|
---|
5 | ** D74609
|
---|
6 | */
|
---|
7 | /***************************************************************************
|
---|
8 | *
|
---|
9 | * FUNCTION NAME = roundImgAreaVals
|
---|
10 | *
|
---|
11 | * DESCRIPTION = Used for the *ImageableArea key. This function either
|
---|
12 | * rounds the floating point value to the nearest integer, or
|
---|
13 | * truncates the floating point value to the base integer.
|
---|
14 | * The new integer value is stored in the output buffer.
|
---|
15 | *
|
---|
16 | * INPUT = i - Offset to the input buffer where the floating point
|
---|
17 | * string is read.
|
---|
18 | * fIncFrac - Contains one of the following values:
|
---|
19 | * TRUNCATE_FLOAT - Truncate the floating point value to the
|
---|
20 | * base integer (i.e. 25.2 -> 25, 14.8 -> 14).
|
---|
21 | * ROUND_FLOAT - Rounds the floating point value to the next
|
---|
22 | * higher integer value, providing that there is a fractional
|
---|
23 | * value (i.e 25.1 -> 26, 79.8 -> 80, 15.0 -> 15, 4.0 -> 4).
|
---|
24 | * Any other value will yield unpredictable results.
|
---|
25 | * cMovePastChar - Character value that is passed on to
|
---|
26 | * MovePast to indicate what character to move past on the
|
---|
27 | * buffer. For this function's first call, the argument
|
---|
28 | * is usually '"' (quote), and most subsequent calls are ' '
|
---|
29 | * (space).
|
---|
30 | *
|
---|
31 | * OUTPUT = NONE.
|
---|
32 | *
|
---|
33 | * RETURN-NORMAL = Returns the latest offset (passed in from i above).
|
---|
34 | * RETURN-ERROR = NONE.
|
---|
35 | *
|
---|
36 | ************************************************************************* */
|
---|
37 | VOID roundImgAreaVals(int *i, float fIncFrac, CHAR cMovePastChar )
|
---|
38 | {
|
---|
39 | USHORT j;
|
---|
40 |
|
---|
41 | *i += MovePast( pbPrBuffer + *i, cMovePastChar );
|
---|
42 |
|
---|
43 | /*
|
---|
44 | ** @V2.187860
|
---|
45 | ** Since spaces are used as terminators in this function, a leading space
|
---|
46 | ** may cause the string offset to stop before skipping to the next value.
|
---|
47 | ** By removing all leading spaces, this ensures that the string offset moves
|
---|
48 | ** to the next value.
|
---|
49 | */
|
---|
50 | /*
|
---|
51 | ** @V3.0100963
|
---|
52 | ** Check for all valid spaces, not just for the whitespace. This is to
|
---|
53 | ** prevent a repeat performance in what was happening with MovePast().
|
---|
54 | */
|
---|
55 | while (isspace( *(pbPrBuffer + *i) ) )
|
---|
56 | {
|
---|
57 | (*i)++;
|
---|
58 | }
|
---|
59 |
|
---|
60 | /*
|
---|
61 | ** For the imageable area, only the integer value is to be stored. By
|
---|
62 | ** adding a fraction (fIncFrac) to the whole number taken from the PPD, it
|
---|
63 | ** either increase the integer value by one, or keep the integer unchanged.
|
---|
64 | ** Then the fraction can be discarded (convert it to a USHORT).
|
---|
65 | */
|
---|
66 | j = (USHORT) (atof( pbPrBuffer + *i ) + fIncFrac);
|
---|
67 |
|
---|
68 | memcpy((pbItemsBuffer + cbBuffout), (PCHAR) &j, sizeof( USHORT ) );
|
---|
69 | cbBuffout += sizeof( USHORT );
|
---|
70 | }
|
---|
71 |
|
---|
72 |
|
---|
73 |
|
---|
74 | /***************************************************************************
|
---|
75 | *
|
---|
76 | * FUNCTION NAME = atoRound
|
---|
77 | *
|
---|
78 | * DESCRIPTION = rounds off a fractional number to nearest integer
|
---|
79 | *
|
---|
80 | * INPUT = pchBuffer - pointer to buffer containing number
|
---|
81 | *
|
---|
82 | * OUTPUT = NONE.
|
---|
83 | *
|
---|
84 | * RETURN-NORMAL = NONE.
|
---|
85 | * RETURN-ERROR = NONE.
|
---|
86 | *
|
---|
87 | ************************************************************************* */
|
---|
88 |
|
---|
89 | int atoRound( char *pchBuffer )
|
---|
90 | {
|
---|
91 | int i;
|
---|
92 |
|
---|
93 | i = atoi( pchBuffer );
|
---|
94 |
|
---|
95 | while (*pchBuffer >= '0' && *pchBuffer <= '9')
|
---|
96 | {
|
---|
97 | pchBuffer++;
|
---|
98 | }
|
---|
99 |
|
---|
100 | if (*pchBuffer == '.')
|
---|
101 | {
|
---|
102 | pchBuffer++;
|
---|
103 |
|
---|
104 | if (*pchBuffer >= '5')
|
---|
105 | {
|
---|
106 | i++;
|
---|
107 | }
|
---|
108 | }
|
---|
109 | return( i );
|
---|
110 | }
|
---|
111 |
|
---|
112 | /***************************************************************************
|
---|
113 | *
|
---|
114 | * FUNCTION NAME = RepWarning
|
---|
115 | *
|
---|
116 | * DESCRIPTION = prints the given message (pszMsg) with the given
|
---|
117 | * line fragment (pszLine), including the current
|
---|
118 | * input line number. If line fragment is NULL, then
|
---|
119 | * only the message is displayed.
|
---|
120 | *
|
---|
121 | * INPUT = err - error number
|
---|
122 | * pszLine - optional text
|
---|
123 | *
|
---|
124 | * OUTPUT = NONE.
|
---|
125 | *
|
---|
126 | * RETURN-NORMAL = NONE.
|
---|
127 | * RETURN-ERROR = NONE.
|
---|
128 | *
|
---|
129 | ************************************************************************* */
|
---|
130 |
|
---|
131 | VOID RepWarning( ErrType err, char *pszLine )
|
---|
132 | {
|
---|
133 | printf( "%s", szErrmsgs[err] );
|
---|
134 |
|
---|
135 | if (pszLine)
|
---|
136 | {
|
---|
137 | printf( " %s", pszLine );
|
---|
138 | }
|
---|
139 | }
|
---|
140 |
|
---|
141 | /***************************************************************************
|
---|
142 | *
|
---|
143 | * FUNCTION NAME = RepError
|
---|
144 | *
|
---|
145 | * DESCRIPTION = Same as RepWarning, but terminates as well.
|
---|
146 | *
|
---|
147 | * INPUT = err - error number
|
---|
148 | * pszLine - optional text
|
---|
149 | *
|
---|
150 | * OUTPUT = NONE.
|
---|
151 | *
|
---|
152 | * RETURN-NORMAL = NONE.
|
---|
153 | * RETURN-ERROR = NONE.
|
---|
154 | *
|
---|
155 | ************************************************************************* */
|
---|
156 |
|
---|
157 | VOID RepError( ErrType err, char *pszLine )
|
---|
158 | {
|
---|
159 | RepWarning( err, pszLine );
|
---|
160 | exit( 1 );
|
---|
161 | }
|
---|
162 |
|
---|
163 | /***************************************************************************
|
---|
164 | *
|
---|
165 | * FUNCTION NAME = SkipNumber
|
---|
166 | *
|
---|
167 | * DESCRIPTION = This routine moves the input buffer pointer forward
|
---|
168 | * to skip the next number. Returns the number of bytes
|
---|
169 | * skipped.
|
---|
170 | *
|
---|
171 | * INPUT = pszLine - line to skip
|
---|
172 | * OUTPUT = NONE.
|
---|
173 | *
|
---|
174 | * RETURN-NORMAL = NONE.
|
---|
175 | * RETURN-ERROR = NONE.
|
---|
176 | *
|
---|
177 | ************************************************************************* */
|
---|
178 |
|
---|
179 | int SkipNumber( char *pszLine )
|
---|
180 | {
|
---|
181 | int i;
|
---|
182 |
|
---|
183 | i = SkipBlank( pszLine );
|
---|
184 |
|
---|
185 | if (*(pszLine+i) == '+' || *(pszLine+i) == '-' || *(pszLine+i) == '.')
|
---|
186 | {
|
---|
187 | i++;
|
---|
188 | }
|
---|
189 |
|
---|
190 | while (*(pszLine+i) >= '0' && *(pszLine+i) <= '9')
|
---|
191 | {
|
---|
192 | i++;
|
---|
193 | }
|
---|
194 |
|
---|
195 | if (*(pszLine + i) == '.')
|
---|
196 | {
|
---|
197 | i++;
|
---|
198 |
|
---|
199 | while (*(pszLine+i) >= '0' && *(pszLine+i) <= '9')
|
---|
200 | {
|
---|
201 | i++;
|
---|
202 | }
|
---|
203 | }
|
---|
204 | return( i );
|
---|
205 | }
|
---|
206 |
|
---|
207 | /***************************************************************************
|
---|
208 | *
|
---|
209 | * FUNCTION NAME = SkipBlank
|
---|
210 | *
|
---|
211 | * DESCRIPTION = This routine moves the input buffer pointer forward
|
---|
212 | * to the next non-white character. Returns the
|
---|
213 | * number of bytes skipped.
|
---|
214 | *
|
---|
215 | * INPUT = pszLine - line to skip
|
---|
216 | *
|
---|
217 | * OUTPUT = NONE.
|
---|
218 | *
|
---|
219 | * RETURN-NORMAL = NONE.
|
---|
220 | * RETURN-ERROR = NONE.
|
---|
221 | *
|
---|
222 | ************************************************************************* */
|
---|
223 |
|
---|
224 | int SkipBlank( char *pszLine )
|
---|
225 | {
|
---|
226 | int i;
|
---|
227 |
|
---|
228 | i = 0;
|
---|
229 |
|
---|
230 | while (*(pszLine+i) && (*(pszLine+i) == ' ' || *(pszLine+i) == '\t'))
|
---|
231 | {
|
---|
232 | i++;
|
---|
233 | }
|
---|
234 | return( i );
|
---|
235 | }
|
---|
236 |
|
---|
237 | /***************************************************************************
|
---|
238 | *
|
---|
239 | * FUNCTION NAME = MovePast
|
---|
240 | *
|
---|
241 | * DESCRIPTION = This routine returns the offset to skip past the
|
---|
242 | * first occurrence of character chSkip.
|
---|
243 | *
|
---|
244 | * INPUT = pbBuffer - pointer to buffer containing text
|
---|
245 | * chSkip - character to skip
|
---|
246 | *
|
---|
247 | * OUTPUT = NONE.
|
---|
248 | *
|
---|
249 | * RETURN-NORMAL = NONE.
|
---|
250 | * RETURN-ERROR = NONE.
|
---|
251 | *
|
---|
252 | ************************************************************************* */
|
---|
253 |
|
---|
254 | int MovePast( char *pbBuffer, char chSkip )
|
---|
255 | {
|
---|
256 | int i;
|
---|
257 |
|
---|
258 | i = 0;
|
---|
259 |
|
---|
260 | /*
|
---|
261 | ** @V2.1100963
|
---|
262 | ** Check for tab characters (0x09) as well as whitespaces. Theoretically, it
|
---|
263 | ** would be easier to replace the ' ' and 0x09 check with isspace(), but
|
---|
264 | ** to make things safer, just add the 0x09 check (with the excpetion of the
|
---|
265 | ** HP 4V, it has been working up to now. We don't want to possibly break
|
---|
266 | ** another PPD by replacing with isspace() ).
|
---|
267 | */
|
---|
268 | /*
|
---|
269 | ** GP@SWHT Defect 225880
|
---|
270 | ** We have 10 ppd's where are used TAB (0x09) instead of space
|
---|
271 | ** So if MovePast is searching for space, search also for TAB char.
|
---|
272 | */
|
---|
273 | while ( ( *(pbBuffer+i) != chSkip ) &&
|
---|
274 | ( *(pbBuffer+i) != 0x09 || chSkip != ' ' ) && // GP@SWHT D225880
|
---|
275 | ( *(pbBuffer+i) >= ' ' || *(pbBuffer+i) == 0x09 )
|
---|
276 | )
|
---|
277 | {
|
---|
278 | i++;
|
---|
279 | }
|
---|
280 | i++;
|
---|
281 |
|
---|
282 | // @V3.OEM There may be more than one blank in the PPD file, so get
|
---|
283 | // past all of them
|
---|
284 | while ( ( *(pbBuffer+i) == chSkip) ||
|
---|
285 | ( *(pbBuffer+i) == 0x09 && chSkip == ' ' ) // GP@SWHT D225880
|
---|
286 | )
|
---|
287 | {
|
---|
288 | i++;
|
---|
289 | }
|
---|
290 | return( i );
|
---|
291 | }
|
---|
292 |
|
---|
293 |
|
---|
294 | /*
|
---|
295 | ** @V2.177675
|
---|
296 | ** This function previously copied the quoted contents to a destination buffer
|
---|
297 | ** and stored the string length in the first byte. Now, this function does a
|
---|
298 | ** standard NULL-terminated string copy for the contents within the quotes.
|
---|
299 | */
|
---|
300 | /*
|
---|
301 | ** @V3.0129238
|
---|
302 | ** Include the forward slash ('/') as a delimeter if bIncludeSlash is TRUE.
|
---|
303 | ** If bIncludeSlash is FALSE, do not include the forward slash as a
|
---|
304 | ** delimiter.
|
---|
305 | */
|
---|
306 | /***************************************************************************
|
---|
307 | *
|
---|
308 | * FUNCTION NAME = CopyString
|
---|
309 | *
|
---|
310 | * DESCRIPTION = This routine copies a string from source to
|
---|
311 | * destination with delimiters as a double Quote,
|
---|
312 | * blank, colon, or forward slash (optional). The string
|
---|
313 | * is NULL terminated.
|
---|
314 | *
|
---|
315 | * INPUT = szDestn - destination string
|
---|
316 | * szSource - source string
|
---|
317 | * iMaxLen - length of destination string
|
---|
318 | * uiOpt - Options for copying //@V4.HexChar
|
---|
319 | * CSTR_NORMAL
|
---|
320 | * CSTR_INCLUDE_SLASH - Include the forward slash ('/')
|
---|
321 | * as a delimiter.
|
---|
322 | * CSTR_HEX2CHAR - Convert hex <e1> strings to chars.
|
---|
323 | * CSTR_EXCLUDE_DQUOTE- Exclude the double quote (")
|
---|
324 | * as a delimiter. GP@SWHT
|
---|
325 | *
|
---|
326 | * OUTPUT = NONE.
|
---|
327 | *
|
---|
328 | * RETURN-NORMAL = Number of characters in the copied string.
|
---|
329 | * RETURN-ERROR = NONE.
|
---|
330 | *
|
---|
331 | ************************************************************************* */
|
---|
332 |
|
---|
333 | int CopyString(char *szDestn, char *szSource, int iMaxlen, UINT uiOpt)
|
---|
334 | {
|
---|
335 | int i,j;
|
---|
336 |
|
---|
337 | int fInHex; // flag, if we currently are processing hex string
|
---|
338 |
|
---|
339 | // these variables keep state in case we have to abort hex string conversion
|
---|
340 | // (if it's actually not hex string, just <some string>...
|
---|
341 | int iHexRollbackSrc;
|
---|
342 | int iHexRollbackDest;
|
---|
343 | int iHexDigits;
|
---|
344 |
|
---|
345 | char chHex;
|
---|
346 |
|
---|
347 | char *str_in;
|
---|
348 | char *str_out;
|
---|
349 |
|
---|
350 |
|
---|
351 |
|
---|
352 | iMaxlen--; /* maxlen is actually 1 based, i is a 0 based index, if you hit the max
|
---|
353 | * then add a NULL you may have a memory violation, so adjust by 1 [wgs] */
|
---|
354 |
|
---|
355 | if (!(*szSource)) /* if the string is empty, do nothing */
|
---|
356 | return(0);
|
---|
357 |
|
---|
358 |
|
---|
359 | i = 0;
|
---|
360 | j = 0;
|
---|
361 | str_in = szSource;
|
---|
362 | str_out = szDestn;
|
---|
363 |
|
---|
364 | fInHex = FALSE;
|
---|
365 |
|
---|
366 |
|
---|
367 | /* @V4.HexChar Begin
|
---|
368 | ** OldCode
|
---|
369 | ** while (*szSource && *szSource != '"' && (*szSource >= ' ' || *szSource < 0) &&
|
---|
370 | ** *szSource != ':' && ((bIncludeSlash == TRUE && *szSource != '/') ||
|
---|
371 | ** bIncludeSlash != TRUE) && i < iMaxlen)
|
---|
372 | ** {
|
---|
373 | ** *(szDestn + i++) = *(szSource++);
|
---|
374 | ** }
|
---|
375 | **
|
---|
376 | ** New Code translates also hex strings <e1> to chars
|
---|
377 | ** if CSTR_HEX2CHAR is set.
|
---|
378 | */
|
---|
379 |
|
---|
380 | while ( str_in[i] &&
|
---|
381 | (str_in[i] != '"' || (uiOpt & CSTR_EXCLUDE_DQUOTE) ) &&
|
---|
382 | (str_in[i] >= ' ' || str_in[i] < 0) &&
|
---|
383 | str_in[i] != ':' &&
|
---|
384 | ( ( (uiOpt & CSTR_INCLUDE_SLASH) && str_in[i] != '/') ||
|
---|
385 | !(uiOpt & CSTR_INCLUDE_SLASH) )
|
---|
386 | && j < iMaxlen)
|
---|
387 | {
|
---|
388 | if ( uiOpt & CSTR_HEX2CHAR )
|
---|
389 | {
|
---|
390 |
|
---|
391 | //@HEXSTR fix hex string parsing code to support PPD standard.
|
---|
392 | //
|
---|
393 | // note: very similar code is countained in charstr.c::ConvertCharset
|
---|
394 | // if you fix a bug here, don't forget to fix it there too.
|
---|
395 | //
|
---|
396 |
|
---|
397 | if( !fInHex && str_in[i]=='<' )
|
---|
398 | {
|
---|
399 | // this might be the beginning of <hex> string
|
---|
400 |
|
---|
401 | fInHex = TRUE;
|
---|
402 | iHexRollbackSrc = i;
|
---|
403 | iHexRollbackDest = j;
|
---|
404 | iHexDigits = 0;
|
---|
405 | i++;
|
---|
406 | continue;
|
---|
407 | }
|
---|
408 | else if( fInHex && str_in[i]=='>' )
|
---|
409 | {
|
---|
410 | // hex string is terminated
|
---|
411 |
|
---|
412 | if( iHexDigits )
|
---|
413 | {
|
---|
414 | // this string is error, rollback
|
---|
415 | i = iHexRollbackSrc;
|
---|
416 | j = iHexRollbackDest;
|
---|
417 |
|
---|
418 | // get over the '<' character
|
---|
419 | str_out[j]=str_in[i];
|
---|
420 | i++;
|
---|
421 | j++;
|
---|
422 |
|
---|
423 | // just go on copying
|
---|
424 | }
|
---|
425 | else
|
---|
426 | {
|
---|
427 | i++;
|
---|
428 | }
|
---|
429 |
|
---|
430 | fInHex = FALSE;
|
---|
431 | iHexDigits = 0;
|
---|
432 | continue;
|
---|
433 | }
|
---|
434 | else if( fInHex )
|
---|
435 | {
|
---|
436 | // processing the hex string
|
---|
437 |
|
---|
438 | char ch = str_in[i];
|
---|
439 |
|
---|
440 | // check if it's acceptable hex char
|
---|
441 |
|
---|
442 | if( ch >= '0' && ch<='9' )
|
---|
443 | {
|
---|
444 | chHex = (chHex << 4) | (ch - '0');
|
---|
445 | iHexDigits++;
|
---|
446 | }
|
---|
447 | else if( ch >= 'a' && ch<='f' )
|
---|
448 | {
|
---|
449 | chHex = (chHex << 4) | (ch - 'a' + 0xA);
|
---|
450 | iHexDigits++;
|
---|
451 | }
|
---|
452 | else if( ch >= 'A' && ch<='F' )
|
---|
453 | {
|
---|
454 | chHex = (chHex << 4) | (ch - 'A' + 0xA);
|
---|
455 | iHexDigits++;
|
---|
456 | }
|
---|
457 | else if( ch == ' ' || ch == '\t' )
|
---|
458 | {
|
---|
459 | // these are acceptable chars, must be ignored
|
---|
460 | // (note: this is different from charset.c processing
|
---|
461 | // where they would be copied verbatim !)
|
---|
462 |
|
---|
463 | ; // do nothing
|
---|
464 | }
|
---|
465 | else
|
---|
466 | {
|
---|
467 | // just bail, return to copying the string as if hex mode never happened
|
---|
468 | i = iHexRollbackSrc;
|
---|
469 | j = iHexRollbackDest;
|
---|
470 |
|
---|
471 | // get over the '<' character
|
---|
472 | str_out[j]=str_in[i];
|
---|
473 | i++;
|
---|
474 | j++;
|
---|
475 |
|
---|
476 | fInHex = FALSE;
|
---|
477 | iHexDigits = 0;
|
---|
478 |
|
---|
479 | // just go on copying
|
---|
480 | continue;
|
---|
481 | }
|
---|
482 |
|
---|
483 | // must be 2 or more(even nr) hex characters
|
---|
484 | if( iHexDigits == 2 )
|
---|
485 | {
|
---|
486 | str_out[j] = chHex;
|
---|
487 | j++;
|
---|
488 |
|
---|
489 | iHexDigits = 0;
|
---|
490 | }
|
---|
491 |
|
---|
492 | i++;
|
---|
493 | continue;
|
---|
494 | }
|
---|
495 |
|
---|
496 | }
|
---|
497 |
|
---|
498 | str_out[j]=str_in[i];
|
---|
499 | i++;
|
---|
500 | j++;
|
---|
501 | }
|
---|
502 | // @V4.HexChar End
|
---|
503 |
|
---|
504 | str_out[j] = 0;
|
---|
505 | j++; // required
|
---|
506 |
|
---|
507 | //debug print
|
---|
508 | // printf(" === %s ===\n", str_out );
|
---|
509 |
|
---|
510 | return( j );
|
---|
511 | } /* CopyString */
|
---|
512 |
|
---|
513 |
|
---|
514 | /*
|
---|
515 | ** @V2.177675
|
---|
516 | ** This function previously copied the quoted contents to a destination buffer
|
---|
517 | ** and stored the string length in the first byte. Now, this function does a
|
---|
518 | ** standard NULL-terminated string copy for the contents within the quotes.
|
---|
519 | */
|
---|
520 | /***************************************************************************
|
---|
521 | *
|
---|
522 | * FUNCTION NAME = CopyInQuote
|
---|
523 | *
|
---|
524 | * DESCRIPTION = This routine copies a NULL-terminated string from source to
|
---|
525 | * destination with delimiters as a double Quote. This
|
---|
526 | * function returns the string length, in bytes, including
|
---|
527 | * the terminator.
|
---|
528 | *
|
---|
529 | * If fRemoveDots is TRUE the dots in the target
|
---|
530 | * string will be replaced with underscores. This is
|
---|
531 | * to get around a in the IBM spooler which chokes on
|
---|
532 | * more than one dot in a printer model name.
|
---|
533 | *
|
---|
534 | * INPUT = szDestn - destination string
|
---|
535 | * szSource - source string
|
---|
536 | * fRemoveDots - flag
|
---|
537 | *
|
---|
538 | * OUTPUT = NONE.
|
---|
539 | *
|
---|
540 | * RETURN-NORMAL = NONE.
|
---|
541 | * RETURN-ERROR = NONE.
|
---|
542 | *
|
---|
543 | ************************************************************************* */
|
---|
544 |
|
---|
545 | int CopyInQuote(char *szDestn,char *szSource,BOOL fRemoveDots, BOOL CompressFlag)
|
---|
546 | {
|
---|
547 | /*@V3.0CMPS01 start */
|
---|
548 | int j, k;
|
---|
549 | //ULONG ulKey; NOTUSED
|
---|
550 | PWORDELEMENT pW;
|
---|
551 | PSZ pszP;
|
---|
552 | /*@V3.0CMPS01 end */
|
---|
553 | register int i = 0;
|
---|
554 | BOOL fInHexString = FALSE;
|
---|
555 |
|
---|
556 | /*
|
---|
557 | ** @V2.177675
|
---|
558 | ** Remove MAX_ESC_STR_LEN. Some PPD commands may exceed 256 characters.
|
---|
559 | */
|
---|
560 |
|
---|
561 | if (!(*szSource)) /* if the string is empty, do nothing */
|
---|
562 | return(i);
|
---|
563 |
|
---|
564 | /* Remove excess leading spaces */
|
---|
565 | while (*szSource && isspace( *szSource ))
|
---|
566 | {
|
---|
567 | szSource++;
|
---|
568 | }
|
---|
569 |
|
---|
570 | /*
|
---|
571 | ** Change any dots to underscores if needed
|
---|
572 | */
|
---|
573 | if ( fRemoveDots )
|
---|
574 | {
|
---|
575 | pszP = szSource;
|
---|
576 |
|
---|
577 | while ( *pszP != '"' )
|
---|
578 | {
|
---|
579 | if ( *pszP == '.' )
|
---|
580 | {
|
---|
581 | *pszP = '_';
|
---|
582 | }
|
---|
583 |
|
---|
584 | pszP++;
|
---|
585 | }
|
---|
586 | }
|
---|
587 |
|
---|
588 |
|
---|
589 | while (*szSource && *szSource != '"') /* make sure we check the null too. [wgs] */
|
---|
590 | {
|
---|
591 | if ( isalnum( *szSource ) )
|
---|
592 | {
|
---|
593 | /* copy ANs to buffer */
|
---|
594 | j = 0;
|
---|
595 | /*
|
---|
596 | ** A word is alphanumeric. Dots are allowed as long as in
|
---|
597 | ** the middle
|
---|
598 | */
|
---|
599 | while ( isalnum( *szSource ) ||
|
---|
600 | ((*szSource == '.') && isalnum( *(szSource+1) ) ) )
|
---|
601 | {
|
---|
602 | *(szDestn + i + j++ ) = *(szSource++);
|
---|
603 | }
|
---|
604 | if ( j > 1 ) /* a multi char word */
|
---|
605 | {
|
---|
606 | if (CompressFlag == TRUE)
|
---|
607 | {
|
---|
608 | *(szDestn + i + j ) = '\0';
|
---|
609 | //
|
---|
610 | // if ( fWriteWords ) /* Write out words if needed */
|
---|
611 | // {
|
---|
612 | // fprintf (ppdOut, "%s\n",szDestn+i);
|
---|
613 | // }
|
---|
614 |
|
---|
615 | if ( ( pW = SearchHashTable( (PSZ) szDestn+i ) ) != 0 ) //Look in hash table
|
---|
616 | {
|
---|
617 | /*
|
---|
618 | ** For each list we pass write a 0xff out - first list no FFs
|
---|
619 | ** secon write one FF, third write two ...
|
---|
620 | */
|
---|
621 | for ( k = 0; k < pW->sList; k++ )
|
---|
622 | {
|
---|
623 | *(szDestn + i++) = '\xFF';
|
---|
624 | }
|
---|
625 | *(szDestn + i++) = pW->sIndex;
|
---|
626 | }
|
---|
627 | else
|
---|
628 | {
|
---|
629 | i += j; /* move i by word */
|
---|
630 | }
|
---|
631 | }
|
---|
632 | else
|
---|
633 | {
|
---|
634 | i += j; /* move i by word */
|
---|
635 | }
|
---|
636 | }
|
---|
637 | else
|
---|
638 | {
|
---|
639 | i += j; /* move i by word */
|
---|
640 | }
|
---|
641 | }
|
---|
642 |
|
---|
643 | else
|
---|
644 | if (isspace( *szSource ))
|
---|
645 | {
|
---|
646 | /*
|
---|
647 | ** If space use one space char and skip rest
|
---|
648 | --
|
---|
649 | ** Keep it a space Not tab CR LF etc...
|
---|
650 | */
|
---|
651 | BOOL fFoundLF = FALSE;
|
---|
652 |
|
---|
653 | if ( *szSource != '\n' )
|
---|
654 | {
|
---|
655 | *(szDestn + i++) = ' ';
|
---|
656 | }
|
---|
657 | else
|
---|
658 | {
|
---|
659 | *(szDestn + i++) = '\n';
|
---|
660 | fFoundLF = TRUE;
|
---|
661 | }
|
---|
662 |
|
---|
663 | szSource++;
|
---|
664 |
|
---|
665 | /* Remove excess any spaces */
|
---|
666 | while ( isspace( *szSource ) &&
|
---|
667 | ( *szSource != '\n' || fFoundLF == TRUE ) )
|
---|
668 | {
|
---|
669 | szSource++;
|
---|
670 | }
|
---|
671 | }
|
---|
672 |
|
---|
673 | else
|
---|
674 | {
|
---|
675 | // @V4.1200417
|
---|
676 | // This is either a hex string or dict entry
|
---|
677 | if ( *szSource == '<' )
|
---|
678 | {
|
---|
679 | // It's a Dict entry
|
---|
680 | if ( *(szSource+1) == '<' )
|
---|
681 | {
|
---|
682 | *(szDestn + i++) = *(szSource++);
|
---|
683 | }
|
---|
684 | else
|
---|
685 | {
|
---|
686 | // Do not compress hex strings
|
---|
687 | // If compression is already off then nothing really needs to change
|
---|
688 | fInHexString = CompressFlag;
|
---|
689 | CompressFlag = FALSE;
|
---|
690 | }
|
---|
691 | }
|
---|
692 | else
|
---|
693 | if ( *szSource == '>' &&
|
---|
694 | fInHexString == TRUE )
|
---|
695 | {
|
---|
696 | fInHexString = FALSE;
|
---|
697 | CompressFlag = TRUE;
|
---|
698 | }
|
---|
699 |
|
---|
700 | *(szDestn + i++) = *(szSource++);
|
---|
701 | }
|
---|
702 | }
|
---|
703 |
|
---|
704 | /*
|
---|
705 | ** NULL-terminate the destination string.
|
---|
706 | */
|
---|
707 |
|
---|
708 | *(szDestn + i++) = 0;
|
---|
709 |
|
---|
710 | return( i );
|
---|
711 | } /* CopyInQuote */
|
---|
712 |
|
---|
713 |
|
---|