⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intlinux.c

📁 < 虚拟机设计与实现> 的source code, linux版本
💻 C
字号:
#include "intlinux.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: 
		printf("Warning (INT 0, $R1=17) no wide char support!\n");		R[$R3] = 0; 
		R[$R4] = 1;
        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:
		printf("Warning (INT 0, $R1=19) no wide character support!\n");		R[$R3] = 0; 
		R[$R4] = 0;
        break;
		
	case 20: /* note signed vs. unsigned */
		if (R[$R3] == 1)
		{ 
			retval = printf("%%llu", R[$R2]); 
		}
		else
		{ 
			retval = printf("%lld", 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:
		printf("Warning (INT 0, $R1=23) no wide character support!\n");		R[$R3] = 0;
        break;
		
	case 24:
		if (R[$R3] == 1)
		{ 
			retval = scanf("%llu", &R[$R2]); 
		}
		else
		{ 
			retval = scanf("%lld", &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 + -