info-mac@uw-beaver (info-mac) (11/08/84)
From: Ed Pattermann <PATTERMANN@SUMEX-AIM.ARPA> FROMHEX.C #include "quickdraw.h" #include "osintf.h" #include "toolintf.h" #define bufsize 512 #define InName "C" #define OutName "C prog" int rout, rin, io, i; int l, val, bytes, sum, getsum; char bin[bufsize], bout[bufsize]; int count, szin, bini, bouti; FInfo fInfo; putflush() { if (bouti) { count = bouti; io = FSWrite(rout, &count, bout); bouti = 0; } } putchar(ch) int ch; { bout[bouti++] = (char) ch; if (bouti == bufsize) putflush(); } int getchar() { if (bini == bufsize) { bini = 0; count = bufsize; io = FSRead(rin, &count, bin); } return ((int) bin[bini++]); } badnews() { int j; io = FSClose(rin); io = FSClose(rout); SysBeep(1); for (j = 0; j <= 20000; j++) l = 0; SysBeep(1); ExitToShell(); } main() { bouti = 0; bini = bufsize; io = FSDelete(OutName, 0); io = Create(OutName, 0, "CCOM", "APPL"); io = GetFInfo(OutName, 0, &fInfo); fInfo.fdFlags |= fHasBundle << 8; io = SetFInfo(OutName, 0, &fInfo); io = OpenRF(OutName, 0, &rout); if (io) badnews(); io = FSOpen(InName, 0, &rin); if (io) badnews(); io = GetEOF(rin, &szin); count = szin >> 1; io = Allocate(rout, &count); if (io) badnews(); val = 0; bytes = 0; sum = 0; getsum = 0; while (szin && !getsum) { l = getchar() & 127; szin--; if ((l >= 64) && (l < 80)) { bytes++; val = (val << 4) | (l - 64); if (!(bytes & 1)) { putchar(val); sum += val; val = 0; } } if (l == 124) getsum = 1; } putflush(); io = FSClose(rout); if (!getsum) badnews(); sum += bytes >> 1; val = 0; for (i = 1; i <= 8; i++) val = (val << 4) | (getchar() & 15); io = FSClose(rin); if (val != sum) badnews(); ExitToShell(); } TOHEX.C #include <stdio.h> char hex[] = "@ABCDEFGHIJKLMNO"; int bytes,sum; unsigned long htonl(); main(argc,argv) char **argv; { register i,len; register char *cp; len = 0; while ((i = getchar()) != EOF) { bytes++; sum += i; putchar(hex[i>>4]); putchar(hex[i&0xF]); if (++len > 32) { putchar('\n'); len = 0; } } fprintf(stderr, "bytes %d, sum %d\n", bytes, sum); putchar('|'); sum += bytes; sum = htonl(sum); cp = (char *)∑ for (len = 0 ; len < 4 ; len++) { i = (*cp++ & 0xff); putchar(hex[i>>4]); putchar(hex[i&0xF]); } putchar('\n'); exit(0); } #define nohtonl #ifdef nohtonl /* if not in library */ /* * "Host" to "net" byte order swappers. */ unsigned short htons(a) unsigned short a; { unsigned short result; register char *sp = (char *)&a; register char *dp = (char *)&result; dp[1] = *sp++; dp[0] = *sp; return (result); } unsigned long htonl(a) unsigned long a; { unsigned long result; register char *sp = (char *)&a; register char *dp = (char *)&result; dp[3] = *sp++; dp[2] = *sp++; dp[1] = *sp++; dp[0] = *sp; return (result); } #endif -------