diff mc09/fileio.txt @ 160:1a30cd6e5973

move mc09 to top
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 05 Feb 2019 09:03:07 +0900
parents os9/mc09/fileio.txt@92ed427b7f7d
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mc09/fileio.txt	Tue Feb 05 09:03:07 2019 +0900
@@ -0,0 +1,116 @@
+FILE *fopen(name,mode)
+char *name,*mode;
+{FILE *fcbp;
+ char *p;
+ int rd,wt,cm;
+	rd = wt = cm = 0;
+	for ( p = mode; *p; p++ ) {
+		switch ( *p ) {
+		case 'r':
+			rd = 1; break;
+		case 'w':
+			wt = 1; break;
+		case 'c':
+			cm = 1; break;
+		default:
+			return NULL;
+		}
+	}
+	if ( !(rd ^ wt) ) return NULL;
+	if ( rd ) return _open(name,cm);
+	else return _create(name,cm);
+}
+
+FILE *_open(name,cm)
+char *name;
+int cm;
+{FILE *fcbp;
+ int i;
+	for ( i = 0; i < NFILES; i++)
+		if ( _fcbtbl[i] == NULL ) break;
+	if ( i >= NFILES) return NULL;
+	if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL;
+	if ( _setname(name,fcbp) == 0 ) return NULL;
+	if ( FMS(fcbp,1) < 0 ) return NULL;
+	fcbp[59] = cm ? 0 : 0xff;
+	fcbp[60] = 0;
+	return (_fcbtbl[i] = fcbp);
+}
+
+FILE *_create(name,cm)
+char *name;
+int cm;
+{FILE *fcbp;
+ int i;
+	for ( i = 0; i < NFILES; i++)
+		if ( _fcbtbl[i] == NULL ) break;
+	if ( i >= NFILES) return NULL;
+	if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL;
+	if ( _setname(name,fcbp) == 0 ) return NULL;
+	if ( FMS(fcbp,2) < 0 )
+	{	if ( (fcbp[1] != 3) || (FMS(fcbp,12) < 0) ) return NULL;
+		_setname(name,fcbp);
+		if (FMS(fcbp,2) < 0) return NULL;
+	}
+	fcbp[15] = 0;
+	fcbp[59] = cm ? 0 : 0xff;
+	fcbp[60] = 0;
+	return (_fcbtbl[i] = fcbp);
+}
+
+fclose(fcbp)
+FILE *fcbp;
+{int i;
+	for ( i = 0; i < NFILES; i++ )
+		if ( fcbp == _fcbtbl[i] ) break;
+	if ( i >= NFILES ) return EOF;
+	_fcbtbl[i] = NULL;
+	if ( (fcbp == STDIN) || (fcbp == STDOUT) || (fcbp == STDERR) ) return 0;
+	if ( FMS(fcbp,4) < 0 ) return EOF;
+	mfree(fcbp);
+	return 0;
+}
+
+_setname(name,fcbp)
+char *name;
+FILE *fcbp;
+{int i;
+	while(isspace(*name)) ++name;
+	if (isdigit(*name))
+	{	fcbp[3] = *name++ - '0';
+		if (*name++ != '.') return 0;
+	}
+	else fcbp[3] = 0xff;
+	for (i = 4; i < 15; ++i) fcbp[i] = 0;
+	if (!isalpha(*name)) return -1;
+	for (i = 4; i < 12; ++i)
+	{	if (!*name || (*name == '.')) break;
+		fcbp[i] = *name++;
+	}
+	while (*name && (*name != '.')) ++name;
+	if (*name == '.')
+	{	++name;
+		for (i = 12; i < 15; ++i)
+		{	if (!*name) break;
+			fcbp[i] = *name++;
+		}
+	}
+	return 1;
+}
+
+fflush(fp)
+FILE *fp;
+{       return 0;
+}
+
+unlink(fname)
+char *fname;
+{char p[320];
+        return ((_setname(fname,p) || FMS(p,12) < 0) ? -1 : 0);
+}
+        
+rename(s,t)
+char *s,*t;
+{char p[320];
+        return ((_setname(s,p) || _setname(t,p+49) || FMS(p,13) < 0) ? -1 : 0);
+}