forsyth20121205-174063a80cc13 years agoHistory
88 lines · 1.4 KB · C
RawDownload
#include	"mk.h" static char *vexpand(char*, Envy*, Bufblock*); voidshprint(char *s, Envy *env, Bufblock *buf){	int n;	Rune r; 	while(*s) {		n = chartorune(&r, s);		if (r == '$')			s = vexpand(s, env, buf);		else {			rinsert(buf, r);			s += n;			s = copyq(s, r, buf);	/*handle quoted strings*/		}	}	insert(buf, 0);} static char *mygetenv(char *name, Envy *env){	if (!env)		return 0;	if (symlook(name, S_WESET, 0) == 0 && symlook(name, S_INTERNAL, 0) == 0)		return 0;		/* only resolve internal variables and variables we've set */	for(; env->name; env++){		if (strcmp(env->name, name) == 0)			return wtos(env->values, ' ');	}	return 0;} static char *vexpand(char *w, Envy *env, Bufblock *buf){	char *s, carry, *p, *q; 	assert("vexpand no $", *w == '$');	p = w+1;	/* skip dollar sign */	if(*p == '{') {		p++;		q = utfrune(p, '}');		if (!q)			q = strchr(p, 0);	} else		q = shname(p);	carry = *q;	*q = 0;	s = mygetenv(p, env);	*q = carry;	if (carry == '}')		q++;	if (s) {		bufcpy(buf, s, strlen(s));		free(s);	} else 		/* copy name intact*/		bufcpy(buf, w, q-w);	return(q);} voidfront(char *s){	char *t, *q;	int i, j;	char *flds[512]; 	q = strdup(s);	i = getfields(q, flds, 512, 0, " \t\n");	if(i > 5){		flds[4] = flds[i-1];		flds[3] = "...";		i = 5;	}	t = s;	for(j = 0; j < i; j++){		for(s = flds[j]; *s; *t++ = *s++);		*t++ = ' ';	}	*t = 0;	free(q);}