diff options
| author | user <user@clank> | 2026-09-24 22:45:04 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-09-24 22:45:04 +0200 |
| commit | 4cd933009dd6ce87fe710acfca6b1f786d51040c (patch) | |
| tree | 67e50c2ab347ddc2ac3e5b6a5cf5a4cfc44cc8d0 /usr/touch.c | |
| parent | fs: mount the builtins at /bin (diff) | |
| download | gbos-4cd933009dd6ce87fe710acfca6b1f786d51040c.tar.gz gbos-4cd933009dd6ce87fe710acfca6b1f786d51040c.tar.xz gbos-4cd933009dd6ce87fe710acfca6b1f786d51040c.zip | |
usr: touch, tr, rev, cut, uniq
/# ls -l /bin > b
/# cut -d \s -f 1 b | uniq -c
52 -
- touch FILE...: gbfs has no timestamps (an MBC5 cart has no RTC), so touch
does the half that means something here - make an empty file. O_APPEND is
exactly right: it creates, and it does not truncate what is already there.
- tr [-d] SET1 [SET2]: ranges (a-z), -d to delete, and a short SET2 padded
with its last character, like tr(1). ASCII only - a 128-entry map.
- rev, uniq [-c]: one line each, from a file or stdin like the other filters.
Two things the tests caught. A bare "-" is a SET, not a flag, so `tr . -`
has to skip flag-matching only when a letter follows the dash. And uniq
compared an empty "line" against the last run at EOF and flushed a phantom
blank one - a stray "1" in uniq -c output.
tr and cut also take \s \t \n \r escapes, because the shell has no quoting:
`-d ' '` arrives as three tokens, so a space or tab delimiter was simply
untypeable. Shell quoting would be the better fix; this makes the tools
usable today without touching the parser.
Banks 49-53; 10 program slots left in the 1 MB ROM.
Diffstat (limited to 'usr/touch.c')
| -rw-r--r-- | usr/touch.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/usr/touch.c b/usr/touch.c new file mode 100644 index 0000000..4f5ba89 --- /dev/null +++ b/usr/touch.c @@ -0,0 +1,26 @@ +#include "gbos.h" +/* touch FILE...: create FILE if it does not exist, leave it alone if it does. + * + * There are no timestamps in gbfs (no RTC on an MBC5 cart), so touch only does + * the half that means anything here: make an empty file. O_APPEND is exactly + * right for it - it creates, and it does NOT truncate what is already there. */ +void main(void) { + char *argv[8]; + unsigned char argc = argv_parse(argv, 8); + unsigned char i, fd; + if (argc < 1) { + puts("usage: touch FILE..."); + nl(); + sexit(2); + } + for (i = 0; i < argc; i++) { + fd = open(argv[i], O_APPEND); + if (fd > 3) { + puts("touch: cannot create "); + puts(argv[i]); + nl(); + continue; + } + close(fd); + } +} |
