mirror of
https://github.com/e-n-f/apple2-converters.git
synced 2024-12-01 12:51:12 +00:00
Detect some files that don't meet Applesoft file format constraints
This commit is contained in:
parent
a053bc2c72
commit
351b2a2d48
38
fp.c
38
fp.c
@ -129,6 +129,8 @@ token (int c)
|
|||||||
void
|
void
|
||||||
process (FILE *f, char *name)
|
process (FILE *f, char *name)
|
||||||
{
|
{
|
||||||
|
int oldptr = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int a, b;
|
int a, b;
|
||||||
int c;
|
int c;
|
||||||
@ -136,16 +138,37 @@ process (FILE *f, char *name)
|
|||||||
a = getc (f); /* useless (to us) pointer to next line */
|
a = getc (f); /* useless (to us) pointer to next line */
|
||||||
b = getc (f); /* high half of pointer */
|
b = getc (f); /* high half of pointer */
|
||||||
|
|
||||||
if (a == EOF || b == EOF)
|
if (a == EOF || b == EOF) {
|
||||||
return;
|
fprintf(stderr, "Unexpected EOF\n");
|
||||||
if (a == 0 && b == 0)
|
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;
|
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 */
|
a = getc (f); /* line number */
|
||||||
b = getc (f); /* high half of line number */
|
b = getc (f); /* high half of line number */
|
||||||
|
|
||||||
if (a == EOF || b == EOF)
|
if (a == EOF || b == EOF) {
|
||||||
return;
|
fprintf(stderr, "Unexpected EOF\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
printf ("%d ", a + 256 * b);
|
printf ("%d ", a + 256 * b);
|
||||||
|
|
||||||
@ -159,6 +182,11 @@ process (FILE *f, char *name)
|
|||||||
printf ("%c", c);
|
printf ("%c", c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c == EOF) {
|
||||||
|
fprintf(stderr, "Unexpected EOF\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user