annotate os9/mc09/mclibos9.c @ 101:15569aa4098e

micro c continue
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 27 Dec 2018 15:40:50 +0900
parents 990add11e9f8
children 09148bb27659
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
1 /*
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
2 * os9 driver
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
3 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
4
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
5 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
6 ifp1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
7 use defsfile
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
8 endc
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
9 #endasm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
10
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
11 typedef struct {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
12 int fd; /* 0 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
13 int mode; /* 2 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
14 int len; /* 4 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
15 char *name; /* 6 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
16 unsigned char*ptr; /* 8 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
17 unsigned char buf[256]; /* 10 */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
18 } FILE ;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
19
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
20 #define FCBSIZE (sizeof(FILE))
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
21
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #define NFILES 8
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #define NULL 0
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #define EOF (-1)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #define stdin _fcbtbl[0]
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #define stdout _fcbtbl[1]
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #define stderr _fcbtbl[2]
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 FILE *_fcbtbl[NFILES];
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
33 FILE _s0[3];
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
34
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
35 #define STDIN (&_s0[0])
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
36 #define STDOUT (&_s0[1])
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
37 #define STDERR (&_s0[2])
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
38
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
39 _main(args)
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
40 char *args;
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 {int i;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
42 char **argv,*p;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
43 int argc,n,quote,c;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
44 stdin = STDIN; stdin->fd = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
45 stdout = STDOUT; stdout->fd = 1;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
46 stderr = STDERR; stderr->fd = 2;
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 initheap();
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 for ( i = 3; i < NFILES; i++ ) _fcbtbl[i] = NULL;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
49 /* create argv here */
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
50 argc = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
51 argv = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
52 n = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
53 quote = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
54 for( i = 0; i < 2 ; i++ ) {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
55 if (i==1 && argc) { argv = (char**)malloc(sizeof(char*)*argc; }
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
56 p = args;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
57 while((c = *p++)) {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
58 if (i==1) argv[n] = args;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
59 if (c=='\'') {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
60 if (!quote) {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
61 if (i==1) argv[n]++;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
62 quote = 1;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
63 continue;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
64 } else {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
65 if (i==1) p[-1]=0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
66 quote = 0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
67 }
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
68 } else if (c=='\\') {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
69 p++;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
70 continue;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
71 } else if (c==' ') {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
72 if (quote)
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
73 continue;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
74 if (i==1) p[-1]=0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
75 }
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
76 n++;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
77 }
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
78 p[-1]=0;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
79 }
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 main(argc,argv);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 }
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 FILE *fopen(name,mode)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 char *name,*mode;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 {FILE *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 char *p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 int rd,wt,cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 rd = wt = cm = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 for ( p = mode; *p; p++ ) {
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 switch ( *p ) {
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 case 'r':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 rd = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 case 'w':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 wt = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 case 'c':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 cm = 1; break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 default:
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 return NULL;
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 if ( !(rd ^ wt) ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 if ( rd ) return _open(name,cm);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 else return _create(name,cm);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 FILE *_open(name,cm)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 char *name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 int cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 {FILE *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 for ( i = 0; i < NFILES; i++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 if ( _fcbtbl[i] == NULL ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 if ( i >= NFILES) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 if ( _setname(name,fcbp) == 0 ) return NULL;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
116 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
117 pshs x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
118 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
119 lda 2,x mode
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
120 ldb 3,x src attribute
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
121 leax 6,x name
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
122 os9 I$Open
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
123 bcc _LC0001
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
124 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
125 clrb
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
126 std ,x
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
127 bra _LC0002
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
128 _LC0001
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
129 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
130 clra
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
131 stD 2,x err code
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
132 ldd #-1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
133 std ,x
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
134 _LC0002
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
135 puls x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
136 #endasm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
137 if fcbp->fd < 0 ) return NULL;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
138 fcbp->ptr = fcpp->buf;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
139 fcbp->len = 0;
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 return (_fcbtbl[i] = fcbp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 FILE *_create(name,cm)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 char *name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 int cm;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 {FILE *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 for ( i = 0; i < NFILES; i++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 if ( _fcbtbl[i] == NULL ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 if ( i >= NFILES) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 if ( _setname(name,fcbp) == 0 ) return NULL;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
153 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
154 pshs x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
155 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
156 lda 2,x mode
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
157 ldb 3,x src attribute
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
158 leax 6,x name
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
159 os9 F$Create
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
160 bcc _LC0001
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
161 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
162 clrb
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
163 std ,x
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
164 bra _LC0002
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
165 _LC0001
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
166 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
167 clra
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
168 stD 2,x err code
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
169 ldd #-1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
170 std ,x
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
171 _LC0002
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
172 puls x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
173 #endasm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
174 if fcbp->fd < 0 ) return NULL;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
175 fcbp->ptr = fcpp->buf;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
176 fcbp->len = 0;
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 return (_fcbtbl[i] = fcbp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 fclose(fcbp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 FILE *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 for ( i = 0; i < NFILES; i++ )
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 if ( fcbp == _fcbtbl[i] ) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 if ( i >= NFILES ) return EOF;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 _fcbtbl[i] = NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 if ( (fcbp == STDIN) || (fcbp == STDOUT) || (fcbp == STDERR) ) return 0;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
188 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
189 pshs x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
190 ldx -4,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
191 lda ,x
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
192 os9 I$Close
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
193 puls x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
194 #endasm
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 mfree(fcbp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 _setname(name,fcbp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 char *name,*fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 while(isspace(*name)) ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 if (isdigit(*name))
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 { fcbp[3] = *name++ - '0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 if (*name++ != '.') return 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 else fcbp[3] = 0xff;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 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
209 if (!isalpha(*name)) return -1;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 for (i = 4; i < 12; ++i)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 { if (!*name || (*name == '.')) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 fcbp[i] = *name++;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 while (*name && (*name != '.')) ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 if (*name == '.')
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 { ++name;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 for (i = 12; i < 15; ++i)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 { if (!*name) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 fcbp[i] = *name++;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 return 1;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 getc(fcbp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 char *fcbp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 {
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
229 int c;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
230 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
231 pshs x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
232 ldd ,u c
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
233 PSHS A,B
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
234 ldx 2,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
235 lda 1,x file descriptor
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
236 leax 1,S
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
237 clr ,s
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
238 ldy #1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
239 os9 I$Read
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
240 bcc _LC0003
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
241 ldd #-1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
242 std ,s
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
243 _LC0003
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
244 puls d,x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
245 #endasm
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 putc(c,fcbp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 char c,*fcbp;
101
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
250 {
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
251 int ret;
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
252 #asm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
253 pshs x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
254 ldd ,u c
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
255 PSHS A,B
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
256 ldx 2,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
257 lda 1,x file descriptor
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
258 leax 1,S
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
259 ldy #1
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
260 os9 I$Write
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
261 puls d,x,y,u
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
262 #endasm
15569aa4098e micro c continue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
263 return c;
99
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 getchar()
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 { return getc(stdin);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 putchar(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 { return putc(c,stdout);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 printf(s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 { _fprintf(stdout,s,(int *)&s+1);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 fprintf(f,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 char *f,*s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 { _fprintf(f,s,(int *)&s+1);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 _fprintf(f,s,p)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 char *f,*s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 int *p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 {int l,m,n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 char c,buf[8];
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 while(c = *s++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 if (c != '%') putc(c,f);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 else
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 { if (l=(*s == '-')) ++s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 if (isdigit(*s)) s += _getint(&m,s);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 else m = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 if (*s == '.') ++s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 if (isdigit(*s)) s += _getint(&n,s);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 else n = 32767;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 switch(*s++)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 {case 'd':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 itoa(*p++,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 case 'o':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 itooa(*p++,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 case 'x':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 itoxa(*p++,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 case 'u':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 itoua(*p++,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 case 'c':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 ctos(*p++,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 case 's':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 _putstr(f,*p++,l,m,n);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 continue;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 case '\0':
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 return;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 default:
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 ctos(c,buf);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 _putstr(f,buf,l,m,n);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 _getint(p,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 int *p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 for(*p=i=0; isdigit(*s); ++i) *p = *p * 10 + *s++ - '0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 return i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 _putstr(f,s,l,m,n)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 char *f,*s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 int l,m,n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 {int k;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 k = (strlen(s) < n ? strlen(s) : n);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 m = (k < m ? m-k : 0);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 if (l)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 { _putsn(f,s,n);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 _putspc(f,m);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 else
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 { _putspc(f,m);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 _putsn(f,s,n);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 _putsn(f,s,n)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 char *f,*s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 { while(*s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 if (--n >= 0) putc(*s++,f);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 else break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 _putspc(f,n)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 char *f;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 { while(--n >= 0) putc(' ',f);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
365
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
366 puts(s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 { while(*s) putchar(*s++);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
370
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 itoa(n,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 { if (n < 0)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 { *s++ = '-';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 return (itoua(-n,s)+1);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 return itoua(n,s);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
380
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 itoua(n,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 { return _itoda(n,s,10);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 itooa(n,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 { return _itoda(n,s,8);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 itoxa(n,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 { return _itoda(n,s,16);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 _itoac(n)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 int n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 { return (n + ((n < 10) ? '0' : ('A'-10)));
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
403
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 _itoda(n,s,r)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 unsigned n;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 int r;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
407 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 char t[8],*u;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 u = t;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 *u++ = '\0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 do *u++ = _itoac(n % r); while(n /= r);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 for (i=0; *s++ = *--u; ++i);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 return i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 char *ctos(c,s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 char c,*s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 { s[0] = c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 s[1] = '\0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 return s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 strlen(s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 for(i = 0; *s++; ++i);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 return i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 isdigit(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 { return '0' <= c && c <= '9';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 isspace(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 { return (c == ' ' || c == '\t' || c == '\n');
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 isalpha(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 { return (isupper(c) || islower(c) || c == '_');
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 isupper(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 { return ('A' <= c && c <= 'Z');
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 islower(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 { return ('a' <= c && c <= 'z');
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 toupper(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 { return (islower(c) ? c + ('A'-'a') : c);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 tolower(c)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 char c;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 { return (isupper(c) ? c + ('a'-'A') : c);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 atoi(s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 char *s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 while (isspace(*s)) ++s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 for (i = 0; isdigit(*s);) i = i * 10 + *s++ - '0';
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 return i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
473
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 typedef struct header
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 { struct header *bptr;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 unsigned bsize;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 } HEADER;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
478
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 HEADER base,*allocp,*heapp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
480
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 char *malloc(s)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 unsigned s;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 {HEADER *p,*q;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 int nunits;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 nunits = 1 + (s + sizeof(HEADER) - 1) / sizeof(HEADER);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 if ((q = allocp) == NULL)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 { base.bptr = allocp = q = &base;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 base.bsize = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 for (p = q->bptr; ; q = p,p = p->bptr)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 { if (p->bsize >= nunits)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 { if (p->bsize == nunits)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 q->bptr = p->bptr;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 else
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 { p->bsize -= nunits;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 p += p->bsize;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 p->bsize = nunits;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 allocp = q;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 clearblock(p);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 return ((char *)(p + 1));
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 if (p == allocp)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 if ((p = morecore(nunits)) == NULL)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 return(NULL);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
508
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 clearblock(p)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 HEADER *p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 {char *s,*t;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 s = (char *)(p + 1);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 t = (char *)(p + p->bsize);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 while (s < t) *s++ = 0;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 #define NALLOC 128
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
518
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 HEADER *morecore(nu)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 unsigned nu;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 {char *cp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 HEADER *up;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 int rnu;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 rnu = NALLOC * ((nu + NALLOC - 1) / NALLOC);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 cp = sbrk(rnu * sizeof(HEADER));
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 if ((int)cp == -1) return NULL;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 up = (HEADER *) cp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 up->bsize = rnu;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 mfree((char *)(up+1));
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 return allocp;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
532
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 #asm
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 sbrk PSHS U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 LEAU ,S
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
536
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 LDD heapp,Y
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
538 BNE _mc0
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 BSR initheap
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 _mc0 PSHS D
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 TFR S,D
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 SUBD ,S++
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 CMPD 4,U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 BCC _mc1
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 LDD #-1
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 LEAS ,U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 PULS U,PC
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
548
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 _mc1 LDD 4,U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
550 LDX heapp,Y
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 LEAX D,X
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
552 LDD heapp,Y
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
553 STX heapp,Y
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 LEAS ,U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 PULS U,PC
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
556
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 initheap
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 PSHS U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 LEAU ,S
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
560 TFR Y,D
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 ADDD #_GLOBALS
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 STD heapp,Y
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
563 LEAS ,U
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 PULS U,PC
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 #endasm
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
566
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 mfree(ap)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 char *ap;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 {HEADER *p,*q;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 p = (HEADER *)ap - 1;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 for (q = allocp; !(p > q && p < q->bptr); q = q->bptr)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 if (q >= q->bptr && (p > q || p < q->bptr)) break;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
573 if (p + p->bsize == q->bptr)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 { p->bsize += q->bptr->bsize;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 p->bptr = q->bptr->bptr;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 else p->bptr = q->bptr;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 if (q + q->bsize == p)
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 { q->bsize += p->bsize;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 q->bptr = p->bptr;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 else q->bptr = p;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 allocp = q;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 }
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
585
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 unsigned freesize()
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 {int i;
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 if (!heapp) initheap();
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 return ((char *)&i - (char *)heapp);
92ed427b7f7d add micro-c by mohta
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 }