//------------------------------------------------------------------------- void Prg_ASCEND::init_x() { int i, idx; for (i = 0; i < _nvars; i++) { idx = _var_asc2hqp[i]; if (idx >= 0) _x[idx] = var_value(_vars[i]); } }
static boolean lookup_variable(char *name, lispobj *result) { struct var *var = lookup_by_name(name); if (var == NULL) return 0; else { *result = var_value(var); return 1; } }
/* change working directory * ----------------------------------------------------------------------- */ int builtin_cd(int argc, char **argv) { int c; int ok = 0; int symbolic = 1; const char *arg; unsigned long len; unsigned long n; stralloc newcwd; /* check options, -L for symlink, -P for physical path */ while((c = shell_getopt(argc, argv, "LP")) > 0) { switch(c) { case 'L': symbolic = 1; break; case 'P': symbolic = 0; break; default: builtin_invopt(argv); return 1; } } arg = argv[shell_optind]; stralloc_init(&newcwd); /* empty argument means chdir(HOME) */ if(arg == NULL) { arg = var_value("HOME", &len); if(arg[0] == '\0') { sh_msg("HOME variable not set!"); return 1; } } len = str_len(arg); /* when it isn't an absolute path we have to check CDPATH */ if(arg[0] != '/') { char path[PATH_MAX + 1]; const char *cdpath; /* loop through colon-separated CDPATH variable */ cdpath = var_value("CDPATH", NULL); do { /* too much, too much :) */ if((n = str_chr(cdpath, ':')) + len + 1 > PATH_MAX) { /* set error code and print the longer string in the error msg */ errno = ENAMETOOLONG; return builtin_errmsgn(argv, (n > len ? cdpath : arg), (n > len ? n : len), strerror(errno)); } /* copy path prefix from cdpath if present */ if(n) { byte_copy(path, n, cdpath); cdpath += n; path[n++] = '/'; } /* copy the argument and canonicalize */ str_copy(&path[n], arg); ok = shell_realpath(path, &newcwd, symbolic, &sh->cwd); /* skip the colon */ if(*cdpath == ':') cdpath++; } while(*cdpath && !ok); } /* absolute path */ else { /* last cdpath length set to 0, because we're not using cdpath here */ n = 0; ok = shell_canonicalize(arg, &newcwd, symbolic); } stralloc_nul(&newcwd); /* try to chdir() if everything's ok */ if(ok && chdir(newcwd.s) == 0) { /* print path if prefix was taken from cdpath */ if(n) { buffer_putsa(fd_out->w, &newcwd); buffer_putnlflush(fd_out->w); } /* set the path */ stralloc_move(&sh->cwd, &newcwd); /* if the path has symlinks then set sh->cwdsym */ sh->cwdsym = (ok > 1); return 0; } /* we failed */ builtin_error(argv, newcwd.s); stralloc_free(&newcwd); return 1; }
int var_completion(char *path, int index) { static char *head, *tail = NULL; static int len; static struct variable_defs *var, *help_var; if (index < 0) { clrmsg(-(index + 1)); return 1; } if (path) { head = path; tail = path + index; while (*head && isspace(*head)) head++; if (strncmp(head, "no", 2) == 0) { head += 2; if (*head == '-') head++; } help_var = var = variables; len = tail - head; return 1; } if (index) { list_completion((char *) NULL); for (;; help_var++) { if (help_var >= &variables[TABLE_SIZE]) { help_var = variables; break; } index = strncmp(help_var->var_name, head, len); if (index < 0) continue; if (index > 0) { help_var = variables; break; } if (list_completion(help_var->var_name) == 0) break; } fl; return 1; } for (; var < &variables[TABLE_SIZE]; var++) { if (len == 0) index = 0; else index = strncmp(var->var_name, head, len); if (index < 0) continue; if (index > 0) break; sprintf(tail, "%s ", var->var_name + len); msg("%.70s", var_value(var, (char *) NULL)); gotoxy(prompt_length + vc_column, prompt_line); var++; return 1; } clrmsg(vc_column); return 0; }