annotate mc09/fileio2.txt @ 161:91447c3ccd58

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 12 Feb 2019 09:16:24 +0900
parents 1a30cd6e5973
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 FILE *fopen(name,mode)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 char *name,*mode;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 {char *p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 int rd,wt,cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 rd = wt = cm = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 for ( p = mode; *p; p++ ) {
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 switch ( *p ) {
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 case 'r':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 rd = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 case 'w':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 wt = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 case 'c':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 cm = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 default:
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 if ( !(rd ^ wt) ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 if ( rd ) return _open(name,cm);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 else return _create(name,cm);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 FILE *_open(name,cm)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 char *name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 int cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 {FILE *fp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 for ( i = 0; i < NFILES; i++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 if ( _fptbl[i] == NULL ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 if ( i >= NFILES) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 if ( (fp = malloc(FBSIZE)) == NULL ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 if ( _setname(name,fp->_fcb) == 0 ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 if ( FMS(fp->_fcb,1) < 0 ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 fp->_fcb[59] = cm ? 0 : 0xff;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 fp->_fcb[60] = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 return (_fptbl[i] = fp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 FILE *_create(name,cm)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 char *name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 int cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 {FILE *fp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 for ( i = 0; i < NFILES; i++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 if ( _fptbl[i] == NULL ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 if ( i >= NFILES) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 if ( (fp = malloc(FBSIZE)) == NULL ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 if ( _setname(name,fp->_fcb) == 0 ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 if ( FMS(fp->_fcb,2) < 0 )
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 { if ( (fp[1] != 3) || (FMS(fp->_fcb,12) < 0) ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 _setname(name,fp->_fcb);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 if (FMS(fp->_fcb,2) < 0) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 fp->_fcb[15] = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 fp->_fcb[59] = cm ? 0 : 0xff;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 fp->_fcb[60] = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 return (_fptbl[i] = fp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 fclose(fp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 FILE *fp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 for ( i = 0; i < NFILES; i++ )
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 if ( fp == _fptbl[i] ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 if ( i >= NFILES ) return EOF;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 _fptbl[i] = NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 if ( (fp == STDIN) || (fp == STDOUT) || (fp == STDERR) ) return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 if ( fp->_fcb[2] == 2 ) fflush(fp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 if ( FMS(fp->_fcb,4) < 0 ) return EOF;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 mfree(fp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 _setname(name,fcbp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 char *name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 char *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 while(isspace(*name)) ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 if (isdigit(*name))
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 { fcbp[3] = *name++ - '0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 if (*name++ != '.') return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 else fcbp[3] = 0xff;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 for (i = 4; i < 15; ++i) fcbp[i] = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 if (!isalpha(*name)) return -1;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 for (i = 4; i < 12; ++i)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 { if (!*name || (*name == '.')) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 fcbp[i] = *name++;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 while (*name && (*name != '.')) ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 if (*name == '.')
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 { ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 for (i = 12; i < 15; ++i)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 { if (!*name) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 fcbp[i] = *name++;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 return 1;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 fflush(fp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 FILE *fp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 if ( fp == STDIN ) return EOF;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 if ( fp == STDOUT || fp == STDERR ) return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 if ( fp->_fcb[2] != 2 ) return EOF;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 for ( i = 0; i < fp->_fbp; i++ ) FMS(fp->_fcb,0,fp->fcb[i]);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 fp->_fbp = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 unlink(fname)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 char *fname;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 {char p[320];
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 return ((_setname(fname,p) || FMS(p,12) < 0) ? -1 : 0);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 rename(s,t)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 char *s,*t;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 {char p[320];
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 return ((_setname(s,p) || _setname(t,p+49) || FMS(p,13) < 0) ? -1 : 0);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }