/* csplash.c 05/03/04 nm module -i"-Aa -DMPE" */ /*********************************************************/ /* Copyright (c) 2005 Allegro Consultants, Inc. */ /*********************************************************/ /* NOTE: this must be compiled with 2-byte alignment! */ /* I.e., 32-bit values have to be storable into */ /* memory at addresses that are merely 2-byte */ /* aligned and not 4-byte aligned! */ /* With HP C, that would be "+u2" */ /* */ /*********************************************************/ /* Support modules for converted SPLash! code */ /* */ /* HISTORY */ /* HIST 05/03/04 Added FROM_CSPLASH_C. */ /* HIST 05/03/01 Moved C std includes into csplash.h */ /* HIST Added note about 2-byte alignment. */ /* HIST 04/11/08 Fixed SPLash_scan_while/until for " " */ /* HIST 98/11/03 Added SPLash_cat */ /* HIST 96/02/29 Fixed SPLash_compare_sd */ /*********************************************************/ #define FROM_CSPLASH_C #include "csplash.h" #if defined(_WIN32) /* assuming MS VC++ compiler */ typedef __int16 int16; typedef __int16 int16_t; typedef unsigned __int16 uint16; typedef __int32 int32; typedef __int32 int32_t; typedef unsigned __int32 uint32; #endif static UINT32 SPLash_masks [] = { 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, -1 }; #define int16 int16_t #define int32 int32_t /***************************************************************/ void SPLash__set32 (int32 *ptr, int32 val) { int16 *dest, *source; dest = (int16 *) ptr; source = (int16 *) &val; *dest++ = *source++; *dest++ = *source++; /* memcpy ( (void *) ptr, (void *) &val;, 4); */ } /* end SPLash__set32 proc */ /***************************************************************/ UINT16 SPLash_cat (UINT16 a, UINT16 b, UINT16 sa, UINT16 sb, UINT16 n) /* x := a cat b (sa:sb:n) */ /* From HP's SPL->C migration guide */ { unsigned int m; n = 16 - n; m = (0xfff >> n) << (n - sa); return ( (UINT16) ( (a & ~m) | ((sa < sb ? b << (sb - sa) : b >> (sa - sb)) & m))); } /* end SPLash_cat proc */ /* ...SS 981103 */ /***************************************************************/ void SPLash_check_S (void) { if (S > 32700) { printf ("SPLash! stack overflow, S = %d\n", S); exit (0); } if (S < 0) { printf ("SPLash! stack underflow, S = %d\n", S); exit (0); } } /* end SPLash_check_S proc */ /***************************************************************/ INT32 SPLash_compare (void *dst, void *src, INT32 len) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; register INT32 comp_val = 0; /* if len = 0 */ if (len > 0) { while (--len >= 0) if ((comp_val = *(pdst++) - *(psrc++)) != 0) break; } else if (len < 0) { while (++len <= 0) if ((comp_val = *(pdst--) - *(psrc--)) != 0) break; } else comp_val = 0; return comp_val; } /* end SPLash_compare proc */ /***************************************************************/ INT32 SPLash_compare_sd (void *dst, void *src, INT32 len, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; register INT32 comp_val = 0; /* if len = 0 */ if (len > 0) { while (--len >= 0) { if ((comp_val = (*pdst - *psrc)) != 0) break; pdst++; psrc++; } } else if (len < 0) { while (++len <= 0) { if ((comp_val = (*pdst - *psrc)) != 0) break; pdst--; psrc--; } }; switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; PUSH_INT16 = len; break; case 1: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 2: PUSH_ADDRESS = (void *) pdst; break; } return comp_val; } /* end SPLash_compare_sd proc */ /***************************************************************/ UINT32 SPLash_deposit (UINT32 dst, UINT32 src, INT32 start, INT32 len) { UINT32 mask; if (start > 31) return dst; if (start + len > 32) len = 32 - start; src = (src & SPLash_masks [len]) << (32 - start - len); mask = SPLash_masks [len] << (32 - start - len); return ((dst & ~mask) | src); } /* end SPLash_deposit proc */ /***************************************************************/ UINT32 SPLash_extract (UINT32 src, INT32 start, INT32 len) { if (start > 31) return 0; if (start + len > 32) len = 32 - start; return ((src >> (32 - start - len)) & SPLash_masks [len]); } /* end SPLash_extract proc */ /***************************************************************/ INT32 SPLash_move (void *dst, void *src, INT32 len) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; INT32 orig_len = len; if (len > 0) { if (pdst == psrc + 1) { (void) memset (dst, *psrc, len); pdst += len; psrc += len; } else if (pdst == psrc + 2 && *psrc == psrc [1]) { (void) memset (dst, *psrc, len); pdst += len; psrc += len; } else if (abs (pdst - psrc) >= len) { (void) memcpy (dst, src, len); pdst += len; psrc += len; } else { while (len-- > 0) *(pdst++) = *(psrc++); } } else while (len++ < 0) *(pdst--) = *(psrc--); return orig_len; } /* end SPLash_move proc */ /***************************************************************/ INT32 SPLash_move_a (void *dst, void *src, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; while (isalpha (*psrc)) *(pdst++) = *(psrc++); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 1: PUSH_ADDRESS = (void *) pdst; break; } return (psrc - (unsigned char *) src); } /* end SPLash_move_a proc */ /***************************************************************/ INT32 SPLash_move_an (void *dst, void *src, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; while (isalnum (*psrc)) *(pdst++) = *(psrc++); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 1: PUSH_ADDRESS = (void *) pdst; break; } return (psrc - (unsigned char *) src); } /* end SPLash_move_an proc */ /***************************************************************/ INT32 SPLash_move_ans (void *dst, void *src, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; while (isalnum (*psrc)) *(pdst++) = toupper (*(psrc++)); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 1: PUSH_ADDRESS = (void *) pdst; break; } return (psrc - (unsigned char *) src); } /* end SPLash_move_ans proc */ /***************************************************************/ INT32 SPLash_move_as (void *dst, void *src, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; while (isalpha(*psrc)) *(pdst++) = toupper (*(psrc++)); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 1: PUSH_ADDRESS = (void *) pdst; break; } return (psrc - (unsigned char *) src); } /* end SPLash_move_as proc */ /***************************************************************/ INT32 SPLash_move_n (void *dst, void *src, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; while (isdigit (*psrc)) *(pdst++) = *(psrc++); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 1: PUSH_ADDRESS = (void *) pdst; break; } return (psrc - (unsigned char *) src); } /* end SPLash_move_n proc */ /***************************************************************/ INT32 SPLash_move_sd (void *dst, void *src, INT32 len, INT32 stack_dec) { unsigned char *pdst = (unsigned char *) dst, *psrc = (unsigned char *) src; INT32 orig_len = len; if (len > 0) { if (pdst == psrc + 1) { (void) memset (dst, *psrc, len); pdst += len; psrc += len; } else if (pdst == psrc + 2 && *psrc == psrc [1]) { (void) memset (dst, *psrc, len); pdst += len; psrc += len; } else if (abs (pdst - psrc) >= len) { (void) memcpy (dst, src, len); pdst += len; psrc += len; } else { while (len-- > 0) *(pdst++) = *(psrc++); } } else while (len++ < 0) *(pdst--) = *(psrc--); switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; PUSH_INT16 = len; break; case 1: PUSH_ADDRESS = (void *) pdst; PUSH_ADDRESS = (void *) psrc; break; case 2: PUSH_ADDRESS = (void *) pdst; break; } return orig_len; } /* end SPLash_move_sd proc */ /***************************************************************/ INT32 SPLash_scan_until (void *src, INT16 search_value, INT32 stack_dec) { INT32 end_char, test_char, i; unsigned char *psrc = (unsigned char *) src; test_char = search_value & 255; end_char = (search_value >> 8) & 255; if (test_char == end_char) for (i = 0; psrc [i] != test_char; i++) ; else for (i = 0; psrc [i] != test_char && psrc [i] != end_char; i++) ; switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) (psrc + i); PUSH_INT16 = search_value; break; case 1: PUSH_ADDRESS = (void *) (psrc + i); break; } CARRY = (psrc [i] != test_char); return i; } /* end SPLash_scan_until proc */ /***************************************************************/ INT32 SPLash_scan_while (void *src, INT16 search_value, INT32 stack_dec) { INT32 end_char, test_char, i; unsigned char *psrc = (unsigned char *) src; test_char = search_value & 255; end_char = (search_value >> 8) & 255; if (test_char == end_char) for (i = 0; psrc [i] == test_char; i++) ; else for (i = 0; psrc [i] == test_char && psrc [i] != end_char; i++) ; switch (stack_dec) { case 0: PUSH_ADDRESS = (void *) (psrc + i); PUSH_INT16 = search_value; break; case 1: PUSH_ADDRESS = (void *) (psrc + i); break; } CARRY = (psrc [i] == end_char); return i; } /* end SPLash_scan_while proc */ /***************************************************************/