mirror of
https://github.com/e-n-f/apple2-converters.git
synced 2024-11-26 11:49:16 +00:00
219 lines
4.6 KiB
C
219 lines
4.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
char **av;
|
|
|
|
void
|
|
usage (char *s)
|
|
{
|
|
fprintf (stderr, "Usage: %s [file]\n", s);
|
|
}
|
|
|
|
char *
|
|
token (int c)
|
|
{
|
|
switch (c) {
|
|
case 128: return "end";
|
|
case 129: return "for";
|
|
case 130: return "next";
|
|
case 131: return "data";
|
|
case 132: return "input";
|
|
case 133: return "del";
|
|
case 134: return "dim";
|
|
case 135: return "read";
|
|
case 136: return "gr";
|
|
case 137: return "text";
|
|
case 138: return "pr#";
|
|
case 139: return "in#";
|
|
case 140: return "call";
|
|
case 141: return "plot";
|
|
case 142: return "hlin";
|
|
case 143: return "vlin";
|
|
case 144: return "hgr2";
|
|
case 145: return "hgr";
|
|
case 146: return "hcolor=";
|
|
case 147: return "hplot";
|
|
case 148: return "draw";
|
|
case 149: return "xdraw";
|
|
case 150: return "htab";
|
|
case 151: return "home";
|
|
case 152: return "rot=";
|
|
case 153: return "scale=";
|
|
case 154: return "shload";
|
|
case 155: return "trace";
|
|
case 156: return "notrace";
|
|
case 157: return "normal";
|
|
case 158: return "inverse";
|
|
case 159: return "flash";
|
|
case 160: return "color=";
|
|
case 161: return "pop";
|
|
case 162: return "vtab";
|
|
case 163: return "himem:";
|
|
case 164: return "lomem:";
|
|
case 165: return "onerr";
|
|
case 166: return "resume";
|
|
case 167: return "recall";
|
|
case 168: return "store";
|
|
case 169: return "speed=";
|
|
case 170: return "let";
|
|
case 171: return "goto";
|
|
case 172: return "run";
|
|
case 173: return "if";
|
|
case 174: return "restore";
|
|
case 175: return "&";
|
|
case 176: return "gosub";
|
|
case 177: return "return";
|
|
case 178: return "rem";
|
|
case 179: return "stop";
|
|
case 180: return "on";
|
|
case 181: return "wait";
|
|
case 182: return "load";
|
|
case 183: return "save";
|
|
case 184: return "def";
|
|
case 185: return "poke";
|
|
case 186: return "print";
|
|
case 187: return "cont";
|
|
case 188: return "list";
|
|
case 189: return "clear";
|
|
case 190: return "get";
|
|
case 191: return "new";
|
|
case 192: return "tab";
|
|
case 193: return "to";
|
|
case 194: return "fn";
|
|
case 195: return "spc(";
|
|
case 196: return "then";
|
|
case 197: return "at";
|
|
case 198: return "not";
|
|
case 199: return "step";
|
|
case 200: return "+";
|
|
case 201: return "-";
|
|
case 202: return "*";
|
|
case 203: return "/";
|
|
case 204: return "^";
|
|
case 205: return "and";
|
|
case 206: return "or";
|
|
case 207: return ">";
|
|
case 208: return "=";
|
|
case 209: return "<";
|
|
case 210: return "sgn";
|
|
case 211: return "int";
|
|
case 212: return "abs";
|
|
case 213: return "usr";
|
|
case 214: return "fre";
|
|
case 215: return "scrn";
|
|
case 216: return "pdl";
|
|
case 217: return "pos";
|
|
case 218: return "sqr";
|
|
case 219: return "rnd";
|
|
case 220: return "log";
|
|
case 221: return "exp";
|
|
case 222: return "cos";
|
|
case 223: return "sin";
|
|
case 224: return "tan";
|
|
case 225: return "atn";
|
|
case 226: return "peek";
|
|
case 227: return "len";
|
|
case 228: return "str$";
|
|
case 229: return "val";
|
|
case 230: return "asc";
|
|
case 231: return "chr$";
|
|
case 232: return "left$";
|
|
case 233: return "right$";
|
|
case 234: return "mid$";
|
|
default: return "???";
|
|
}
|
|
}
|
|
|
|
void
|
|
process (FILE *f, char *name)
|
|
{
|
|
int oldptr = 0;
|
|
|
|
while (1) {
|
|
int a, b;
|
|
int c;
|
|
|
|
a = getc (f); /* useless (to us) pointer to next line */
|
|
b = getc (f); /* high half of pointer */
|
|
|
|
if (a == EOF || b == EOF) {
|
|
fprintf(stderr, "Unexpected EOF\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (a == 0 && b == 0) {
|
|
int c = getc(f);
|
|
if (c != EOF) {
|
|
// fprintf(stderr, "More data follows 0/0 EOF tag\n");
|
|
// exit(EXIT_FAILURE);
|
|
}
|
|
return;
|
|
}
|
|
|
|
int ptr = a + 256 * b;
|
|
if (ptr < 2048) {
|
|
fprintf(stderr, "Impossible pointer %d\n", ptr);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if (ptr < oldptr) {
|
|
fprintf(stderr, "Pointer %d < old %d\n", ptr, oldptr);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
oldptr = ptr;
|
|
|
|
a = getc (f); /* line number */
|
|
b = getc (f); /* high half of line number */
|
|
|
|
if (a == EOF || b == EOF) {
|
|
fprintf(stderr, "Unexpected EOF\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
printf ("%d ", a + 256 * b);
|
|
|
|
while ((c = getc (f)) != EOF) {
|
|
if (c == 0)
|
|
break;
|
|
|
|
if (c > 127)
|
|
printf (" %s ", token (c));
|
|
else
|
|
printf ("%c", c);
|
|
}
|
|
|
|
if (c == EOF) {
|
|
fprintf(stderr, "Unexpected EOF\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
printf ("\n");
|
|
}
|
|
}
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
av = argv;
|
|
|
|
if (argc < 2) {
|
|
process (stdin, "standard input");
|
|
} else if (argc == 2) {
|
|
FILE *f = fopen (argv[1], "r");
|
|
|
|
if (f) {
|
|
process (f, argv[1]);
|
|
fclose (f);
|
|
} else {
|
|
fprintf (stderr, "%s: %s: %s\n", argv[0], argv[1],
|
|
strerror (errno));
|
|
exit (EXIT_FAILURE);
|
|
}
|
|
} else {
|
|
usage (argv[0]);
|
|
exit (EXIT_FAILURE);
|
|
}
|
|
|
|
return (EXIT_SUCCESS);
|
|
}
|