diff --git a/psys/src/newci.c b/psys/src/newci.c index 6ff961bd275b4951d0b2cd5328e69b0d5cf0210c..36d430e9e1afce479b4458c5890192c67d6da76a 100644 --- a/psys/src/newci.c +++ b/psys/src/newci.c @@ -37,189 +37,216 @@ void newci_loadprogram(char *name) void newci_markprogram(long *id) { - *id = 0; - return; + *id = 0; + return; } void newci_releaseprogram(long *id) { - *id = 0; - return; + *id = 0; + return; } /* This procedure should be made to do something real. */ void newci_inputstring(char *s, int mode, char *possterm, char *term, int echoterm, long *pos) { - char buf[1024]; - char *cp; + char buf[1024]; + char *cp; - fgets(buf, 1024, stdin); - if ((cp = (char *) strchr(buf, '\n'))) - *cp = '\0'; - if (*buf) - strcpy(s, buf); + fgets(buf, 1024, stdin); + if ((cp = (char *) strchr(buf, '\n'))) + *cp = '\0'; + if (*buf) + strcpy(s, buf); } static void goodfixname(char *name, char *ext, char *home, int force) { - long i; - int hassuffix; - char STR1[256]; - long FORLIM; - - /* fs_zapspaces(name); */ - if (strlen(name) > 2 && name[0] == '*' && name[1] == '*') { - strcpy_overlap(name, name + 2); - sprintf(name, "%s%s", home, strcpy(STR1, name)); - } - if (force) { - i = strlen(name); - while (i > 0 && name[i - 1] != '.' && name[i - 1] != '/' && name[i - 1] != ':') - i--; - if (i > 0 && name[i - 1] == '.') - name[i - 1] = '\0'; - } - if (*name == '\0') - return; - if (name[strlen(name) - 1] == '.') { - name[strlen(name) - 1] = '\0'; - return; - } - if (name[strlen(name) - 1] == ':') - return; - hassuffix = false; - FORLIM = strlen(name); - for (i = 0; i < FORLIM; i++) { - switch (name[i]) { - - case '/': - case ':': - hassuffix = false; - break; - - case '.': - hassuffix = true; - break; - } - } - if (!hassuffix && *ext != '\0') - sprintf(name + strlen(name), ".%s", ext); -} + size_t i; + int hassuffix; + size_t len = strlen(name); + /* fs_zapspaces(name); */ + if (len > 2 && name[0] == '*' && name[1] == '*') + { + char *sz_tmp = malloc(sizeof(char) * len + 1); + strcpy(sz_tmp, name); + + /* expand to can add home */ + len += strlen(home) + 1; /* name + home + '\0' */ + name = realloc(name, sizeof(char) * len); + + /* Add home value before the name value */ + sprintf(name, "%s%s", home, sz_tmp); + free(sz_tmp); + } + + if (force) + { + i = strlen(name); + while (i > 0 && name[i - 1] != '.' && name[i - 1] != '/' && name[i - 1] != ':') + i--; + if (i > 0 && name[i - 1] == '.') + name[i - 1] = '\0'; + } + + if (*name == '\0') + return; + + i = strlen(name) - 1; + if (name[i] == '.') + { + name[i] = '\0'; + return; + } + + if (name[i] == ':') + return; + + hassuffix = false; + + len = strlen(name); + for (i = 0; i < len; ++i) + { + switch (name[i]) + { + + case '/': + case ':': + hassuffix = false; + break; + + case '.': + hassuffix = true; + break; + } + } + + if (!hassuffix && *ext != '\0') + { + name = realloc(name, sizeof(char) * (len + strlen(ext) + 2)); /* name + '.' + ext + '\0' */ + sprintf(name + strlen(name), ".%s", ext); + } +} void newci_fixfname(char * s, char * ext, char * home) { - goodfixname(s, ext, home, 0); + goodfixname(s, ext, home, 0); } void newci_forcefname(char *s, char *ext, char *home) { - goodfixname(s, ext, home, 1); + goodfixname(s, ext, home, 1); } - void newci_fullshellescape(char *args, char *opts) { - while (isspace(*args) || *args == '!') args++; - if (fork()) - wait(NULL); - else - if (*args) - execlp("/bin/csh", "xterm", "-e", args, (char *)0); - else - execlp("/bin/csh", "xterm", (char *)0); + while (isspace(*args) || *args == '!') + args++; + + if (fork()) + wait(NULL); + else + if (*args) + execlp("/bin/csh", "xterm", "-e", args, (char *)0); + else + execlp("/bin/csh", "xterm", (char *)0); } void newci_shellescape(char *args) { - newci_fullshellescape(args, ""); + newci_fullshellescape(args, ""); } void newci_fulleditescape(char *fn, char *opts, long ln, long pos) { - if (fork()) - wait(NULL); - else - execlp("emacs", "emacs", fn, (char *)0); + if (fork()) + wait(NULL); + else + execlp("emacs", "emacs", fn, (char *)0); } void newci_eatargument() { - int i; + int i; - for (i = 2; i < P_argc; P_argv[i-1] = P_argv[i], i++) - ; - P_argc--; + /* move the argmuments to the left*/ + for (i = 2; i < P_argc; ++i) + P_argv[i-1] = P_argv[i]; + P_argc--; } -void newci_parseswitch(tab, size, bad) -newci_parsetab tab; -long size; -char *bad; +void newci_parseswitch(newci_parsetab tab, long size, char *bad) { - int i, j, found, pos = 1; + int i, j, found, pos = 1; - for (i = 0; i < size; tab[i++].used = 0) - ; - *bad = '\000'; + for (i = 0; i < size; ++i) + tab[i].used = 0; + *bad = '\000'; - while ((P_argc > 1) && (P_argv[1][0] == '-')) { - found = 0; - for (i = 0; (i < size) && (! found); i++) { - for (j = 0; (tab[i].switch_[j] != '\0') && (! found); j++) - if (tab[i].switch_[j] == P_argv[1][1]) - found = 1; - if (found) break; - } - if (! found) { - bad[strlen(bad)+1] = '\0'; - bad[strlen(bad)] = P_argv[1][1]; - } else { - tab[i].used = pos++; - switch (toupper(tab[i].kind)) { - case 'B': - break; - case 'I': - tab[i].UU.i = atol(P_argv[1]+2); - break; - case 'R': - sscanf(P_argv[1]+2, "%lf", &tab[i].UU.r); - break; - case 'S': - tab[i].UU.s = P_argv[1]+2; - break; - case 'M': - if (P_argc > 2 && !P_argv[1][2]) { - tab[i].UU.s = P_argv[2]; - newci_eatargument(); - } else { - tab[i].UU.s = P_argv[1]+2; + while ((P_argc > 1) && (P_argv[1][0] == '-')) + { + found = 0; + for (i = 0; (i < size) && (!found); i++) + { + for (j = 0; (tab[i].switch_[j] != '\0') && (!found); j++) + if (tab[i].switch_[j] == P_argv[1][1]) + found = 1; + if (found) break; + } + if (!found) + { + bad[strlen(bad) + 1] = '\0'; + bad[strlen(bad)] = P_argv[1][1]; + } + else + { + tab[i].used = pos++; + switch (toupper(tab[i].kind)) + { + case 'B': + break; + case 'I': + tab[i].UU.i = atol(P_argv[1]+2); + break; + case 'R': + sscanf(P_argv[1]+2, "%lf", &tab[i].UU.r); + break; + case 'S': + tab[i].UU.s = P_argv[1]+2; + break; + case 'M': + if (P_argc > 2 && !P_argv[1][2]) + { + tab[i].UU.s = P_argv[2]; + newci_eatargument(); + } + else + { + tab[i].UU.s = P_argv[1] + 2; + } + break; + } + } + newci_eatargument(); } - break; - } - } - newci_eatargument(); - } } - long timers_sysclock() { return sysclock(); } - long newci_fullseconds() { - return(time(NULL)); + return(time(NULL)); } - void newci_nullrecover() { - _Escape(P_escapecode); + _Escape(P_escapecode); }