Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include        "mk.h"

static char *vexpand(char*, Envy*, Bufblock*);
static char *shquote(char*, Rune, Bufblock*);
static char *shbquote(char*, Bufblock*);

void
shprint(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);
}

void
front(char *s)
{
        char *t, *q;
        int i, j;
        char *flds[512];

        q = strdup(s);
        i = getfields(q, flds, nelem(flds), 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);
}