ref: 642cd5f2f3f252cbe54a448c14b84c071729231b
parent: b998b1b45649a1ce604ce7460f9378efc74a6110
author: qwx <qwx@sciops.net>
date: Mon Nov 3 04:12:20 EST 2025
add awk-fseek: experimental fseek function
--- /dev/null
+++ b/awk-fseek
@@ -1,0 +1,81 @@
+diff 5dcb8d92ff849359a164b7c0d7ecae64594d6db6 uncommitted
+--- a/sys/src/cmd/awk/awk.h
++++ b/sys/src/cmd/awk/awk.h
+@@ -107,6 +107,7 @@
+ #define FTOLOWER 13
+ #define FFLUSH 14
+ #define FUTF 15
++#define FSEEK 16
+
+ /* Node: parse tree is made of nodes, with Cell's at bottom */
+
+--- a/sys/src/cmd/awk/lex.c
++++ b/sys/src/cmd/awk/lex.c
+@@ -58,6 +58,7 @@
+ { "exit", EXIT, EXIT },+ { "exp", FEXP, BLTIN },+ { "fflush", FFLUSH, BLTIN },++ { "fseek", FSEEK, BLTIN },+ { "for", FOR, FOR },+ { "func", FUNC, FUNC },+ { "function", FUNC, FUNC },+--- a/sys/src/cmd/awk/run.c
++++ b/sys/src/cmd/awk/run.c
+@@ -1533,11 +1533,21 @@
+ return True;
+ }
+
++struct files {++ Biobuf *fp;
++ char *fname;
++ int mode; /* '|', 'a', 'w' => LE/LT, GT */
++} files[FOPEN_MAX] ={++ { nil, "/dev/stdin", LT }, /* watch out: don't free this! */++ { nil, "/dev/stdout", GT },++ { nil, "/dev/stderr", GT }++};
++
+ Cell *bltin(Node **a, int) /* builtin functions. a[0] is type, a[1] is arg list */
+ {+ Cell *x, *y;
+ Awkfloat u;
+- int t;
++ int i, t;
+ Rune wc;
+ char *p, *buf;
+ char mbc[50];
+@@ -1622,6 +1632,17 @@
+ else
+ u = Bflush(fp);
+ break;
++ case FSEEK:
++ y = execute(nextarg);
++ nextarg = nextarg->nnext;
++ p = getsval(x);
++ t = atoi(getsval(y));
++ for (i = 0; i < FOPEN_MAX; i++)
++ if (files[i].fp && strcmp(p, files[i].fname) == 0){++ Bseek(files[i].fp, t, 0);
++ break;
++ }
++ break;
+ case FUTF:
+ wc = (int)getfval(x);
+ mbc[runetochar(mbc, &wc)] = 0;
+@@ -1695,16 +1716,6 @@
+ tfree(x);
+ return fp;
+ }
+-
+-struct files {+- Biobuf *fp;
+- char *fname;
+- int mode; /* '|', 'a', 'w' => LE/LT, GT */
+-} files[FOPEN_MAX] ={+- { nil, "/dev/stdin", LT }, /* watch out: don't free this! */+- { nil, "/dev/stdout", GT },+- { nil, "/dev/stderr", GT }+-};
+
+ void stdinit(void) /* in case stdin, etc., are not constants */
+ {--
⑨