commit 52d2e21
hovercats
·
2026-04-25 18:04:41 +0000 UTC
parent b80be88
rc: port conversion of $PATH to $path from benavento/rc. this makes rc inherit the value of $PATH
2 files changed,
+165,
-1
+164,
-0
1@@ -0,0 +1,164 @@
2+From 82316253f508e421bd6f3498310fad3d65779627 Mon Sep 17 00:00:00 2001
3+From: hovercats <hovercatswithlasereyes@protonmail.com>
4+Date: Sat, 25 Apr 2026 16:54:31 +0200
5+Subject: [PATCH] convert $PATH to $path
6+
7+---
8+ exec.c | 1 +
9+ fns.h | 1 +
10+ rc.h | 1 +
11+ var.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
12+ 4 files changed, 95 insertions(+), 4 deletions(-)
13+
14+diff --git a/exec.c b/exec.c
15+index e499d9f..1c11e4a 100644
16+--- a/exec.c
17++++ b/exec.c
18+@@ -244,6 +244,7 @@ main(int argc, char *argv[])
19+ Trapinit();
20+ Vinit();
21+ inttoascii(num, mypid = getpid());
22++ pathinit();
23+ setvar("pid", newword(num, (word *)0));
24+ setvar("cflag", flag['c']?newword(flag['c'][0], (word *)0)
25+ :(word *)0);
26+diff --git a/fns.h b/fns.h
27+index 1644d1e..a99f6fa 100644
28+--- a/fns.h
29++++ b/fns.h
30+@@ -49,6 +49,7 @@ int mapfd(int);
31+ int match(char*, char*, int);
32+ char* makepath(char*, char*);
33+ void panic(char*, int);
34++void pathinit(void);
35+ void pfln(io*, char*, int);
36+ void poplist(void);
37+ void popword(void);
38+diff --git a/rc.h b/rc.h
39+index a688663..3f48cce 100644
40+--- a/rc.h
41++++ b/rc.h
42+@@ -117,6 +117,7 @@ struct var{
43+ int pc; /* pc of start of function */
44+ char fnchanged;
45+ char changed;
46++ void (*changefn)(var*);
47+ char name[];
48+ };
49+ var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
50+diff --git a/var.c b/var.c
51+index 73b01fa..9ea49bd 100644
52+--- a/var.c
53++++ b/var.c
54+@@ -93,12 +93,74 @@ vlook(char *name)
55+ }
56+
57+ void
58+-setvar(char *name, word *val)
59++_setvar(char *name, word *val, int callfn)
60+ {
61+- var *v = vlook(name);
62++ struct var *v = vlook(name);
63+ freewords(v->val);
64+- v->val = val;
65+- v->changed = 1;
66++ v->val=val;
67++ v->changed=1;
68++ if(callfn && v->changefn)
69++ v->changefn(v);
70++}
71++
72++void
73++setvar(char *name, word *val)
74++{
75++ _setvar(name, val, 1);
76++}
77++
78++void
79++bigpath(var *v)
80++{
81++ /* convert $PATH to $path */
82++ char *p, *q;
83++ word **l, *w;
84++
85++ if(v->val == 0){
86++ _setvar("path", 0, 0);
87++ return;
88++ }
89++ p = v->val->word;
90++ w = 0;
91++ l = &w;
92++ /*
93++ * Doesn't handle escaped colon nonsense.
94++ */
95++ if(p[0] == 0)
96++ p = 0;
97++ while(p){
98++ q = strchr(p, ':');
99++ if(q)
100++ *q = 0;
101++ *l = newword(p[0] ? p : ".", 0);
102++ l = &(*l)->next;
103++ if(q){
104++ *q = ':';
105++ p = q+1;
106++ }else
107++ p = 0;
108++ }
109++ _setvar("path", w, 0);
110++}
111++
112++char*
113++list2strcolon(word *words)
114++{
115++ char *value, *s, *t;
116++ int len = 0;
117++ word *ap;
118++ for(ap = words;ap;ap = ap->next)
119++ len+=1+strlen(ap->word);
120++ value = emalloc(len+1);
121++ s = value;
122++ for(ap = words;ap;ap = ap->next){
123++ for(t = ap->word;*t;) *s++=*t++;
124++ *s++=':';
125++ }
126++ if(s==value)
127++ *s='\0';
128++ else s[-1]='\0';
129++ return value;
130+ }
131+
132+ void
133+@@ -107,3 +169,29 @@ freevar(var *v)
134+ freewords(v->val);
135+ free(v);
136+ }
137++
138++void
139++littlepath(var *v)
140++{
141++ /* convert $path to $PATH */
142++ char *p;
143++ word *w;
144++
145++ p = list2strcolon(v->val);
146++ w = new(word);
147++ w->word = p;
148++ w->next = 0;
149++ _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */
150++}
151++
152++void
153++pathinit(void)
154++{
155++ var *v;
156++
157++ v = gvlook("path");
158++ v->changefn = littlepath;
159++ v = gvlook("PATH");
160++ v->changefn = bigpath;
161++ bigpath(v);
162++}
163+--
164+2.49.0
165+
+1,
-1
1@@ -1 +1 @@
2-3e907e648d r1
3+3e907e648d r2