/* file --- pray to the AmigaDOS god ... */ #include #include #include #include #include "stuff.h" #define BUFFERSIZE 256L extern struct Window * win ; extern struct Screen * scr ; extern char *getFileName (); extern ULONG msgclass ; extern USHORT msgcode ; extern int gadcode ; extern struct RastPort * reep ; extern int no_help ; extern UBYTE flubb [] ; extern struct Gadget namegad , TGads [] ; char def_name [50] = "NuIm.h"; char def_dir [50] = "Ram:" ; void messWith (); SS FileHandle *out; static UBYTE *flubber; static struct IntuiText sweat = { 2, 1,JAM2, 7, 5, NL, (UB) "OverWrite Existing File:", NL }, filen = { 2, 1,JAM2, 7,15, NL, NL, &sweat }, killr = {22,28,JAM2, 6, 3, NL, (UB) "DO IT!", NL }, pansy = {28,22,JAM2, 6, 3, NL, (UB) "be nice", NL }; void cloze () /* note this works like a microcosm of init ()... */ { if (out) Close (out); if (flubber) FreeMem (flubber, BUFFERSIZE); onInput (); } /*===================SAVE===================*/ void save () { USHORT get_spot (), nz, glob; unsigned int over, down, in; UBYTE marioBros [128], destroy [99]; int Zpop (); #define ZPOP {ifn(Zpop())return;} #define TPOP(x) {strcpy(flubber, x "\n");ZPOP;} out = NL; flubber = NL; Mess ("FileName: == \"Okay\""); offInput (); ifn (getFileName (win, scr, "Enter FileName to Get It", def_name, def_dir)) { onInput (); RET; } messWith (marioBros); out = Open (marioBros, MODE_OLDFILE); if (out) { strcpy (destroy, marioBros); strcat (destroy, "?"); filen.IText = destroy; Mess ("L-Amiga-V == DOIT!; -B == be nice"); ifn (AutoRequest (win, &filen, &killr, &pansy, 0L, 0L, 280L, 60L)) { cloze (); Mess ("Save Cancelled - Wrong FileName"); RET; } Mess ("Bet you didn't know that!"); } /* kill hurt destroy stoned ... */ cloze (); glob = gadzon (TGads [8])? 1: 2; out = Open (marioBros, MODE_NEWFILE); IFN (out) { ALERT ("Can't Open File!!!"); cloze (); RET; } Mess ("Saving your Image"); flubber = AllocMem (BUFFERSIZE, MEMF_CHIP | MEMF_PUBLIC); IFN (flubber) { cloze (); ALERT ("NO CHIP MEMORY!!!"); RET; } if gadzon (TGads [18]) { TPOP ("\n\n/* You can edit an \"ni_\" declaration, put it in a bigger file,"); TPOP ( " change its size, and still load it into PopArt for further"); TPOP ( " blandishment. The PopArt loader is simple but effective."); TPOP ( " It scans thru a file, looking for \"HITE\", \"WIDT\", and"); TPOP ( " \" ni_dataName[]=\". Every time it finds \"HITE\" or \"WIDT\","); TPOP (" it scans to '(' and extracts the following number. It knows"); TPOP (" the difference between a decimal and a hex, and they both must"); TPOP (" end with ','. It ignores any line containing \"plane\", and it"); TPOP (" stops reading \" ni_dataName[]=\" when it encounters \"end of\"."); TPOP (" It can't deal with data edited to use PlanePick and PlaneOnOff */"); } strcpy (flubber, "\n\n#define "); strcat (flubber, flubb); strcat (flubber, "SIZE ((long)sizeof("); strcat (flubber, flubb); strcat (flubber, "))\n"); ZPOP; strcpy (flubber, "#define "); strcat (flubber, flubb); strcat (flubber, "WIDT ("); ZPOP; decimal (32 * glob, flubber); strcat (flubber, ")\n"); ZPOP; strcpy (flubber, "#define "); strcat (flubber, flubb); strcat (flubber, "HITE ("); ZPOP; decimal (20 * glob, flubber); strcat (flubber, ")\n"); ZPOP; strcpy (flubber, "#define DO"); strcat (flubber, flubb); strcat (flubber, "(x,y) popChip("); strcat (flubber, flubb); strcat (flubber, ","); strcat (flubber, flubb); strcat (flubber, "SIZE,"); strcat (flubber, flubb); strcat (flubber, "WIDT,"); strcat (flubber, flubb); strcat (flubber, "HITE,x,y)\n"); ZPOP; strcpy (flubber, "\nUSHORT *"); strcat (flubber, flubb); strcat (flubber, "Chip;\n"); ZPOP; strcpy (flubber, "\nUSHORT "); strcat (flubber, flubb); strcat (flubber, "[]={"); ZPOP; LOOP (in = 0; in < 5 ; ++in) { strcpy (flubber, "/* plane "); ZPOP; strcat (decimal (in + 1, flubber), ", "); strcat (flubber, flubb); strcat (flubber, " */\n\t"); ZPOP; loop (nz=8, down=PixDown; down> plane) & 0x01 ) thing |= 0x8000 >> it; } /* end of scan-thru-one-USHORT's-worth-of-dots */ return thing; } /* is it safe to look this up thru the rastport bitmap? */ /*===================LOAD===================*/ #define ALLOCSIZE ((MaxUP * MaxDN * 5L + 10L) * sizeof (USHORT)) #define ARRAYSIZE ((MaxUP * MaxDN * 5L)) FILE *in; USHORT *imagine; void load () { char line [128], *liner, example [75], realname [56]; UBYTE marioBros [128]; int hite = 40, widt = 4*16, foundit = 0; USHORT *stuff = NL; in = NL; imagine = NL; Mess ("Change Data Name to Name to Read!"); offInput (); ifn (getFileName (win, scr, "Enter FileName to Grab", def_name, def_dir)) { Rcloze (); RET; } ifn (stuff = imagine = (USHORT*) AllocMem (ALLOCSIZE, MEMF_CLEAR)) { ALERT ("Low Memory! Help!"); Rcloze (); RET; } messWith (marioBros); ifn (in = fopen (marioBros, "r")) { ALERT ("Error Opening File!!"); Rcloze (); RET; } strcpy (example, "Loading "); strcat (example, marioBros); strcat (example, "->"); strcat (example, flubb); Mess (example); strcpy (example, "DO"); strcat (example, flubb); strcpy (realname, " "); strcat (realname, flubb); strcat (realname, "[]="); while (fgets (line, 127, in)) { if (findstr (line, "HITE") && !findstr (line, example)) hite = findnum (line, hite); if (findstr (line, "WIDT") && !findstr (line, example)) { widt = findnum (line, widt); if (findstr (line, "2*16")) widt = 2*16; if (findstr (line, "4*16")) widt = 4*16; } if (findstr (line, realname)) { foundit = 1; while (fgets (line, 127, in)) { if (findstr (line, "plane")) continue; if (findstr (line, "end of")) break; liner = line; nxnum: while (!isdigit (*liner) && *liner) ++liner; ifn (*liner) continue; if (liner [0] == '0' && tolower (liner [1]) == 'x') *stuff = hexToUshort (&liner [2]); else *stuff = (USHORT) atoi (liner); while (*liner != ',' && *liner) ++liner; if (++stuff >= &imagine [ARRAYSIZE]) break; ifn (*liner) continue; goto nxnum; } break; } } /* the less said about such nonsense the better */ ifn (foundit) { Mess ("Data Item Not Found!!!"); Rcloze (); RET; } SetAPen (reep, 0L); RectFill (reep, (long) PixOver, (long) PixDown, (long) PixOver + ImageWid, (long) PixDown + MaxDN); popChip (imagine, ALLOCSIZE, widt, hite, PixOver, PixDown); suck (); redrawWorkArea (0); Rcloze (); } /* end of load */ void saveColors () { USHORT nz = 12; unsigned int in; UBYTE marioBros [128], destroy [99]; int Zpop (); #define ZPOP {ifn(Zpop())return;} out = NL; flubber = NL; Mess ("FileName: == \"Okay\""); offInput (); ifn (getFileName (win, scr, "Enter FileName to Get Colors", def_name, def_dir)) { onInput (); RET; } messWith (marioBros); out = Open (marioBros, MODE_OLDFILE); if (out) { strcpy (destroy, marioBros); strcat (destroy, "?"); filen.IText = destroy; Mess ("L-Amiga-V == DOIT!; -B == be nice"); ifn (AutoRequest (win, &filen, &killr, &pansy, 0L, 0L, 280L, 60L)) { cloze (); Mess ("Save Cancelled - Wrong FileName"); RET; } Mess ("Bet you didn't know that!"); } cloze (); out = Open (marioBros, MODE_NEWFILE); IFN (out) { ALERT ("Can't Open File!!!"); cloze (); RET; } Mess ("Saving your Colors"); flubber = AllocMem (BUFFERSIZE, MEMF_CHIP | MEMF_PUBLIC); IFN (flubber) { cloze (); ALERT ("NO CHIP MEMORY!!!"); RET; } strcpy (flubber, "\n#define "); strcat (flubber, flubb); strcat (flubber, "COLORS(vp) LoadRGB4((vp),"); strcat (flubber, flubb); strcat (flubber, "CMAP,32L)\n"); ZPOP; strcpy (flubber, "\nUWORD "); strcat (flubber, flubb); strcat (flubber, "CMAP[]={\n\t"); ZPOP; LOOP (in = 0; in < 32 ; ++in) { char number [16]; strcpy (flubber, "0x000"); hex ((int) GetRGB4 (scr->ViewPort.ColorMap, (long) in), number); strcpy (&flubber [5 - strlen (number)], number); strcat (flubber, ","); ZPOP; ifn (--nz) { strcpy (flubber, "\n\t"); nz = 12; ZPOP; } } strcpy (flubber, "\n}; /* end of "); strcat (flubber, flubb); strcat (flubber, "CMAP */\n"); ZPOP; cloze (); Mess ("Colors Saved"); } /* end of saveColors */ void loadColors () { char line [128], *liner, example [75], realname [56]; UBYTE marioBros [128]; int stuff, hite = 40, widt = 4*16, foundit = 0; UWORD cmap [32]; long pragma = 0; in = NL; imagine = NL; Mess ("Change Data Name to Name to Read!"); offInput (); stuff = 0; ifn (getFileName (win, scr, "Enter FileName to Load Colors", def_name, def_dir)) { Rcloze (); RET; } messWith (marioBros); ifn (in = fopen (marioBros, "r")) { ALERT ("Error Opening File!!"); Rcloze (); RET; } strcpy (example, "Loading "); strcat (example, marioBros); strcat (example, "->"); strcat (example, flubb); strcat (example, "CMAP"); Mess (example); strcpy (example, "DO"); strcat (example, flubb); strcpy (realname, " "); strcat (realname, flubb); strcat (realname, "CMAP[]="); while (fgets (line, 127, in)) { if (findstr (line, realname)) { foundit = 1; while (fgets (line, 127, in)) { liner = line; nxnum: while (!isdigit (*liner) && *liner) ++liner; ifn (*liner) continue; if (liner [0] == '0' && tolower (liner [1]) == 'x') cmap [stuff] = hexToUshort (&liner [2]); else cmap [stuff] = (USHORT) atoi (liner); while (*liner != ',' && *liner) ++liner; if (++stuff >= 32) break; ifn (*liner) continue; goto nxnum; } break; } } /* end of while-therez- lines */ ifn (foundit) { Mess ("Data Item Not Found!!!"); Rcloze (); RET; } SetAPen (reep, 0L); Rcloze (); if (++stuff > 32) stuff = 32; LoadRGB4 (&(scr->ViewPort), cmap, (long) stuff); Mess ("New Colors Loaded"); } /* end of loadColors */ void Rcloze () { if (in) fclose (in); if (imagine) FreeMem (imagine, ALLOCSIZE); onInput (); in = 0; imagine = 0; } void increment () { inky (flubb, 9); RefreshGadgets (&namegad, win, (long) NL); inky (def_name, 31); } inky (dunk, size) char *dunk; { int numat, numiz; char cat [128], *boid, dink [128]; strcpy (dink, dunk); if ((numat = hazNum (dink)) == -1) numat = izIn (dink, '.'); numiz = atoi (&dink [numat]); strcpy (cat, &dink [numat]); boid = cat; while (*boid && boid < &cat [127] && isdigit (*boid)) ++boid; dink [numat] = 0; decimal (++numiz, &dink [numat]); strcat (dink, boid); strncpy (dunk, dink, size); } /* parsers have got to be the ugliest code around... */ char * decimal (it, s) unsigned int it; char *s; { REG int v; REG char *p; long pwr10 (); loop (v = 7; v > -1; --v) s [7 - v] = '0' + ( it/pwr10(v) ) % 10; s [8] = 0; p = s; while (p [0] == '0' && p [1] != 0) ++p; if (p != s) strcpy (s, p); return s; } long pwr10 (x) { REG long r = 10; if (x == 0) return 1; while (--x) r *= 10; return r; } static char table [] = "0123456789abcdef"; char * hex (it, s) char *s; { REG int v; REG char *p; loop (v = 3; v > -1; --v) s [3 - v] = table [(it >> (v * 4)) & 0xf]; s [4] = 0; p = s; while (p [0] == '0' && p [1] != 0) ++p; if (p != s) strcpy (s, p); return s; } USHORT hexToUshort (s) char *s; { REG USHORT g = 0; REG int v = 0, k, q; while (!isxdigit (*s) && *s) ++s; ifn (*s) return 0; while ( isxdigit (s [ v])) ++v; if (!isxdigit (s [--v])) return 0; loop (q = v; v >= 0; --v) { k = 0; while (table [k] != tolower (s [v]) && k < 16) ++k; g |= k << ((q - v) * 4); } return g; } void messWith (marioBros) char *marioBros; { marioBros [0] = 0; /* no '\000' bullshit! */ if (izIn (def_name, ':') >= strlen (def_name)) { strcpy (marioBros, def_dir); if (def_dir [strlen (def_dir)-1] != ':' && def_dir [strlen (def_dir)-1] != '/') strcat (marioBros, "/"); } strcat (marioBros, def_name); } /* allow part of path and filename in dir and name, or all in name */ hazNum (s) char *s; { REG int reggae = 0; while (*s) { if (isdigit (*s)) return reggae; ++reggae, ++s; } return -1; } /* I love C ... I need C */ izIn (s, d) char *s, d; { REG int reggae = 0; while (*s) { if (*s == d) break; ++s, ++reggae; } return reggae; } /* return location of d, or length of s */ findstr (a, b) char *a, *b; { while (*a && *a != *b) ++a; ifn (*a) return 0; while (*a == *b && *a && *b) ++a, ++b; return !*b; } /* return a boolean for if b is in a */ findnum (a, defalt) char *a; { while (*a != '(' && *a) ++a; while (!isdigit (*a) && *a) ++a; ifn (*a) return defalt; return atoi (a); }