📄 intwin32.c
字号:
#include "intwin32.h"
#include "error.h"
#include "exenv.h"
void handlefileIO()
{
int retval;
char * modes[] = {"rb", "wb", "ab", "wb+", "ab+"};
FILE * fptr;
long pos;
unsigned int nbytes;
switch ((U1)R[$R1])
{
case 0:
if (R[$R3] > 4)
{
R[$R4] = 0;
return;
}
fptr = fopen(&RAM[R[$R2]], modes[R[$R3]]);
if (fptr == NULL)
{
R[$R4] = 0;
}
else
{
R[$R4] = (U8)fptr;
}
break;
case 1:
R[$R3] = fclose((FILE *)R[$R2]);
break;
case 2:
R[$R3] = fflush((FILE *)R[$R2]);
break;
case 3:
R[$R3] = fflush(stdin);
break;
case 4:
R[$R3] = fflush(stdout);
break;
case 5:
R[$R3] = fflush(stderr);
break;
case 6:
rewind((FILE *)R[$R2]);
break;
case 7:
pos = ftell((FILE *)R[$R2]);
if (pos == -1L)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = pos;
R[$R4] = 0;
}
break;
case 8:
switch (R[$R4])
{
case 0:
R[$R5] = fseek((FILE *)R[$R2], (long)R[$R3], SEEK_SET);
break;
case 1:
R[$R5] = fseek((FILE *)R[$R2], (long)R[$R3], SEEK_END);
break;
case 2:
R[$R5] = fseek((FILE *)R[$R2], (long)R[$R3], SEEK_CUR);
break;
default:
R[$R5] = fseek((FILE *)R[$R2], (long)R[$R3], SEEK_SET);
}
break;
case 9:
R[$R3] = feof((FILE *)R[$R2]);
break;
case 10:
R[$R3] = ferror((FILE *)R[$R2]);
break;
case 11:
nbytes = fread(&RAM[R[$R4]], 1, (unsigned int)R[$R3], (FILE *)R[$R2]);
if (nbytes < (unsigned int)R[$R3])
{
if (feof((FILE *)R[$R2]))
{
R[$R5] = nbytes;
R[$R6] = 0;
}
else if (ferror((FILE *)R[$R2]))
{
R[$R5] = nbytes;
R[$R6] = 1;
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
break;
case 12:
nbytes = fwrite(&RAM[R[$R4]], 1, (unsigned int)R[$R3], (FILE *)R[$R2]);
if (nbytes < (unsigned int)R[$R3])
{
if (feof((FILE *)R[$R2]))
{
R[$R5] = nbytes;
R[$R6] = 0;
}
else if (ferror((FILE *)R[$R2]))
{
R[$R5] = nbytes;
R[$R6] = 1;
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
break;
case 13:
nbytes = fread(&RAM[R[$R4]], 1, (unsigned int)R[$R3], stdin);
if (nbytes < (unsigned int)R[$R3])
{
if (feof(stdin))
{
R[$R5] = nbytes;
R[$R6] = 0;
}
else if (ferror(stdin))
{
R[$R5] = nbytes;
R[$R6] = 1;
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
break;
case 14:
nbytes = fwrite(&RAM[R[$R4]], 1, (unsigned int)R[$R3], stdout);
if (nbytes < (unsigned int)R[$R3])
{
if (feof(stdout))
{
R[$R5] = nbytes;
R[$R6] = 0;
}
else if (ferror(stdout))
{
R[$R5] = nbytes;
R[$R6] = 1;
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
break;
case 15:
nbytes = fwrite(&RAM[R[$R4]], 1, (unsigned int)R[$R3], stderr);
if (nbytes < (unsigned int)R[$R3])
{
if (feof(stderr))
{
R[$R5] = nbytes;
R[$R6] = 0;
}
else if (ferror(stderr))
{
R[$R5] = nbytes;
R[$R6] = 1;
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
}
else
{
R[$R5] = nbytes;
R[$R6] = 0;
}
break;
case 16:
retval = printf("%c", (char)R[$R2]);
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 17:
retval = wprintf(L"%lc", (wchar_t)R[$R2]);
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 18:
retval = printf("%s", (char *)&RAM[R[$R2]]);
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 19:
retval = wprintf(L"%ls", (wchar_t *)&RAM[R[$R2]]);
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 20: /* note signed vs. unsigned */
if (R[$R3] == 1)
{
retval = printf("%I64u", R[$R2]);
}
else
{
retval = printf("%I64d", R[$R2]);
}
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 21:
retval = printf("%le", Rd[$D1]);
if (retval < 0)
{
R[$R3] = 0;
R[$R4] = 1;
}
else
{
R[$R3] = retval;
R[$R4] = 0;
}
break;
case 22:
retval = scanf("%s", (char *)&RAM[R[$R2]]);
if ((retval == EOF) || (retval == 0))
{
R[$R3] = 0;
}
else
{
R[$R3] = retval;
}
break;
case 23:
retval = wscanf(L"%ls", (wchar_t *)&RAM[R[$R2]]);
if ((retval == EOF) || (retval == 0))
{
R[$R3] = 0;
}
else
{
R[$R3] = retval;
}
break;
case 24:
if (R[$R3] == 1)
{
retval = scanf("%I64u", &R[$R2]);
}
else
{
retval = scanf("%I64d", &R[$R2]);
}
if ((retval == EOF) || (retval == 0))
{
R[$R3] = 0;
}
else
{
R[$R3] = retval;
}
break;
case 25:
retval = scanf("%le", &Rd[$D1]);
if ((retval == EOF) || (retval == 0))
{
R[$R3] = 0;
}
else
{
R[$R3] = retval;
}
break;
default:
ERROR1("INT 0 %lu function not handled", (U1)R[$R1]);
}
return;
}/*end handlefileIO*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -