/* gbos libc C helpers (compiled once, linked into every program). */ #include "gbos.h" /* print an unsigned int in decimal */ void putu(unsigned int n) { char buf[5]; unsigned char i = 0; if (n == 0) { putc('0'); return; } while (n) { buf[i++] = '0' + (n % 10); n = n / 10; } while (i) putc(buf[--i]); } /* parse a decimal number (stops at the first non-digit) */ unsigned char atou(const char *s) { unsigned char n = 0; while (*s >= '0' && *s <= '9') { n = n * 10 + (*s - '0'); s++; } return n; } /* tokenize the argument string in place into argv[]; returns argc. (replaces the spaces in the arg string with NULs) */ unsigned char argv_parse(char **argv, unsigned char maxv) { char *p = getargs(); unsigned char argc = 0; for (;;) { while (*p == ' ') p++; if (*p == 0) break; if (argc < maxv) argv[argc] = p; argc++; while (*p != 0 && *p != ' ') p++; if (*p == ' ') *p++ = 0; } return argc; } /* return nonzero if single-char flag `f` appears (as -f or within -abc) */ unsigned char hasflag(char **argv, unsigned char argc, char f) { unsigned char i, j; for (i = 0; i < argc; i++) { if (argv[i][0] != '-') continue; for (j = 1; argv[i][j]; j++) if (argv[i][j] == f) return 1; } return 0; } /* return the value for option - ("-n 5" or "-n5"), or 0 if absent */ char *optval(char **argv, unsigned char argc, char opt) { unsigned char i; for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == opt) { if (argv[i][2]) return &argv[i][2]; if (i + 1 < argc) return argv[i+1]; return 0; } } return 0; }