#pragma debug 0x8000#pragma optimize -1#pragma lint -1#include #include #include #include #include #include extern int ConvertSHR(int, const char *);extern int orca_sprintf(char *, const char *, ...);char buffer[128];Word fDither;Word fSmall;void close(Word fd){Word closeDCB[2]; closeDCB[0] = 1; closeDCB[1] = fd; CloseGS(closeDCB);}long write(Word fd, const void *data, LongWord size){static IORecGS ioDCB = { 4, 0, 0, 0}; ioDCB.refNum = fd; ioDCB.dataBuffer = (Pointer)data; ioDCB.requestCount = size; WriteGS(&ioDCB); return _toolErr ? -1 : ioDCB.transferCount;}long read(Word fd, const void *data, LongWord size){static IORecGS ioDCB = { 4, 0, 0, 0}; ioDCB.refNum = fd; ioDCB.dataBuffer = (Pointer)data; ioDCB.requestCount = size; ReadGS(&ioDCB); return _toolErr ? -1 : ioDCB.transferCount;}#if 0long lseek(Word fd, LongWord offset, Word whence){static SetPositionRecGS markDCB = { 3, 0, 0, 0};static PositionRecGS positionDCB = {2, 0, 0}; markDCB.refNum = fd; markDCB.base = whence; markDCB.displacement = offset; SetMarkGS(&markDCB); if (_toolErr) return -1; if (whence == startPlus) return offset; positionDCB.refNum = fd; GetMarkGS(&positionDCB); return _toolErr ? -1 : positionDCB.position;}#endifGSString255Ptr c2gsmalloc(const char *str){GSString255Ptr g;word i; if (!str) return NULL; i = strlen(str); g = (GSString255Ptr)malloc(i + 3); g->length = i; strcpy(g->text, str); return g;}static OpenRecGS openDCB;static CreateRecGS createDCB;static NameRecGS destroyDCB;void main(int argc, char **argv){Word MyID;Handle h;char *cp;Word fd;Word err;Word i; _beginStackCheck(); MyID = MMStartUp(); SetInputDevice(0, 3); SetInGlobals(0xff, 0x80); fSmall = 0; fDither = 0; argv++; argc--; while (argc) { if (stricmp("--dither", *argv) == 0) { fDither = 1; argc--; argv++; continue; } if (stricmp("--small", *argv) == 0) { fSmall = 1; argc--; argv++; continue; } break; } if (argc != 2) { WriteLine("\pPNG Floyd converts shr screen images to png format."); WriteLine("\pUsage: pngfloyd [options] file.shr file.png"); WriteLine("\poptions"); WriteLine("\p --dither dither 640 mode colors"); WriteLine("\p --small create 320 x 200 image"); return; } openDCB.pCount = 15; openDCB.pathname = c2gsmalloc(argv[0]); openDCB.requestAccess = readEnable; openDCB.resourceNumber = 0; openDCB.optionList = NULL; OpenGS(&openDCB); err = _toolErr; free(openDCB.pathname); if (err) { WriteCString("Unable to open input file "); WriteCString(argv[0]); WriteLine("\p."); return; } fd = openDCB.refNum; if (openDCB.eof != 0x8000) { WriteLine("\pNot a SHR screen image!"); close(fd); } h = NewHandle(openDCB.eof, MyID, attrFixed | attrLocked | attrNoSpec, 0); if (_toolErr) { WriteLine("\pMemory Allocation error."); close(fd); return; } cp = *h; if (read(fd, cp, openDCB.eof) != openDCB.eof) { WriteLine("\pError reading input file."); DisposeHandle(h); close(fd); } close(fd); destroyDCB.pCount = 1; destroyDCB.pathname = c2gsmalloc(argv[1]); createDCB.pathname = destroyDCB.pathname; openDCB.pathname = destroyDCB.pathname; DestroyGS(&destroyDCB); // ignore any errors. createDCB.pCount = 4; createDCB.access = 0xe3; createDCB.fileType = 0x0000; createDCB.auxType = 0x0000; CreateGS(&createDCB); if (_toolErr) { WriteCString("Unable to create output file "); WriteCString(argv[1]); WriteLine("\p."); } else { openDCB.requestAccess = writeEnable; OpenGS(&openDCB); if (_toolErr) { WriteCString("Unable to open output file "); WriteCString(argv[1]); WriteLine("\p."); } else { fd = openDCB.refNum; ConvertSHR(fd, cp); close(fd); } } DisposeHandle(h); free(openDCB.pathname); i = _endStackCheck(); write(2, buffer, orca_sprintf(buffer, "stack: %d\r", i));}