diff os9/mc09/scanf.txt @ 99:92ed427b7f7d

add micro-c by mohta
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 27 Dec 2018 11:01:16 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os9/mc09/scanf.txt	Thu Dec 27 11:01:16 2018 +0900
@@ -0,0 +1,157 @@
+
+_fskipspc(fp)
+FILE *fp;
+{char c;
+        while (_isspace(c = getc(fp)));
+        return c;
+}
+
+_isspace(c)
+char c;
+{       return ((c == ' ') || (c == '\t'));
+}
+
+scanf(s)
+char *s;
+{int i;
+        i = _fscanf(stdin,s,(int *)&s+1);
+        if (_fch && ((_ch == EOF) || (_ch == '\n'))) _fch = 0;
+        return i;
+}
+
+fscanf(fp,s)
+FILE *fp;
+char *s;
+{       return _fscanf(fp,s,(int *)&s+1);
+}
+
+_fscanf(fp,s,p)
+FILE *fp;
+char *s;
+int *p;
+{char c,ch;
+ int m,n,r,x;
+        n = 0;
+        while(c = *s++)
+                if (!_isspace(c))
+                if (c != '%')
+                {       if ((ch = _fskipspc(fp)) == EOF) return EOF;
+                        if (ch != c) return n;
+                }
+                else
+                {       if (x = (*s == '*')) ++s;
+                        if (isdigit(*s)) s += _getint(&m,s);
+                        else m = 32767;
+                        switch(c = *s++)
+                        {case 'd' :
+                                r = _atoin(fp,*p++,m,x);
+                                break;
+                        case 'o' :
+                                r = _otoin(fp,*p++,m,x);
+                                break;
+                        case 'x' :
+                                r = _xtoin(fp,*p++,m,x);
+                                break;
+                        case 'c' :
+                                r = _fgetc(fp,*p++,x);
+                                break;
+                        case 's' :
+                                r = _getstrn(fp,*p++,m,x);
+                                break;
+                        case '\0':
+                                return n;
+                        default:
+                                if ((ch = _fskipspc(fp)) == EOF) return EOF;
+                                if (ch != c) return n;
+                                continue;
+                        }
+                        if (!x) ++n;
+                        if (r == EOF) return EOF;
+                        if (r) return n;
+                }
+        return n;
+}
+
+_atoin(fp,p,m,x)
+FILE *fp;
+int *p,m,x;
+{int i,s;
+ char c;
+        if (isdigit(c = _fskipspc(fp)) || (c == '-'))
+        {       if (s = (c == '-')) c = getc(fp);
+                for (i = 0; isdigit(c) && --m >= 0; c = getc(fp))
+                                                i = i * 10 + c - '0';
+                ungetc(c,fp);
+                if (!x) *p = (s ? -i : i);
+                return 0;
+        }
+        return ((c == EOF) ? EOF : 1);
+}
+
+_otoin(fp,p,m,x)
+FILE *fp;
+int *p,m,x;
+{int i;
+ char c;
+        if (isoct(c = _fskipspc(fp)))
+        {       for (i = 0; isoct(c) && --m >= 0; c = getc(fp))
+                                                i = i * 8 + c -'0';
+                ungetc(c,fp);
+                if (!x) *p = i;
+                return 0;
+        }
+        return ((c == EOF) ? EOF : 1);
+}
+
+isoct(c)
+char c;
+{       return ('0' <= c && c <= '7');
+}
+
+_xtoin(fp,p,m,x)
+FILE *fp;
+int *p,m,x;
+{int i;
+ char c;
+        if (ishex(c = _fskipspc(fp)))
+        {       for (i = 0; ishex(c) && --m >= 0; c = getc(fp))
+                        if (isdigit(c)) i = i * 16 + c - '0';
+                        else if ('A' <= (c = toupper(c)) && c <= 'F')
+                                        i = i * 16 + c - ('A'-10);
+                ungetc(c,fp);
+                if (!x) *p = i;
+                return 0;
+        }
+        return ((c == EOF) ? EOF : 1);
+}
+
+ishex(c)
+char c;
+{       return (isdigit(c) || ('A' <= (c = toupper(c)) && c <= 'F'));
+}
+
+_fgetc(fp,p,x)
+FILE *fp;
+char *p;
+int x;
+{char c;
+        if ((c = getc(fp)) == EOF) return EOF;
+        if (!x) *p = c;
+        return 0;
+}
+
+_getstrn(fp,p,m,x)
+FILE *fp;
+char *p;
+int m,x;
+{char c,*q;
+        if (((c = _fskipspc(fp)) == EOF) || (c == '\n')) return EOF;
+        for (q = p; !_isspace(c) && --m >= 0; c = getc(fp))
+        {       if ((c == EOF) || (c == '\n')) break;
+                if ((c == '\b') && (q != p)) --q;
+                else if (!x) *q++ = c;
+        }
+        ungetc(c,fp);
+        if (!x) *q = '\0';
+        return 0;
+}