Add PBE algorithms with ciphers, not digests.
[openssl.git] / MacOS / GetHTTPS.src / CPStringUtils.cpp
1 /* ====================================================================
2  * Copyright (c) 1998-1999 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer. 
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    openssl-core@openssl.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This product includes cryptographic software written by Eric Young
50  * (eay@cryptsoft.com).  This product includes software written by Tim
51  * Hudson (tjh@cryptsoft.com).
52  *
53  */
54  
55  
56  
57  #include "CPStringUtils.hpp"
58 #include "ErrorHandling.hpp"
59
60
61
62 #define kNumberFormatString                     "\p########0.00#######;-########0.00#######"
63
64
65
66 //      Useful utility functions which could be optimized a whole lot
67
68
69 void CopyPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength)
70 {
71 int             i,numPChars;
72
73
74         if (thePStr != nil && theCStr != nil && maxCStrLength > 0)
75         {
76                 numPChars = thePStr[0];
77                 
78                 for (i = 0;;i++)
79                 {
80                         if (i >= numPChars || i >= maxCStrLength - 1)
81                         {
82                                 theCStr[i] = 0;
83                                 
84                                 break;
85                         }
86                         
87                         else
88                         {
89                                 theCStr[i] = thePStr[i + 1];
90                         }
91                 }
92         }
93 }
94
95
96 void CopyPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength)
97 {
98 int             theMaxDstStrLength;
99
100         
101         theMaxDstStrLength = maxDstStrLength;
102         
103         
104         if (theDstPStr != nil && theSrcPStr != nil && theMaxDstStrLength > 0)
105         {
106                 if (theMaxDstStrLength > 255)
107                 {
108                         theMaxDstStrLength = 255;
109                 }
110                 
111                 
112                 if (theMaxDstStrLength - 1 < theSrcPStr[0])
113                 {
114                         BlockMove(theSrcPStr + 1,theDstPStr + 1,theMaxDstStrLength - 1);
115                         
116                         theDstPStr[0] = theMaxDstStrLength - 1;
117                 }
118                 
119                 else
120                 {
121                         BlockMove(theSrcPStr,theDstPStr,theSrcPStr[0] + 1);
122                 }
123         }
124 }
125
126
127 void CopyCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxDstStrLength)
128 {
129 int             i;
130
131
132         if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0)
133         {
134                 for (i = 0;;i++)
135                 {
136                         if (theSrcCStr[i] == 0 || i >= maxDstStrLength - 1)
137                         {
138                                 theDstCStr[i] = 0;
139                                 
140                                 break;
141                         }
142                         
143                         else
144                         {
145                                 theDstCStr[i] = theSrcCStr[i];
146                         }
147                 }
148         }
149 }
150
151
152
153 void CopyCSubstrToCStr(const char *theSrcCStr,const int maxCharsToCopy,char *theDstCStr,const int maxDstStrLength)
154 {
155 int             i;
156
157
158         if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0)
159         {
160                 for (i = 0;;i++)
161                 {
162                         if (theSrcCStr[i] == 0 || i >= maxDstStrLength - 1 || i >= maxCharsToCopy)
163                         {
164                                 theDstCStr[i] = 0;
165                                 
166                                 break;
167                         }
168                         
169                         else
170                         {
171                                 theDstCStr[i] = theSrcCStr[i];
172                         }
173                 }
174         }
175 }
176
177
178
179 void CopyCSubstrToPStr(const char *theSrcCStr,const int maxCharsToCopy,unsigned char *theDstPStr,const int maxDstStrLength)
180 {
181 int             i;
182 int             theMaxDstStrLength;
183
184         
185         theMaxDstStrLength = maxDstStrLength;
186
187         if (theDstPStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
188         {
189                 if (theMaxDstStrLength > 255)
190                 {
191                         theMaxDstStrLength = 255;
192                 }
193                 
194                 
195                 for (i = 0;;i++)
196                 {
197                         if (theSrcCStr[i] == 0 || i >= theMaxDstStrLength - 1 || i >= maxCharsToCopy)
198                         {
199                                 theDstPStr[0] = i;
200                                 
201                                 break;
202                         }
203                         
204                         else
205                         {
206                                 theDstPStr[i + 1] = theSrcCStr[i];
207                         }
208                 }
209         }
210 }
211
212
213
214 void CopyCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength)
215 {
216 int             i;
217 int             theMaxDstStrLength;
218
219         
220         theMaxDstStrLength = maxDstStrLength;
221
222         if (theDstPStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
223         {
224                 if (theMaxDstStrLength > 255)
225                 {
226                         theMaxDstStrLength = 255;
227                 }
228                 
229                 
230                 for (i = 0;;i++)
231                 {
232                         if (i >= theMaxDstStrLength - 1 || theSrcCStr[i] == 0)
233                         {
234                                 theDstPStr[0] = i;
235                                 
236                                 break;
237                         }
238                         
239                         else
240                         {
241                                 theDstPStr[i + 1] = theSrcCStr[i];
242                         }
243                 }
244         }
245 }
246
247
248 void ConcatPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength)
249 {
250 int             i,numPChars,cStrLength;
251
252
253         if (thePStr != nil && theCStr != nil && maxCStrLength > 0)
254         {
255                 for (cStrLength = 0;theCStr[cStrLength] != 0;cStrLength++)
256                 {
257                 
258                 }
259                 
260
261                 numPChars = thePStr[0];
262                 
263                 
264                 for (i = 0;;i++)
265                 {
266                         if (i >= numPChars || cStrLength >= maxCStrLength - 1)
267                         {
268                                 theCStr[cStrLength++] = 0;
269                                 
270                                 break;
271                         }
272                         
273                         else
274                         {
275                                 theCStr[cStrLength++] = thePStr[i + 1];
276                         }
277                 }
278         }
279 }
280
281
282
283 void ConcatPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength)
284 {
285 int             theMaxDstStrLength;
286
287         
288         theMaxDstStrLength = maxDstStrLength;
289         
290         if (theSrcPStr != nil && theDstPStr != nil && theMaxDstStrLength > 0)
291         {
292                 if (theMaxDstStrLength > 255)
293                 {
294                         theMaxDstStrLength = 255;
295                 }
296                 
297                 
298                 if (theMaxDstStrLength - theDstPStr[0] - 1 < theSrcPStr[0])
299                 {
300                         BlockMove(theSrcPStr + 1,theDstPStr + theDstPStr[0] + 1,theMaxDstStrLength - 1 - theDstPStr[0]);
301                         
302                         theDstPStr[0] = theMaxDstStrLength - 1;
303                 }
304                 
305                 else
306                 {
307                         BlockMove(theSrcPStr + 1,theDstPStr + theDstPStr[0] + 1,theSrcPStr[0]);
308                         
309                         theDstPStr[0] += theSrcPStr[0];
310                 }
311         }
312 }
313
314
315
316 void ConcatCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength)
317 {
318 int             i,thePStrLength;
319 int             theMaxDstStrLength;
320
321         
322         theMaxDstStrLength = maxDstStrLength;
323
324         if (theSrcCStr != nil && theDstPStr != nil && theMaxDstStrLength > 0)
325         {
326                 if (theMaxDstStrLength > 255)
327                 {
328                         theMaxDstStrLength = 255;
329                 }
330                 
331                 
332                 thePStrLength = theDstPStr[0];
333                 
334                 for (i = 0;;i++)
335                 {
336                         if (theSrcCStr[i] == 0 || thePStrLength >= theMaxDstStrLength - 1)
337                         {
338                                 theDstPStr[0] = thePStrLength;
339                                 
340                                 break;
341                         }
342                         
343                         else
344                         {
345                                 theDstPStr[thePStrLength + 1] = theSrcCStr[i];
346                                 
347                                 thePStrLength++;
348                         }
349                 }
350         }
351 }
352
353
354
355 void ConcatCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxCStrLength)
356 {
357 int             cStrLength;
358
359
360         if (theSrcCStr != nil && theDstCStr != nil && maxCStrLength > 0)
361         {
362                 for (cStrLength = 0;theDstCStr[cStrLength] != 0;cStrLength++)
363                 {
364                 
365                 }
366                 
367
368                 for (;;)
369                 {
370                         if (*theSrcCStr == 0 || cStrLength >= maxCStrLength - 1)
371                         {
372                                 theDstCStr[cStrLength++] = 0;
373                                 
374                                 break;
375                         }
376                         
377                         else
378                         {
379                                 theDstCStr[cStrLength++] = *theSrcCStr++;
380                         }
381                 }
382         }
383 }
384
385
386
387 void ConcatCharToCStr(const char theChar,char *theDstCStr,const int maxCStrLength)
388 {
389 int             cStrLength;
390
391
392         if (theDstCStr != nil && maxCStrLength > 0)
393         {
394                 cStrLength = CStrLength(theDstCStr);
395                 
396                 if (cStrLength < maxCStrLength - 1)
397                 {
398                         theDstCStr[cStrLength++] = theChar;
399                         theDstCStr[cStrLength++] = '\0';
400                 }
401         }
402 }
403
404
405
406 void ConcatCharToPStr(const char theChar,unsigned char *theDstPStr,const int maxPStrLength)
407 {
408 int             pStrLength;
409
410
411         if (theDstPStr != nil && maxPStrLength > 0)
412         {
413                 pStrLength = PStrLength(theDstPStr);
414                 
415                 if (pStrLength < maxPStrLength - 1 && pStrLength < 255)
416                 {
417                         theDstPStr[pStrLength + 1] = theChar;
418                         theDstPStr[0] += 1;
419                 }
420         }
421 }
422
423
424
425
426 int CompareCStrs(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase)
427 {
428 int             returnValue;
429 char    firstChar,secondChar;
430
431         
432         returnValue = 0;
433         
434         
435         if (theFirstCStr != nil && theSecondCStr != nil)
436         {
437                 for (;;)
438                 {
439                         firstChar = *theFirstCStr;
440                         secondChar = *theSecondCStr;
441                         
442                         if (ignoreCase == true)
443                         {
444                                 if (firstChar >= 'A' && firstChar <= 'Z')
445                                 {
446                                         firstChar = 'a' + (firstChar - 'A');
447                                 }
448                                 
449                                 if (secondChar >= 'A' && secondChar <= 'Z')
450                                 {
451                                         secondChar = 'a' + (secondChar - 'A');
452                                 }
453                         }
454                         
455                         
456                         if (firstChar == 0 && secondChar != 0)
457                         {
458                                 returnValue = -1;
459                                 
460                                 break;
461                         }
462                         
463                         else if (firstChar != 0 && secondChar == 0)
464                         {
465                                 returnValue = 1;
466                                 
467                                 break;
468                         }
469                         
470                         else if (firstChar == 0 && secondChar == 0)
471                         {
472                                 returnValue = 0;
473                                 
474                                 break;
475                         }
476                         
477                         else if (firstChar < secondChar)
478                         {
479                                 returnValue = -1;
480                                 
481                                 break;
482                         }
483                         
484                         else if (firstChar > secondChar)
485                         {
486                                 returnValue = 1;
487                                 
488                                 break;
489                         }
490                         
491                         theFirstCStr++;
492                         theSecondCStr++;
493                 }
494         }
495         
496         
497         return(returnValue);
498 }
499
500
501
502 Boolean CStrsAreEqual(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase)
503 {
504         if (CompareCStrs(theFirstCStr,theSecondCStr,ignoreCase) == 0)
505         {
506                 return true;
507         }
508         
509         else
510         {
511                 return false;
512         }
513 }
514
515
516 Boolean PStrsAreEqual(const unsigned char *theFirstPStr,const unsigned char *theSecondPStr,const Boolean ignoreCase)
517 {
518         if (ComparePStrs(theFirstPStr,theSecondPStr,ignoreCase) == 0)
519         {
520                 return true;
521         }
522         
523         else
524         {
525                 return false;
526         }
527 }
528
529
530
531 int ComparePStrs(const unsigned char *theFirstPStr,const unsigned char *theSecondPStr,const Boolean ignoreCase)
532 {
533 int             i,returnValue;
534 char    firstChar,secondChar;
535
536         
537         returnValue = 0;
538         
539         
540         if (theFirstPStr != nil && theSecondPStr != nil)
541         {
542                 for (i = 1;;i++)
543                 {
544                         firstChar = theFirstPStr[i];
545                         secondChar = theSecondPStr[i];
546
547                         if (ignoreCase == true)
548                         {
549                                 if (firstChar >= 'A' && firstChar <= 'Z')
550                                 {
551                                         firstChar = 'a' + (firstChar - 'A');
552                                 }
553                                 
554                                 if (secondChar >= 'A' && secondChar <= 'Z')
555                                 {
556                                         secondChar = 'a' + (secondChar - 'A');
557                                 }
558                         }
559
560
561                         if (theFirstPStr[0] < i && theSecondPStr[0] >= i)
562                         {
563                                 returnValue = -1;
564                                 
565                                 break;
566                         }
567                         
568                         else if (theFirstPStr[0] >= i && theSecondPStr[0] < i)
569                         {
570                                 returnValue = 1;
571                                 
572                                 break;
573                         }
574                         
575                         else if (theFirstPStr[0] < i && theSecondPStr[0] < i)
576                         {
577                                 returnValue = 0;
578                                 
579                                 break;
580                         }
581                         
582                         else if (firstChar < secondChar)
583                         {
584                                 returnValue = -1;
585                                 
586                                 break;
587                         }
588                         
589                         else if (firstChar > secondChar)
590                         {
591                                 returnValue = 1;
592                                 
593                                 break;
594                         }
595                 }
596         }
597         
598         
599         return(returnValue);
600 }
601
602
603
604 int CompareCStrToPStr(const char *theCStr,const unsigned char *thePStr,const Boolean ignoreCase)
605 {
606 int             returnValue;
607 char    tempString[256];
608
609         
610         returnValue = 0;
611         
612         if (theCStr != nil && thePStr != nil)
613         {
614                 CopyPStrToCStr(thePStr,tempString,sizeof(tempString));
615                 
616                 returnValue = CompareCStrs(theCStr,tempString,ignoreCase);
617         }
618         
619         
620         return(returnValue);
621 }
622
623
624
625 void ConcatLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits)
626 {
627 Str255          theStr255;
628
629
630         NumToString(theNum,theStr255);
631
632
633         if (numDigits > 0)
634         {
635         int     charsToInsert;
636         
637                 
638                 charsToInsert = numDigits - PStrLength(theStr255);
639                 
640                 if (charsToInsert > 0)
641                 {
642                 char    tempString[256];
643                         
644                         CopyCStrToCStr("",tempString,sizeof(tempString));
645                         
646                         for (;charsToInsert > 0;charsToInsert--)
647                         {
648                                 ConcatCStrToCStr("0",tempString,sizeof(tempString));
649                         }
650                         
651                         ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
652                         
653                         CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
654                 }
655         }
656
657
658         ConcatPStrToCStr(theStr255,theCStr,maxCStrLength);
659 }
660
661
662
663
664 void ConcatLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits)
665 {
666 Str255          theStr255;
667
668
669         NumToString(theNum,theStr255);
670
671
672         if (numDigits > 0)
673         {
674         int     charsToInsert;
675         
676                 
677                 charsToInsert = numDigits - PStrLength(theStr255);
678                 
679                 if (charsToInsert > 0)
680                 {
681                 char    tempString[256];
682                         
683                         CopyCStrToCStr("",tempString,sizeof(tempString));
684                         
685                         for (;charsToInsert > 0;charsToInsert--)
686                         {
687                                 ConcatCStrToCStr("0",tempString,sizeof(tempString));
688                         }
689                         
690                         ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
691                         
692                         CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
693                 }
694         }
695
696
697         ConcatPStrToPStr(theStr255,thePStr,maxPStrLength);
698 }
699
700
701
702 void CopyCStrAndConcatLongIntToCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
703 {
704         CopyCStrToCStr(theSrcCStr,theDstCStr,maxDstStrLength);
705         
706         ConcatLongIntToCStr(theNum,theDstCStr,maxDstStrLength);
707 }
708
709
710
711 void CopyLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits)
712 {
713 Str255          theStr255;
714
715
716         NumToString(theNum,theStr255);
717
718
719         if (numDigits > 0)
720         {
721         int     charsToInsert;
722         
723                 
724                 charsToInsert = numDigits - PStrLength(theStr255);
725                 
726                 if (charsToInsert > 0)
727                 {
728                 char    tempString[256];
729                         
730                         CopyCStrToCStr("",tempString,sizeof(tempString));
731                         
732                         for (;charsToInsert > 0;charsToInsert--)
733                         {
734                                 ConcatCStrToCStr("0",tempString,sizeof(tempString));
735                         }
736                         
737                         ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
738                         
739                         CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
740                 }
741         }
742
743
744         CopyPStrToCStr(theStr255,theCStr,maxCStrLength);
745 }
746
747
748
749
750
751 void CopyUnsignedLongIntToCStr(const unsigned long theNum,char *theCStr,const int maxCStrLength)
752 {
753 char                    tempString[256];
754 int                             srcCharIndex,dstCharIndex;
755 unsigned long   tempNum,quotient,remainder;
756
757         
758         if (theNum == 0)
759         {
760                 CopyCStrToCStr("0",theCStr,maxCStrLength);
761         }
762         
763         else
764         {
765                 srcCharIndex = 0;
766                 
767                 tempNum = theNum;
768                 
769                 for (;;)
770                 {
771                         if (srcCharIndex >= sizeof(tempString) - 1 || tempNum == 0)
772                         {
773                                 for (dstCharIndex = 0;;)
774                                 {
775                                         if (dstCharIndex >= maxCStrLength - 1 || srcCharIndex <= 0)
776                                         {
777                                                 theCStr[dstCharIndex] = 0;
778                                                 
779                                                 break;
780                                         }
781                                         
782                                         theCStr[dstCharIndex++] = tempString[--srcCharIndex];
783                                 }
784                                 
785                                 break;
786                         }
787                         
788
789                         quotient = tempNum / 10;
790                         
791                         remainder = tempNum - (quotient * 10);
792                         
793                         tempString[srcCharIndex] = '0' + remainder;
794                         
795                         srcCharIndex++;
796                         
797                         tempNum = quotient;
798                 }
799         }
800 }
801
802
803
804
805 void CopyLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits)
806 {
807 char    tempString[256];
808
809
810         CopyLongIntToCStr(theNum,tempString,sizeof(tempString),numDigits);
811         
812         CopyCStrToPStr(tempString,thePStr,maxPStrLength);
813 }
814
815
816
817 OSErr CopyLongIntToNewHandle(const long inTheLongInt,Handle *theHandle)
818 {
819 OSErr           errCode = noErr;
820 char            tempString[32];
821         
822         
823         CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
824         
825         errCode = CopyCStrToNewHandle(tempString,theHandle);
826
827         return(errCode);
828 }
829
830
831 OSErr CopyLongIntToExistingHandle(const long inTheLongInt,Handle theHandle)
832 {
833 OSErr           errCode = noErr;
834 char            tempString[32];
835         
836         
837         CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
838         
839         errCode = CopyCStrToExistingHandle(tempString,theHandle);
840
841         return(errCode);
842 }
843
844
845
846
847 OSErr CopyCStrToExistingHandle(const char *theCString,Handle theHandle)
848 {
849 OSErr   errCode = noErr;
850 long    stringLength;
851
852         
853         if (theCString == nil)
854         {
855                 SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, theCString == nil"));
856         }
857
858         if (theHandle == nil)
859         {
860                 SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, theHandle == nil"));
861         }
862
863         if (*theHandle == nil)
864         {
865                 SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, *theHandle == nil"));
866         }
867
868
869
870         stringLength = CStrLength(theCString) + 1;
871         
872         SetHandleSize(theHandle,stringLength);
873         
874         if (GetHandleSize(theHandle) < stringLength)
875         {
876                 SetErrorMessageAndLongIntAndBail("CopyCStrToExistingHandle: Can't set Handle size, MemError() = ",MemError());
877         }
878         
879         
880         ::BlockMove(theCString,*theHandle,stringLength);
881         
882
883 EXITPOINT:
884         
885         return(errCode);
886 }
887
888
889
890
891
892 OSErr CopyCStrToNewHandle(const char *theCString,Handle *theHandle)
893 {
894 OSErr   errCode = noErr;
895 long    stringLength;
896
897         
898         if (theCString == nil)
899         {
900                 SetErrorMessageAndBail(("CopyCStrToNewHandle: Bad parameter, theCString == nil"));
901         }
902
903         if (theHandle == nil)
904         {
905                 SetErrorMessageAndBail(("CopyCStrToNewHandle: Bad parameter, theHandle == nil"));
906         }
907
908
909
910         stringLength = CStrLength(theCString) + 1;
911         
912         *theHandle = NewHandle(stringLength);
913         
914         if (*theHandle == nil)
915         {
916                 SetErrorMessageAndLongIntAndBail("CopyCStrToNewHandle: Can't allocate Handle, MemError() = ",MemError());
917         }
918         
919         
920         ::BlockMove(theCString,**theHandle,stringLength);
921         
922
923 EXITPOINT:
924         
925         return(errCode);
926 }
927
928
929
930 OSErr CopyPStrToNewHandle(const unsigned char *thePString,Handle *theHandle)
931 {
932 OSErr   errCode = noErr;
933 long    stringLength;
934
935         
936         if (thePString == nil)
937         {
938                 SetErrorMessageAndBail(("CopyPStrToNewHandle: Bad parameter, thePString == nil"));
939         }
940
941         if (theHandle == nil)
942         {
943                 SetErrorMessageAndBail(("CopyPStrToNewHandle: Bad parameter, theHandle == nil"));
944         }
945
946
947
948         stringLength = PStrLength(thePString) + 1;
949         
950         *theHandle = NewHandle(stringLength);
951         
952         if (*theHandle == nil)
953         {
954                 SetErrorMessageAndLongIntAndBail("CopyPStrToNewHandle: Can't allocate Handle, MemError() = ",MemError());
955         }
956         
957         
958         if (stringLength > 1)
959         {
960                 BlockMove(thePString + 1,**theHandle,stringLength - 1);
961         }
962         
963         (**theHandle)[stringLength - 1] = 0;
964         
965
966 EXITPOINT:
967         
968         return(errCode);
969 }
970
971
972 OSErr AppendPStrToHandle(const unsigned char *thePString,Handle theHandle,long *currentLength)
973 {
974 OSErr           errCode = noErr;
975 char            tempString[256];
976
977         
978         CopyPStrToCStr(thePString,tempString,sizeof(tempString));
979         
980         errCode = AppendCStrToHandle(tempString,theHandle,currentLength);
981         
982
983 EXITPOINT:
984         
985         return(errCode);
986 }
987
988
989
990 OSErr AppendCStrToHandle(const char *theCString,Handle theHandle,long *currentLength,long *maxLength)
991 {
992 OSErr           errCode = noErr;
993 long            handleMaxLength,handleCurrentLength,stringLength,byteCount;
994
995
996         if (theCString == nil)
997         {
998                 SetErrorMessageAndBail(("AppendCStrToHandle: Bad parameter, theCString == nil"));
999         }
1000
1001         if (theHandle == nil)
1002         {
1003                 SetErrorMessageAndBail(("AppendCStrToHandle: Bad parameter, theHandle == nil"));
1004         }
1005         
1006         
1007         if (maxLength != nil)
1008         {
1009                 handleMaxLength = *maxLength;
1010         }
1011         
1012         else
1013         {
1014                 handleMaxLength = GetHandleSize(theHandle);
1015         }
1016         
1017         
1018         if (currentLength != nil && *currentLength >= 0)
1019         {
1020                 handleCurrentLength = *currentLength;
1021         }
1022         
1023         else
1024         {
1025                 handleCurrentLength = CStrLength(*theHandle);
1026         }
1027         
1028         
1029         stringLength = CStrLength(theCString);
1030         
1031         byteCount = handleCurrentLength + stringLength + 1;
1032         
1033         if (byteCount > handleMaxLength)
1034         {
1035                 SetHandleSize(theHandle,handleCurrentLength + stringLength + 1);
1036                 
1037                 if (maxLength != nil)
1038                 {
1039                         *maxLength = GetHandleSize(theHandle);
1040                         
1041                         handleMaxLength = *maxLength;
1042                 }
1043                 
1044                 else
1045                 {
1046                         handleMaxLength = GetHandleSize(theHandle);
1047                 }
1048
1049                 if (byteCount > handleMaxLength)
1050                 {
1051                         SetErrorMessageAndLongIntAndBail("AppendCStrToHandle: Can't increase Handle allocation, MemError() = ",MemError());
1052                 }
1053         }
1054         
1055         
1056         BlockMove(theCString,*theHandle + handleCurrentLength,stringLength + 1);
1057         
1058         
1059         if (currentLength != nil)
1060         {
1061                 *currentLength += stringLength;
1062         }
1063
1064
1065         errCode = noErr;
1066         
1067         
1068 EXITPOINT:
1069
1070         return(errCode);
1071 }
1072
1073
1074
1075 OSErr AppendCharsToHandle(const char *theChars,const int numChars,Handle theHandle,long *currentLength,long *maxLength)
1076 {
1077 OSErr           errCode = noErr;
1078 long            handleMaxLength,handleCurrentLength,byteCount;
1079
1080
1081         if (theChars == nil)
1082         {
1083                 SetErrorMessageAndBail(("AppendCharsToHandle: Bad parameter, theChars == nil"));
1084         }
1085
1086         if (theHandle == nil)
1087         {
1088                 SetErrorMessageAndBail(("AppendCharsToHandle: Bad parameter, theHandle == nil"));
1089         }
1090         
1091         
1092         if (maxLength != nil)
1093         {
1094                 handleMaxLength = *maxLength;
1095         }
1096         
1097         else
1098         {
1099                 handleMaxLength = GetHandleSize(theHandle);
1100         }
1101         
1102         
1103         if (currentLength != nil && *currentLength >= 0)
1104         {
1105                 handleCurrentLength = *currentLength;
1106         }
1107         
1108         else
1109         {
1110                 handleCurrentLength = CStrLength(*theHandle);
1111         }
1112         
1113         
1114         byteCount = handleCurrentLength + numChars + 1;
1115         
1116         if (byteCount > handleMaxLength)
1117         {
1118                 SetHandleSize(theHandle,handleCurrentLength + numChars + 1);
1119                 
1120                 if (maxLength != nil)
1121                 {
1122                         *maxLength = GetHandleSize(theHandle);
1123                         
1124                         handleMaxLength = *maxLength;
1125                 }
1126                 
1127                 else
1128                 {
1129                         handleMaxLength = GetHandleSize(theHandle);
1130                 }
1131
1132                 if (byteCount > handleMaxLength)
1133                 {
1134                         SetErrorMessageAndLongIntAndBail("AppendCharsToHandle: Can't increase Handle allocation, MemError() = ",MemError());
1135                 }
1136         }
1137         
1138         
1139         BlockMove(theChars,*theHandle + handleCurrentLength,numChars);
1140         
1141         (*theHandle)[handleCurrentLength + numChars] = '\0';
1142         
1143         if (currentLength != nil)
1144         {
1145                 *currentLength += numChars;
1146         }
1147
1148
1149         errCode = noErr;
1150         
1151         
1152 EXITPOINT:
1153
1154         return(errCode);
1155 }
1156
1157
1158
1159 OSErr AppendLongIntToHandle(const long inTheLongInt,Handle theHandle,long *currentLength)
1160 {
1161 OSErr           errCode = noErr;
1162 char            tempString[32];
1163         
1164         
1165         CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
1166         
1167         errCode = AppendCStrToHandle(tempString,theHandle,currentLength);
1168
1169         return(errCode);
1170 }
1171
1172
1173
1174
1175 long CStrLength(const char *theCString)
1176 {
1177 long    cStrLength = 0;
1178
1179         
1180         if (theCString != nil)
1181         {
1182                 for (cStrLength = 0;theCString[cStrLength] != 0;cStrLength++)
1183                 {
1184                 
1185                 }
1186         }
1187         
1188         
1189         return(cStrLength);
1190 }
1191
1192
1193
1194 long PStrLength(const unsigned char *thePString)
1195 {
1196 long    pStrLength = 0;
1197
1198         
1199         if (thePString != nil)
1200         {
1201                 pStrLength = thePString[0];
1202         }
1203         
1204         
1205         return(pStrLength);
1206 }
1207
1208
1209
1210
1211
1212 void ZeroMem(void *theMemPtr,const unsigned long numBytes)
1213 {
1214 unsigned char   *theBytePtr;
1215 unsigned long   *theLongPtr;
1216 unsigned long   numSingleBytes;
1217 unsigned long   theNumBytes;
1218
1219         
1220         theNumBytes = numBytes;
1221         
1222         if (theMemPtr != nil && theNumBytes > 0)
1223         {
1224                 theBytePtr = (unsigned char     *) theMemPtr;
1225                 
1226                 numSingleBytes = (unsigned long) theBytePtr & 0x0003;
1227                 
1228                 while (numSingleBytes > 0)
1229                 {
1230                         *theBytePtr++ = 0;
1231                         
1232                         theNumBytes--;
1233                         numSingleBytes--;
1234                 }
1235                 
1236
1237                 theLongPtr = (unsigned long     *) theBytePtr;
1238                 
1239                 while (theNumBytes >= 4)
1240                 {
1241                         *theLongPtr++ = 0;
1242                         
1243                         theNumBytes -= 4;
1244                 }
1245                 
1246                 
1247                 theBytePtr = (unsigned char     *) theLongPtr;
1248                 
1249                 while (theNumBytes > 0)
1250                 {
1251                         *theBytePtr++ = 0;
1252                         
1253                         theNumBytes--;
1254                 }
1255         }
1256 }
1257
1258
1259
1260
1261 char *FindCharInCStr(const char theChar,const char *theCString)
1262 {
1263 char    *theStringSearchPtr;
1264
1265         
1266         theStringSearchPtr = (char      *) theCString;
1267         
1268         if (theStringSearchPtr != nil)
1269         {
1270                 while (*theStringSearchPtr != '\0' && *theStringSearchPtr != theChar)
1271                 {
1272                         theStringSearchPtr++;
1273                 }
1274                 
1275                 if (*theStringSearchPtr == '\0')
1276                 {
1277                         theStringSearchPtr = nil;
1278                 }
1279         }
1280         
1281         return(theStringSearchPtr);
1282 }
1283
1284
1285
1286 long FindCharOffsetInCStr(const char theChar,const char *theCString,const Boolean inIgnoreCase)
1287 {
1288 long    theOffset = -1;
1289
1290
1291         if (theCString != nil)
1292         {
1293                 theOffset = 0;
1294                 
1295
1296                 if (inIgnoreCase)
1297                 {
1298                 char    searchChar = theChar;
1299                 
1300                         if (searchChar >= 'a' && searchChar <= 'z')
1301                         {
1302                                 searchChar = searchChar - 'a' + 'A';
1303                         }
1304                         
1305                         
1306                         while (*theCString != 0)
1307                         {
1308                         char    currentChar = *theCString;
1309                         
1310                                 if (currentChar >= 'a' && currentChar <= 'z')
1311                                 {
1312                                         currentChar = currentChar - 'a' + 'A';
1313                                 }
1314                         
1315                                 if (currentChar == searchChar)
1316                                 {
1317                                         break;
1318                                 }
1319                                 
1320                                 theCString++;
1321                                 theOffset++;
1322                         }
1323                 }
1324                 
1325                 else
1326                 {
1327                         while (*theCString != 0 && *theCString != theChar)
1328                         {
1329                                 theCString++;
1330                                 theOffset++;
1331                         }
1332                 }
1333                 
1334                 if (*theCString == 0)
1335                 {
1336                         theOffset = -1;
1337                 }
1338         }
1339         
1340         return(theOffset);
1341 }
1342
1343
1344 long FindCStrOffsetInCStr(const char *theCSubstring,const char *theCString,const Boolean inIgnoreCase)
1345 {
1346 long    theOffset = -1;
1347
1348
1349         if (theCSubstring != nil && theCString != nil)
1350         {
1351                 for (theOffset = 0;;theOffset++)
1352                 {
1353                         if (theCString[theOffset] == 0)
1354                         {
1355                                 theOffset = -1;
1356                                 
1357                                 goto EXITPOINT;
1358                         }
1359                         
1360                         
1361                         for (const char *tempSubstringPtr = theCSubstring,*tempCStringPtr = theCString + theOffset;;tempSubstringPtr++,tempCStringPtr++)
1362                         {
1363                                 if (*tempSubstringPtr == 0)
1364                                 {
1365                                         goto EXITPOINT;
1366                                 }
1367                                 
1368                                 else if (*tempCStringPtr == 0)
1369                                 {
1370                                         break;
1371                                 }
1372                         
1373                         char    searchChar = *tempSubstringPtr;
1374                         char    currentChar = *tempCStringPtr;
1375                         
1376                                 if (inIgnoreCase && searchChar >= 'a' && searchChar <= 'z')
1377                                 {
1378                                         searchChar = searchChar - 'a' + 'A';
1379                                 }
1380                                 
1381                                 if (inIgnoreCase && currentChar >= 'a' && currentChar <= 'z')
1382                                 {
1383                                         currentChar = currentChar - 'a' + 'A';
1384                                 }
1385                                 
1386                                 if (currentChar != searchChar)
1387                                 {
1388                                         break;
1389                                 }
1390                         }
1391                 }
1392                 
1393                 theOffset = -1;
1394         }
1395
1396
1397 EXITPOINT:
1398         
1399         return(theOffset);
1400 }
1401
1402
1403
1404 void InsertCStrIntoCStr(const char *theSrcCStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength)
1405 {
1406 int             currentLength;
1407 int             insertLength;
1408 int             numCharsToInsert;
1409 int             numCharsToShift;
1410
1411         
1412         if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0 && theInsertionOffset < maxDstStrLength - 1)
1413         {
1414                 currentLength = CStrLength(theDstCStr);
1415                 
1416                 insertLength = CStrLength(theSrcCStr);
1417                 
1418
1419                 if (theInsertionOffset + insertLength < maxDstStrLength - 1)
1420                 {
1421                         numCharsToInsert = insertLength;
1422                 }
1423                 
1424                 else
1425                 {
1426                         numCharsToInsert = maxDstStrLength - 1 - theInsertionOffset;
1427                 }
1428                 
1429
1430                 if (numCharsToInsert + currentLength < maxDstStrLength - 1)
1431                 {
1432                         numCharsToShift = currentLength - theInsertionOffset;
1433                 }
1434                 
1435                 else
1436                 {
1437                         numCharsToShift = maxDstStrLength - 1 - theInsertionOffset - numCharsToInsert;
1438                 }
1439
1440                 
1441                 if (numCharsToShift > 0)
1442                 {
1443                         BlockMove(theDstCStr + theInsertionOffset,theDstCStr + theInsertionOffset + numCharsToInsert,numCharsToShift);
1444                 }
1445                 
1446                 if (numCharsToInsert > 0)
1447                 {
1448                         BlockMove(theSrcCStr,theDstCStr + theInsertionOffset,numCharsToInsert);
1449                 }
1450                 
1451                 theDstCStr[theInsertionOffset + numCharsToInsert + numCharsToShift] = 0;
1452         }
1453 }
1454
1455
1456
1457 void InsertPStrIntoCStr(const unsigned char *theSrcPStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength)
1458 {
1459 int             currentLength;
1460 int             insertLength;
1461 int             numCharsToInsert;
1462 int             numCharsToShift;
1463
1464         
1465         if (theDstCStr != nil && theSrcPStr != nil && maxDstStrLength > 0 && theInsertionOffset < maxDstStrLength - 1)
1466         {
1467                 currentLength = CStrLength(theDstCStr);
1468                 
1469                 insertLength = PStrLength(theSrcPStr);
1470                 
1471
1472                 if (theInsertionOffset + insertLength < maxDstStrLength - 1)
1473                 {
1474                         numCharsToInsert = insertLength;
1475                 }
1476                 
1477                 else
1478                 {
1479                         numCharsToInsert = maxDstStrLength - 1 - theInsertionOffset;
1480                 }
1481                 
1482
1483                 if (numCharsToInsert + currentLength < maxDstStrLength - 1)
1484                 {
1485                         numCharsToShift = currentLength - theInsertionOffset;
1486                 }
1487                 
1488                 else
1489                 {
1490                         numCharsToShift = maxDstStrLength - 1 - theInsertionOffset - numCharsToInsert;
1491                 }
1492
1493                 
1494                 if (numCharsToShift > 0)
1495                 {
1496                         BlockMove(theDstCStr + theInsertionOffset,theDstCStr + theInsertionOffset + numCharsToInsert,numCharsToShift);
1497                 }
1498                 
1499                 if (numCharsToInsert > 0)
1500                 {
1501                         BlockMove(theSrcPStr + 1,theDstCStr + theInsertionOffset,numCharsToInsert);
1502                 }
1503                 
1504                 theDstCStr[theInsertionOffset + numCharsToInsert + numCharsToShift] = 0;
1505         }
1506 }
1507
1508
1509
1510 OSErr InsertCStrIntoHandle(const char *theCString,Handle theHandle,const long inInsertOffset)
1511 {
1512 OSErr   errCode;
1513 int             currentLength;
1514 int             insertLength;
1515
1516         
1517         SetErrorMessageAndBailIfNil(theCString,"InsertCStrIntoHandle: Bad parameter, theCString == nil");
1518
1519         SetErrorMessageAndBailIfNil(theHandle,"InsertCStrIntoHandle: Bad parameter, theHandle == nil");
1520         
1521         currentLength = CStrLength(*theHandle);
1522         
1523         if (currentLength + 1 > ::GetHandleSize(theHandle))
1524         {
1525                 SetErrorMessageAndBail("InsertCStrIntoHandle: Handle has been overflowed");
1526         }
1527         
1528         if (inInsertOffset > currentLength)
1529         {
1530                 SetErrorMessageAndBail("InsertCStrIntoHandle: Insertion offset is greater than string length");
1531         }
1532         
1533         insertLength = CStrLength(theCString);
1534         
1535         ::SetHandleSize(theHandle,currentLength + 1 + insertLength);
1536         
1537         if (::GetHandleSize(theHandle) < currentLength + 1 + insertLength)
1538         {
1539                 SetErrorMessageAndLongIntAndBail("InsertCStrIntoHandle: Can't expand storage for Handle, MemError() = ",MemError());
1540         }
1541         
1542         ::BlockMove(*theHandle + inInsertOffset,*theHandle + inInsertOffset + insertLength,currentLength - inInsertOffset + 1);
1543         
1544         ::BlockMove(theCString,*theHandle + inInsertOffset,insertLength);
1545
1546
1547         errCode = noErr;
1548         
1549         
1550 EXITPOINT:
1551
1552         return(errCode);
1553 }
1554
1555
1556
1557
1558 void CopyCStrAndInsert1LongIntIntoCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
1559 {
1560         CopyCStrAndInsertCStrLongIntIntoCStr(theSrcCStr,nil,theNum,theDstCStr,maxDstStrLength);
1561 }
1562
1563
1564 void CopyCStrAndInsert2LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,char *theDstCStr,const int maxDstStrLength)
1565 {
1566 const long      theLongInts[] = { long1,long2 };
1567
1568         CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,nil,theLongInts,theDstCStr,maxDstStrLength);
1569 }
1570
1571
1572 void CopyCStrAndInsert3LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,const long long3,char *theDstCStr,const int maxDstStrLength)
1573 {
1574 const long      theLongInts[] = { long1,long2,long3 };
1575
1576         CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,nil,theLongInts,theDstCStr,maxDstStrLength);
1577 }
1578
1579
1580 void CopyCStrAndInsertCStrIntoCStr(const char *theSrcCStr,const char *theInsertCStr,char *theDstCStr,const int maxDstStrLength)
1581 {
1582 const char      *theCStrs[2] = { theInsertCStr,nil };
1583
1584         CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,theCStrs,nil,theDstCStr,maxDstStrLength);
1585 }
1586
1587
1588
1589 void CopyCStrAndInsertCStrLongIntIntoCStr(const char *theSrcCStr,const char *theInsertCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
1590 {
1591 const char      *theCStrs[2] = { theInsertCStr,nil };
1592 const long      theLongInts[1] = { theNum };
1593
1594         CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,theCStrs,theLongInts,theDstCStr,maxDstStrLength);
1595 }
1596
1597
1598
1599 void CopyCStrAndInsertCStrsLongIntsIntoCStr(const char *theSrcCStr,const char **theInsertCStrs,const long *theLongInts,char *theDstCStr,const int maxDstStrLength)
1600 {
1601 int                     dstCharIndex,srcCharIndex,theMaxDstStrLength;
1602 int                     theCStrIndex = 0;
1603 int                     theLongIntIndex = 0;
1604
1605         
1606         theMaxDstStrLength = maxDstStrLength;
1607         
1608         if (theDstCStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
1609         {
1610                 dstCharIndex = 0;
1611                 
1612                 srcCharIndex = 0;
1613                 
1614                 
1615                 //      Allow room for NULL at end of string
1616                 
1617                 theMaxDstStrLength--;
1618                 
1619                 
1620                 for (;;)
1621                 {
1622                         //      Hit end of buffer?
1623                         
1624                         if (dstCharIndex >= theMaxDstStrLength)
1625                         {
1626                                 theDstCStr[dstCharIndex++] = 0;
1627                                 
1628                                 goto EXITPOINT;
1629                         }
1630                         
1631                         //      End of source string?
1632                         
1633                         else if (theSrcCStr[srcCharIndex] == 0)
1634                         {
1635                                 theDstCStr[dstCharIndex++] = 0;
1636                                 
1637                                 goto EXITPOINT;
1638                         }
1639                         
1640                         //      Did we find a '%s'?
1641                         
1642                         else if (theInsertCStrs != nil && theInsertCStrs[theCStrIndex] != nil && theSrcCStr[srcCharIndex] == '%' && theSrcCStr[srcCharIndex + 1] == 's')
1643                         {
1644                                 //      Skip over the '%s'
1645                                 
1646                                 srcCharIndex += 2;
1647                                 
1648                                 
1649                                 //      Terminate the dest string and then concat the string
1650                                 
1651                                 theDstCStr[dstCharIndex] = 0;
1652                                 
1653                                 ConcatCStrToCStr(theInsertCStrs[theCStrIndex],theDstCStr,theMaxDstStrLength);
1654                                 
1655                                 dstCharIndex = CStrLength(theDstCStr);
1656                                 
1657                                 theCStrIndex++;
1658                         }
1659                         
1660                         //      Did we find a '%ld'?
1661                         
1662                         else if (theLongInts != nil && theSrcCStr[srcCharIndex] == '%' && theSrcCStr[srcCharIndex + 1] == 'l' && theSrcCStr[srcCharIndex + 2] == 'd')
1663                         {
1664                                 //      Skip over the '%ld'
1665                                 
1666                                 srcCharIndex += 3;
1667                                 
1668                                 
1669                                 //      Terminate the dest string and then concat the number
1670                                 
1671                                 theDstCStr[dstCharIndex] = 0;
1672                                 
1673                                 ConcatLongIntToCStr(theLongInts[theLongIntIndex],theDstCStr,theMaxDstStrLength);
1674                                 
1675                                 theLongIntIndex++;
1676                                 
1677                                 dstCharIndex = CStrLength(theDstCStr);
1678                         }
1679                         
1680                         else
1681                         {
1682                                 theDstCStr[dstCharIndex++] = theSrcCStr[srcCharIndex++];
1683                         }
1684                 }
1685         }
1686
1687
1688
1689 EXITPOINT:
1690
1691         return;
1692 }
1693
1694
1695
1696
1697
1698 OSErr CopyCStrAndInsertCStrLongIntIntoHandle(const char *theSrcCStr,const char *theInsertCStr,const long theNum,Handle *theHandle)
1699 {
1700 OSErr   errCode;
1701 long    byteCount;
1702
1703         
1704         if (theHandle != nil)
1705         {
1706                 byteCount = CStrLength(theSrcCStr) + CStrLength(theInsertCStr) + 32;
1707                 
1708                 *theHandle = NewHandle(byteCount);
1709                 
1710                 if (*theHandle == nil)
1711                 {
1712                         SetErrorMessageAndLongIntAndBail("CopyCStrAndInsertCStrLongIntIntoHandle: Can't allocate Handle, MemError() = ",MemError());
1713                 }
1714                 
1715                 
1716                 HLock(*theHandle);
1717                 
1718                 CopyCStrAndInsertCStrLongIntIntoCStr(theSrcCStr,theInsertCStr,theNum,**theHandle,byteCount);
1719                 
1720                 HUnlock(*theHandle);
1721         }
1722         
1723         errCode = noErr;
1724         
1725         
1726 EXITPOINT:
1727
1728         return(errCode);
1729 }
1730
1731
1732
1733
1734
1735 OSErr CopyIndexedWordToCStr(char *theSrcCStr,int whichWord,char *theDstCStr,int maxDstCStrLength)
1736 {
1737 OSErr           errCode;
1738 char            *srcCharPtr,*dstCharPtr;
1739 int                     wordCount;
1740 int                     byteCount;
1741
1742
1743         if (theSrcCStr == nil)
1744         {
1745                 SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, theSrcCStr == nil"));
1746         }
1747         
1748         if (theDstCStr == nil)
1749         {
1750                 SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, theDstCStr == nil"));
1751         }
1752         
1753         if (whichWord < 0)
1754         {
1755                 SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, whichWord < 0"));
1756         }
1757         
1758         if (maxDstCStrLength <= 0)
1759         {
1760                 SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, maxDstCStrLength <= 0"));
1761         }
1762
1763         
1764         *theDstCStr = '\0';
1765         
1766         srcCharPtr = theSrcCStr;
1767
1768         while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
1769         {
1770                 srcCharPtr++;
1771         }
1772         
1773
1774         for (wordCount = 0;wordCount < whichWord;wordCount++)
1775         {
1776                 while (*srcCharPtr != ' ' && *srcCharPtr != '\t' && *srcCharPtr != '\r' && *srcCharPtr != '\n' && *srcCharPtr != '\0')
1777                 {
1778                         srcCharPtr++;
1779                 }
1780                 
1781                 if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
1782                 {
1783                         errCode = noErr;
1784                         
1785                         goto EXITPOINT;
1786                 }
1787
1788                 while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
1789                 {
1790                         srcCharPtr++;
1791                 }
1792                 
1793                 if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
1794                 {
1795                         errCode = noErr;
1796                         
1797                         goto EXITPOINT;
1798                 }
1799         }
1800
1801
1802         dstCharPtr = theDstCStr;
1803         byteCount = 0;
1804         
1805         
1806         for(;;)
1807         {
1808                 if (byteCount >= maxDstCStrLength - 1 || *srcCharPtr == '\0' || *srcCharPtr == ' ' || *srcCharPtr == '\t' || *srcCharPtr == '\r' || *srcCharPtr == '\n')
1809                 {
1810                         *dstCharPtr = '\0';
1811                         break;
1812                 }
1813                 
1814                 *dstCharPtr++ = *srcCharPtr++;
1815                 
1816                 byteCount++;
1817         }
1818
1819
1820         errCode = noErr;
1821
1822
1823 EXITPOINT:
1824
1825         return(errCode);
1826 }
1827
1828
1829
1830
1831
1832 OSErr CopyIndexedWordToNewHandle(char *theSrcCStr,int whichWord,Handle *outTheHandle)
1833 {
1834 OSErr           errCode;
1835 char            *srcCharPtr;
1836 int                     wordCount;
1837 int                     byteCount;
1838
1839
1840         if (theSrcCStr == nil)
1841         {
1842                 SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, theSrcCStr == nil"));
1843         }
1844         
1845         if (outTheHandle == nil)
1846         {
1847                 SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, outTheHandle == nil"));
1848         }
1849         
1850         if (whichWord < 0)
1851         {
1852                 SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, whichWord < 0"));
1853         }
1854
1855         
1856         *outTheHandle = nil;
1857         
1858
1859         srcCharPtr = theSrcCStr;
1860
1861         while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
1862         {
1863                 srcCharPtr++;
1864         }
1865         
1866
1867         for (wordCount = 0;wordCount < whichWord;wordCount++)
1868         {
1869                 while (*srcCharPtr != ' ' && *srcCharPtr != '\t' && *srcCharPtr != '\r' && *srcCharPtr != '\n' && *srcCharPtr != '\0')
1870                 {
1871                         srcCharPtr++;
1872                 }
1873                 
1874                 if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
1875                 {
1876                         break;
1877                 }
1878
1879                 while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
1880                 {
1881                         srcCharPtr++;
1882                 }
1883                 
1884                 if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
1885                 {
1886                         break;
1887                 }
1888         }
1889
1890
1891         for (byteCount = 0;;byteCount++)
1892         {
1893                 if (srcCharPtr[byteCount] == ' ' || srcCharPtr[byteCount] == '\t' || srcCharPtr[byteCount] == '\r' || srcCharPtr[byteCount] == '\n' || srcCharPtr[byteCount] == '\0')
1894                 {
1895                         break;
1896                 }
1897         }
1898
1899         
1900         *outTheHandle = NewHandle(byteCount + 1);
1901         
1902         if (*outTheHandle == nil)
1903         {
1904                 SetErrorMessageAndLongIntAndBail("CopyIndexedWordToNewHandle: Can't allocate Handle, MemError() = ",MemError());
1905         }
1906         
1907         
1908         ::BlockMove(srcCharPtr,**outTheHandle,byteCount);
1909         
1910         (**outTheHandle)[byteCount] = '\0';
1911
1912         errCode = noErr;
1913
1914
1915 EXITPOINT:
1916
1917         return(errCode);
1918 }
1919
1920
1921
1922 OSErr CopyIndexedLineToCStr(const char *theSrcCStr,int inWhichLine,int *lineEndIndex,Boolean *gotLastLine,char *theDstCStr,const int maxDstCStrLength)
1923 {
1924 OSErr           errCode;
1925 int                     theCurrentLine;
1926 int                     theCurrentLineOffset;
1927 int                     theEOSOffset;
1928
1929
1930         if (theSrcCStr == nil)
1931         {
1932                 SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, theSrcCStr == nil"));
1933         }
1934         
1935         if (theDstCStr == nil)
1936         {
1937                 SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, theDstCStr == nil"));
1938         }
1939         
1940         if (inWhichLine < 0)
1941         {
1942                 SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, inWhichLine < 0"));
1943         }
1944         
1945         if (maxDstCStrLength <= 0)
1946         {
1947                 SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, maxDstCStrLength <= 0"));
1948         }
1949         
1950         
1951         if (gotLastLine != nil)
1952         {
1953                 *gotLastLine = false;
1954         }
1955
1956         
1957         *theDstCStr = 0;
1958         
1959         theCurrentLineOffset = 0;
1960         
1961         theCurrentLine = 0;
1962         
1963         
1964         while (theCurrentLine < inWhichLine)
1965         {
1966                 while (theSrcCStr[theCurrentLineOffset] != '\r' && theSrcCStr[theCurrentLineOffset] != 0)
1967                 {
1968                         theCurrentLineOffset++;
1969                 }
1970                 
1971                 if (theSrcCStr[theCurrentLineOffset] == 0)
1972                 {
1973                         break;
1974                 }
1975                 
1976                 theCurrentLineOffset++;
1977                 theCurrentLine++;
1978         }
1979                 
1980         if (theSrcCStr[theCurrentLineOffset] == 0)
1981         {
1982                 SetErrorMessageAndLongIntAndBail("CopyIndexedLineToCStr: Too few lines in source text, can't get line ",inWhichLine);
1983         }
1984
1985
1986         theEOSOffset = FindCharOffsetInCStr('\r',theSrcCStr + theCurrentLineOffset);
1987         
1988         if (theEOSOffset >= 0)
1989         {
1990                 CopyCSubstrToCStr(theSrcCStr + theCurrentLineOffset,theEOSOffset,theDstCStr,maxDstCStrLength);
1991                 
1992                 if (gotLastLine != nil)
1993                 {
1994                         *gotLastLine = false;
1995                 }
1996         
1997                 if (lineEndIndex != nil)
1998                 {
1999                         *lineEndIndex = theEOSOffset;
2000                 }
2001         }
2002         
2003         else
2004         {
2005                 theEOSOffset = CStrLength(theSrcCStr + theCurrentLineOffset);
2006
2007                 CopyCSubstrToCStr(theSrcCStr + theCurrentLineOffset,theEOSOffset,theDstCStr,maxDstCStrLength);
2008                 
2009                 if (gotLastLine != nil)
2010                 {
2011                         *gotLastLine = true;
2012                 }
2013         
2014                 if (lineEndIndex != nil)
2015                 {
2016                         *lineEndIndex = theEOSOffset;
2017                 }
2018         }
2019         
2020
2021         errCode = noErr;
2022
2023
2024 EXITPOINT:
2025
2026         return(errCode);
2027 }
2028
2029
2030
2031 OSErr CopyIndexedLineToNewHandle(const char *theSrcCStr,int inWhichLine,Handle *outNewHandle)
2032 {
2033 OSErr           errCode;
2034 int                     theCurrentLine;
2035 int                     theCurrentLineOffset;
2036 int                     byteCount;
2037
2038
2039         SetErrorMessageAndBailIfNil(theSrcCStr,"CopyIndexedLineToNewHandle: Bad parameter, theSrcCStr == nil");
2040         SetErrorMessageAndBailIfNil(outNewHandle,"CopyIndexedLineToNewHandle: Bad parameter, outNewHandle == nil");
2041         
2042         if (inWhichLine < 0)
2043         {
2044                 SetErrorMessageAndBail(("CopyIndexedLineToNewHandle: Bad parameter, inWhichLine < 0"));
2045         }
2046         
2047
2048         theCurrentLineOffset = 0;
2049         
2050         theCurrentLine = 0;
2051         
2052         
2053         while (theCurrentLine < inWhichLine)
2054         {
2055                 while (theSrcCStr[theCurrentLineOffset] != '\r' && theSrcCStr[theCurrentLineOffset] != '\0')
2056                 {
2057                         theCurrentLineOffset++;
2058                 }
2059                 
2060                 if (theSrcCStr[theCurrentLineOffset] == '\0')
2061                 {
2062                         break;
2063                 }
2064                 
2065                 theCurrentLineOffset++;
2066                 theCurrentLine++;
2067         }
2068                 
2069         if (theSrcCStr[theCurrentLineOffset] == '\0')
2070         {
2071                 SetErrorMessageAndLongIntAndBail("CopyIndexedLineToNewHandle: Too few lines in source text, can't get line #",inWhichLine);
2072         }
2073
2074         
2075         byteCount = 0;
2076         
2077         while (theSrcCStr[theCurrentLineOffset + byteCount] != '\r' && theSrcCStr[theCurrentLineOffset + byteCount] != '\0')
2078         {
2079                 byteCount++;
2080         }
2081                 
2082         
2083         *outNewHandle = NewHandle(byteCount + 1);
2084         
2085         if (*outNewHandle == nil)
2086         {
2087                 SetErrorMessageAndLongIntAndBail("CopyIndexedLineToNewHandle: Can't allocate Handle, MemError() = ",MemError());
2088         }
2089         
2090         ::BlockMove(theSrcCStr + theCurrentLineOffset,**outNewHandle,byteCount);
2091         
2092         (**outNewHandle)[byteCount] = '\0';
2093
2094         errCode = noErr;
2095
2096
2097 EXITPOINT:
2098
2099         return(errCode);
2100 }
2101
2102
2103
2104
2105 OSErr CountDigits(const char *inCStr,int *outNumIntegerDigits,int *outNumFractDigits)
2106 {
2107 OSErr   errCode = noErr;
2108 int             numIntDigits = 0;
2109 int             numFractDigits = 0;
2110 int     digitIndex = 0;
2111
2112         
2113         SetErrorMessageAndBailIfNil(inCStr,"CountDigits: Bad parameter, theSrcCStr == nil");
2114         SetErrorMessageAndBailIfNil(outNumIntegerDigits,"CountDigits: Bad parameter, outNumIntegerDigits == nil");
2115         SetErrorMessageAndBailIfNil(outNumFractDigits,"CountDigits: Bad parameter, outNumFractDigits == nil");
2116         
2117         digitIndex = 0;
2118         
2119         while (inCStr[digitIndex] >= '0' && inCStr[digitIndex] <= '9')
2120         {
2121                 digitIndex++;
2122                 numIntDigits++;
2123         }
2124         
2125         if (inCStr[digitIndex] == '.')
2126         {
2127                 digitIndex++;
2128                 
2129                 while (inCStr[digitIndex] >= '0' && inCStr[digitIndex] <= '9')
2130                 {
2131                         digitIndex++;
2132                         numFractDigits++;
2133                 }
2134         }
2135         
2136         *outNumIntegerDigits = numIntDigits;
2137         
2138         *outNumFractDigits = numFractDigits;
2139         
2140         errCode = noErr;
2141         
2142 EXITPOINT:
2143
2144         return(errCode);
2145 }
2146
2147
2148
2149 OSErr ExtractIntFromCStr(const char *theSrcCStr,int *outInt,Boolean skipLeadingSpaces)
2150 {
2151 OSErr           errCode;
2152 int                     theCharIndex;
2153
2154
2155         if (theSrcCStr == nil)
2156         {
2157                 SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, theSrcCStr == nil"));
2158         }
2159         
2160         if (outInt == nil)
2161         {
2162                 SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, outInt == nil"));
2163         }       
2164
2165         
2166         *outInt = 0;
2167         
2168         theCharIndex = 0;
2169         
2170         if (skipLeadingSpaces == true)
2171         {
2172                 while (theSrcCStr[theCharIndex] == ' ')
2173                 {
2174                         theCharIndex++;
2175                 }
2176         }
2177         
2178         if (theSrcCStr[theCharIndex] < '0' || theSrcCStr[theCharIndex] > '9')
2179         {
2180                 SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, theSrcCStr contains a bogus numeric representation"));
2181         }
2182
2183
2184         while (theSrcCStr[theCharIndex] >= '0' && theSrcCStr[theCharIndex] <= '9')
2185         {
2186                 *outInt = (*outInt * 10) + (theSrcCStr[theCharIndex] - '0');
2187                 
2188                 theCharIndex++;
2189         }
2190         
2191
2192         errCode = noErr;
2193
2194
2195 EXITPOINT:
2196
2197         return(errCode);
2198 }
2199
2200
2201
2202 OSErr ExtractIntFromPStr(const unsigned char *theSrcPStr,int *outInt,Boolean skipLeadingSpaces)
2203 {
2204 OSErr           errCode;
2205 char            theCStr[256];
2206
2207
2208         if (theSrcPStr == nil)
2209         {
2210                 SetErrorMessageAndBail(("ExtractIntFromPStr: Bad parameter, theSrcPStr == nil"));
2211         }
2212         
2213         if (outInt == nil)
2214         {
2215                 SetErrorMessageAndBail(("ExtractIntFromPStr: Bad parameter, outInt == nil"));
2216         }
2217         
2218         
2219         CopyPStrToCStr(theSrcPStr,theCStr,sizeof(theCStr));
2220         
2221         
2222         errCode = ExtractIntFromCStr(theCStr,outInt,skipLeadingSpaces);
2223
2224
2225 EXITPOINT:
2226
2227         return(errCode);
2228 }
2229
2230
2231
2232 int CountOccurencesOfCharInCStr(const char inChar,const char *inSrcCStr)
2233 {
2234 int             theSrcCharIndex;
2235 int             numOccurrences = -1;
2236
2237
2238         if (inSrcCStr != nil && inChar != '\0')
2239         {
2240                 numOccurrences = 0;
2241                 
2242                 for (theSrcCharIndex = 0;inSrcCStr[theSrcCharIndex] != '\0';theSrcCharIndex++)
2243                 {
2244                         if (inSrcCStr[theSrcCharIndex] == inChar)
2245                         {
2246                                 numOccurrences++;
2247                         }
2248                 }
2249         }
2250         
2251         return(numOccurrences);
2252 }
2253
2254
2255 int CountWordsInCStr(const char *inSrcCStr)
2256 {
2257 int             numWords = -1;
2258
2259
2260         if (inSrcCStr != nil)
2261         {
2262                 numWords = 0;
2263                 
2264                 //      Skip lead spaces
2265                 
2266                 while (*inSrcCStr == ' ')
2267                 {
2268                         inSrcCStr++;
2269                 }
2270
2271                 while (*inSrcCStr != '\0')
2272                 {
2273                         numWords++;
2274
2275                         while (*inSrcCStr != ' ' && *inSrcCStr != '\0')
2276                         {
2277                                 inSrcCStr++;
2278                         }
2279                         
2280                         while (*inSrcCStr == ' ')
2281                         {
2282                                 inSrcCStr++;
2283                         }
2284                 }
2285         }
2286         
2287         return(numWords);
2288 }
2289
2290
2291
2292
2293 void ConvertCStrToUpperCase(char *theSrcCStr)
2294 {
2295 char            *theCharPtr;
2296
2297
2298         if (theSrcCStr != nil)
2299         {
2300                 theCharPtr = theSrcCStr;
2301                 
2302                 while (*theCharPtr != 0)
2303                 {
2304                         if (*theCharPtr >= 'a' && *theCharPtr <= 'z')
2305                         {
2306                                 *theCharPtr = *theCharPtr - 'a' + 'A';
2307                         }
2308                         
2309                         theCharPtr++;
2310                 }
2311         }
2312 }
2313
2314
2315
2316
2317
2318
2319
2320 void ExtractCStrItemFromCStr(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,char *outDstCharPtr,const int inDstCharPtrMaxLength,const Boolean inTreatMultipleDelimsAsSingleDelim)
2321 {
2322 int             theItem;
2323 int             theSrcCharIndex;
2324 int             theDstCharIndex;
2325
2326
2327         if (foundItem != nil)
2328         {
2329                 *foundItem = false;
2330         }
2331         
2332         
2333         if (outDstCharPtr != nil && inDstCharPtrMaxLength > 0 && inItemNumber >= 0 && inItemDelimiter != 0)
2334         {
2335                 *outDstCharPtr = 0;
2336                 
2337
2338                 theSrcCharIndex = 0;
2339                 
2340                 for (theItem = 0;theItem < inItemNumber;theItem++)
2341                 {
2342                         while (inSrcCStr[theSrcCharIndex] != inItemDelimiter && inSrcCStr[theSrcCharIndex] != '\0')
2343                         {
2344                                 theSrcCharIndex++;
2345                         }
2346                         
2347                         if (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
2348                         {
2349                                 theSrcCharIndex++;
2350                                 
2351                                 if (inTreatMultipleDelimsAsSingleDelim)
2352                                 {
2353                                         while (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
2354                                         {
2355                                                 theSrcCharIndex++;
2356                                         }
2357                                 }
2358                         }
2359                         
2360                         
2361                         if (inSrcCStr[theSrcCharIndex] == '\0')
2362                         {
2363                                 goto EXITPOINT;
2364                         }
2365                 }
2366                 
2367
2368                 if (foundItem != nil)
2369                 {
2370                         *foundItem = true;
2371                 }
2372                 
2373                 
2374                 theDstCharIndex = 0;
2375                 
2376                 for (;;)
2377                 {
2378                         if (inSrcCStr[theSrcCharIndex] == 0 || inSrcCStr[theSrcCharIndex] == inItemDelimiter || theDstCharIndex >= inDstCharPtrMaxLength - 1)
2379                         {
2380                                 outDstCharPtr[theDstCharIndex] = 0;
2381                                 
2382                                 break;
2383                         }
2384                         
2385                         outDstCharPtr[theDstCharIndex++] = inSrcCStr[theSrcCharIndex++];
2386                 }
2387         }
2388         
2389         
2390 EXITPOINT:
2391
2392         return;
2393 }
2394
2395
2396
2397 OSErr ExtractCStrItemFromCStrIntoNewHandle(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,Handle *outNewHandle,const Boolean inTreatMultipleDelimsAsSingleDelim)
2398 {
2399 OSErr   errCode;
2400 int             theItem;
2401 int             theSrcCharIndex;
2402 int             theItemLength;
2403
2404
2405         if (inSrcCStr == nil)
2406         {
2407                 SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inSrcCStr == nil");
2408                 errCode = kGenericError;
2409                 goto EXITPOINT;
2410         }
2411         
2412         if (outNewHandle == nil)
2413         {
2414                 SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, outNewHandle == nil");
2415                 errCode = kGenericError;
2416                 goto EXITPOINT;
2417         }
2418         
2419         if (foundItem == nil)
2420         {
2421                 SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, foundItem == nil");
2422                 errCode = kGenericError;
2423                 goto EXITPOINT;
2424         }
2425         
2426         if (inItemNumber < 0)
2427         {
2428                 SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inItemNumber < 0");
2429                 errCode = kGenericError;
2430                 goto EXITPOINT;
2431         }
2432         
2433         if (inItemDelimiter == 0)
2434         {
2435                 SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inItemDelimiter == 0");
2436                 errCode = kGenericError;
2437                 goto EXITPOINT;
2438         }
2439
2440
2441         *foundItem = false;
2442         
2443         theSrcCharIndex = 0;
2444         
2445         for (theItem = 0;theItem < inItemNumber;theItem++)
2446         {
2447                 while (inSrcCStr[theSrcCharIndex] != inItemDelimiter && inSrcCStr[theSrcCharIndex] != '\0')
2448                 {
2449                         theSrcCharIndex++;
2450                 }
2451                 
2452                 if (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
2453                 {
2454                         theSrcCharIndex++;
2455                         
2456                         if (inTreatMultipleDelimsAsSingleDelim)
2457                         {
2458                                 while (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
2459                                 {
2460                                         theSrcCharIndex++;
2461                                 }
2462                         }
2463                 }
2464                 
2465                 
2466                 if (inSrcCStr[theSrcCharIndex] == '\0')
2467                 {
2468                         errCode = noErr;
2469                         
2470                         goto EXITPOINT;
2471                 }
2472         }
2473         
2474
2475         *foundItem = true;
2476         
2477         
2478         for (theItemLength = 0;;theItemLength++)
2479         {
2480                 if (inSrcCStr[theSrcCharIndex + theItemLength] == 0 || inSrcCStr[theSrcCharIndex + theItemLength] == inItemDelimiter)
2481                 {
2482                         break;
2483                 }
2484         }
2485         
2486
2487         *outNewHandle = NewHandle(theItemLength + 1);
2488         
2489         if (*outNewHandle == nil)
2490         {
2491                 SetErrorMessageAndLongIntAndBail("ExtractCStrItemFromCStrIntoNewHandle: Can't allocate Handle, MemError() = ",MemError());
2492         }
2493         
2494         
2495         BlockMove(inSrcCStr + theSrcCharIndex,**outNewHandle,theItemLength);
2496         
2497         (**outNewHandle)[theItemLength] = 0;
2498         
2499         errCode = noErr;
2500         
2501         
2502 EXITPOINT:
2503
2504         return(errCode);
2505 }
2506
2507
2508
2509
2510
2511
2512 OSErr ExtractFloatFromCStr(const char *inCString,extended80 *outFloat)
2513 {
2514 OSErr                           errCode;
2515 Str255                          theStr255;
2516 Handle                          theNumberPartsTableHandle = nil;
2517 long                            theNumberPartsOffset,theNumberPartsLength;
2518 FormatResultType        theFormatResultType;
2519 NumberParts                     theNumberPartsTable;
2520 NumFormatStringRec      theNumFormatStringRec;
2521
2522
2523         if (inCString == nil)
2524         {
2525                 SetErrorMessage("ExtractFloatFromCStr: Bad parameter, inCString == nil");
2526                 errCode = kGenericError;
2527                 goto EXITPOINT;
2528         }
2529
2530         if (outFloat == nil)
2531         {
2532                 SetErrorMessage("ExtractFloatFromCStr: Bad parameter, outFloat == nil");
2533                 errCode = kGenericError;
2534                 goto EXITPOINT;
2535         }
2536         
2537         
2538 //      GetIntlResourceTable(smRoman,smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);
2539
2540         GetIntlResourceTable(GetScriptManagerVariable(smSysScript),smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);  
2541         
2542         if (theNumberPartsTableHandle == nil)
2543         {
2544                 SetErrorMessage("ExtractFloatFromCStr: Can't get number parts table for converting string representations to/from numeric representations");
2545                 errCode = kGenericError;
2546                 goto EXITPOINT;
2547         }
2548         
2549         if (theNumberPartsLength > sizeof(theNumberPartsTable))
2550         {
2551                 SetErrorMessage("ExtractFloatFromCStr: Number parts table has bad length");
2552                 errCode = kGenericError;
2553                 goto EXITPOINT;
2554         }
2555         
2556
2557         BlockMove(*theNumberPartsTableHandle + theNumberPartsOffset,&theNumberPartsTable,theNumberPartsLength);
2558         
2559         
2560         theFormatResultType = (FormatResultType) StringToFormatRec(kNumberFormatString,&theNumberPartsTable,&theNumFormatStringRec);
2561         
2562         if (theFormatResultType != fFormatOK)
2563         {
2564                 SetErrorMessage("ExtractFloatFromCStr: StringToFormatRec() != fFormatOK");
2565                 errCode = kGenericError;
2566                 goto EXITPOINT;
2567         }
2568
2569         
2570         CopyCStrToPStr(inCString,theStr255,sizeof(theStr255));
2571
2572
2573         theFormatResultType = (FormatResultType) StringToExtended(theStr255,&theNumFormatStringRec,&theNumberPartsTable,outFloat);
2574         
2575         if (theFormatResultType != fFormatOK && theFormatResultType != fBestGuess)
2576         {
2577                 SetErrorMessageAndLongIntAndBail("ExtractFloatFromCStr: StringToExtended() = ",theFormatResultType);
2578         }
2579
2580         
2581         errCode = noErr;
2582         
2583
2584 EXITPOINT:
2585         
2586         return(errCode);
2587 }
2588
2589
2590
2591 OSErr CopyFloatToCStr(const extended80 *theFloat,char *theCStr,const int maxCStrLength,const int inMaxNumIntDigits,const int inMaxNumFractDigits)
2592 {
2593 OSErr                           errCode;
2594 Str255                          theStr255;
2595 Handle                          theNumberPartsTableHandle = nil;
2596 long                            theNumberPartsOffset,theNumberPartsLength;
2597 FormatResultType        theFormatResultType;
2598 NumberParts                     theNumberPartsTable;
2599 NumFormatStringRec      theNumFormatStringRec;
2600
2601
2602         if (theCStr == nil)
2603         {
2604                 SetErrorMessage("CopyFloatToCStr: Bad parameter, theCStr == nil");
2605                 errCode = kGenericError;
2606                 goto EXITPOINT;
2607         }
2608
2609         if (theFloat == nil)
2610         {
2611                 SetErrorMessage("CopyFloatToCStr: Bad parameter, theFloat == nil");
2612                 errCode = kGenericError;
2613                 goto EXITPOINT;
2614         }
2615         
2616
2617 //      GetIntlResourceTable(smRoman,smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);
2618
2619         GetIntlResourceTable(GetScriptManagerVariable(smSysScript),smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);  
2620         
2621         if (theNumberPartsTableHandle == nil)
2622         {
2623                 SetErrorMessage("CopyFloatToCStr: Can't get number parts table for converting string representations to/from numeric representations");
2624                 errCode = kGenericError;
2625                 goto EXITPOINT;
2626         }
2627         
2628         if (theNumberPartsLength > sizeof(theNumberPartsTable))
2629         {
2630                 SetErrorMessage("CopyFloatToCStr: Number parts table has bad length");
2631                 errCode = kGenericError;
2632                 goto EXITPOINT;
2633         }
2634         
2635         
2636         BlockMove(*theNumberPartsTableHandle + theNumberPartsOffset,&theNumberPartsTable,theNumberPartsLength);
2637         
2638         
2639         if (inMaxNumIntDigits >= 0 || inMaxNumFractDigits >= 0)
2640         {
2641         char    numberFormat[64];
2642         int             numberFormatLength = 0;
2643         
2644                 for (int i = 0;i < inMaxNumIntDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
2645                 {
2646                         numberFormat[numberFormatLength++] = '0';
2647                 }
2648                 
2649                 if (inMaxNumFractDigits > 0 && numberFormatLength < sizeof(numberFormat) - 1)
2650                 {
2651                         numberFormat[numberFormatLength++] = '.';
2652                         
2653                         for (int i = 0;i < inMaxNumFractDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
2654                         {
2655                                 numberFormat[numberFormatLength++] = '0';
2656                         }
2657                 }
2658
2659                 
2660                 if (numberFormatLength < sizeof(numberFormat) - 1)
2661                 {
2662                         numberFormat[numberFormatLength++] = ';';
2663                 }
2664                 
2665                 if (numberFormatLength < sizeof(numberFormat) - 1)
2666                 {
2667                         numberFormat[numberFormatLength++] = '-';
2668                 }
2669                 
2670
2671                 for (int i = 0;i < inMaxNumIntDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
2672                 {
2673                         numberFormat[numberFormatLength++] = '0';
2674                 }
2675                 
2676                 if (inMaxNumFractDigits > 0 && numberFormatLength < sizeof(numberFormat) - 1)
2677                 {
2678                         numberFormat[numberFormatLength++] = '.';
2679                         
2680                         for (int i = 0;i < inMaxNumFractDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
2681                         {
2682                                 numberFormat[numberFormatLength++] = '0';
2683                         }
2684                 }
2685                 
2686                 numberFormat[numberFormatLength] = '\0';
2687
2688
2689         Str255  tempStr255;
2690         
2691                 CopyCStrToPStr(numberFormat,tempStr255,sizeof(tempStr255));
2692                 
2693                 theFormatResultType = (FormatResultType) StringToFormatRec(tempStr255,&theNumberPartsTable,&theNumFormatStringRec);
2694         }
2695         
2696         else
2697         {
2698                 theFormatResultType = (FormatResultType) StringToFormatRec(kNumberFormatString,&theNumberPartsTable,&theNumFormatStringRec);
2699         }
2700         
2701         if (theFormatResultType != fFormatOK)
2702         {
2703                 SetErrorMessage("CopyFloatToCStr: StringToFormatRec() != fFormatOK");
2704                 errCode = kGenericError;
2705                 goto EXITPOINT;
2706         }
2707
2708
2709         theFormatResultType = (FormatResultType) ExtendedToString(theFloat,&theNumFormatStringRec,&theNumberPartsTable,theStr255);
2710         
2711         if (theFormatResultType != fFormatOK)
2712         {
2713                 SetErrorMessage("CopyFloatToCStr: ExtendedToString() != fFormatOK");
2714                 errCode = kGenericError;
2715                 goto EXITPOINT;
2716         }
2717
2718         
2719         CopyPStrToCStr(theStr255,theCStr,maxCStrLength);
2720         
2721         errCode = noErr;
2722         
2723
2724 EXITPOINT:
2725         
2726         return(errCode);
2727 }
2728
2729
2730
2731
2732
2733 void SkipWhiteSpace(char **ioSrcCharPtr,const Boolean inStopAtEOL)
2734 {
2735         if (ioSrcCharPtr != nil && *ioSrcCharPtr != nil)
2736         {
2737                 if (inStopAtEOL)
2738                 {
2739                         while ((**ioSrcCharPtr == ' ' || **ioSrcCharPtr == '\t') && **ioSrcCharPtr != '\r' && **ioSrcCharPtr != '\n')
2740                         {
2741                                 *ioSrcCharPtr++;
2742                         }
2743                 }
2744                 
2745                 else
2746                 {
2747                         while (**ioSrcCharPtr == ' ' || **ioSrcCharPtr == '\t')
2748                         {
2749                                 *ioSrcCharPtr++;
2750                         }
2751                 }
2752         }
2753 }