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 }
2754