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