|
|
@@ -86,21 +86,27 @@ long m2fclose(long h)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* A handle of 0 means the open failed (Modula-2 NIL). Every file
|
|
|
+ operation degrades to a safe no-op instead of dereferencing NULL. */
|
|
|
+
|
|
|
long m2fgetc(long h)
|
|
|
{
|
|
|
- int c = fgetc((FILE *)h);
|
|
|
+ int c;
|
|
|
+ if (h == 0) return 0;
|
|
|
+ c = fgetc((FILE *)h);
|
|
|
return (c == EOF) ? 0 : c;
|
|
|
}
|
|
|
|
|
|
long m2fputc(long h, long c)
|
|
|
{
|
|
|
- fputc((int)c, (FILE *)h);
|
|
|
+ if (h != 0) fputc((int)c, (FILE *)h);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
long m2fputs(long h, long *desc)
|
|
|
{
|
|
|
long n = desc[0];
|
|
|
+ if (h == 0) return 0;
|
|
|
if (n > 0) fwrite((char *)(desc + 1), 1, (size_t)n, (FILE *)h);
|
|
|
return n;
|
|
|
}
|
|
|
@@ -109,6 +115,7 @@ long m2freadint(long h)
|
|
|
{
|
|
|
long v = 0;
|
|
|
int c, neg = 0;
|
|
|
+ if (h == 0) return 0;
|
|
|
do { c = fgetc((FILE *)h); } while (c == ' ' || c == '\t' ||
|
|
|
c == '\n' || c == '\r');
|
|
|
if (c == '-') { neg = 1; c = fgetc((FILE *)h); }
|
|
|
@@ -124,6 +131,7 @@ long m2fwriteint(long h, long v)
|
|
|
char buf[32];
|
|
|
int i = 0, neg = 0;
|
|
|
unsigned long u;
|
|
|
+ if (h == 0) return 0;
|
|
|
if (v < 0) { neg = 1; u = (unsigned long)(-v); }
|
|
|
else u = (unsigned long)v;
|
|
|
do { buf[i++] = (char)('0' + u % 10); u /= 10; } while (u != 0);
|
|
|
@@ -134,7 +142,7 @@ long m2fwriteint(long h, long v)
|
|
|
|
|
|
long m2fwriteln(long h)
|
|
|
{
|
|
|
- fputc('\n', (FILE *)h);
|
|
|
+ if (h != 0) fputc('\n', (FILE *)h);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -144,6 +152,7 @@ long m2fread(long h, long *desc, long max)
|
|
|
{
|
|
|
long n;
|
|
|
if (max < 0) max = 0;
|
|
|
+ if (h == 0) { desc[0] = 0; return 0; }
|
|
|
n = (long)fread((char *)(desc + 1), 1, (size_t)max, (FILE *)h);
|
|
|
desc[0] = n;
|
|
|
return n;
|
|
|
@@ -155,6 +164,7 @@ long m2fwriteintw(long h, long v, long wid)
|
|
|
{
|
|
|
char buf[64];
|
|
|
int n;
|
|
|
+ if (h == 0) return 0;
|
|
|
if (wid == 0)
|
|
|
n = snprintf(buf, sizeof buf, " %ld", v);
|
|
|
else
|