*** :z/comm1.c Sun Apr 10 20:41:22 1988 --- comm1.c Sat Apr 30 16:47:04 1988 *************** *** 11,18 **** typedef struct FileInfoBlock FIB; #define DIR_SHORT 0x01 ! #define DIR_FILES 0x02 ! #define DIR_DIRS 0x04 extern int has_wild; char cwd[256]; --- 11,19 ---- typedef struct FileInfoBlock FIB; #define DIR_SHORT 0x01 ! #define DIR_VERY_SHORT 0x02 ! #define DIR_FILES 0x04 ! #define DIR_DIRS 0x08 extern int has_wild; char cwd[256]; *************** *** 151,157 **** bytes = blocks = 0L; *lspec = '\0'; ! options = get_opt("sfd",&i); if (ac == i) { ++ac; --- 157,163 ---- bytes = blocks = 0L; *lspec = '\0'; ! options = get_opt("sSfd",&i); if (ac == i) { ++ac; *************** *** 158,163 **** --- 164,170 ---- av[i] = ""; } if (!(options & (DIR_FILES | DIR_DIRS))) options |= (DIR_FILES | DIR_DIRS); + if (options & DIR_VERY_SHORT) options |= DIR_SHORT; for (; i < ac; ++i) { char **eav; *************** *** 170,178 **** if (CHECKBREAK()) break; } if (col) printf("\n"); ! if (filecount > 1) { blocks += filecount; /* account for dir blocks */ ! printf (" %ld Blocks, %ld Bytes used in %d files\n", blocks, bytes, filecount); } return (0); } --- 177,186 ---- if (CHECKBREAK()) break; } if (col) printf("\n"); ! if (filecount > 1 && !(options & DIR_VERY_SHORT)) { blocks += filecount; /* account for dir blocks */ ! printf (" %ld Blocks, %ld Bytes used in %d files\n", ! blocks, bytes, filecount); } return (0); } *************** *** 182,194 **** int options; char *filestr; { - long atol(); int isadir,slen; char sc; char *c,*s,*fi; struct FileLock *lock; char *get_pwd(); ! char *strcpy(); /* if current dir different from lspec then look for ':' or '/' if found lock it and get_pwd. --- 190,206 ---- int options; char *filestr; { int isadir,slen; char sc; char *c,*s,*fi; + #ifdef MANX struct FileLock *lock; + long atol(); char *get_pwd(); ! #else ! BPTR lock; ! char *get_pwd(BPTR); ! #endif /* if current dir different from lspec then look for ':' or '/' if found lock it and get_pwd. *************** *** 200,209 **** *s = '\0'; c = filestr; if (!*c) c = cwd; ! if (strcmp (c, &lspec)) { strcpy(lspec, c); if (col) printf("\n"); ! if (lock = (struct FileLock *)Lock(c,SHARED_LOCK)) { printf ("Directory of %s\n", get_pwd(lock)); UnLock(lock); } --- 212,221 ---- *s = '\0'; c = filestr; if (!*c) c = cwd; ! if (strcmp (c, lspec)) { strcpy(lspec, c); if (col) printf("\n"); ! if (lock = Lock(c,SHARED_LOCK)) { printf ("Directory of %s\n", get_pwd(lock)); UnLock(lock); } *** :z/execom.c Sun Apr 10 20:41:42 1988 --- execom.c Sat Apr 30 20:08:27 1988 *************** *** 96,110 **** exec_command(base) char *base; { register char *scr; register int i; - char buf[32]; - if (!H_stack) { - add_history(base); - sprintf(buf, "%d", H_tail_base + H_len); - set_var(LEVEL_SET, V_HISTNUM, buf); - } scr = malloc((strlen(base) << 2) + 2); /* 4X */ preformat(base, scr); i = fcomm(scr, 1); --- 96,169 ---- exec_command(base) char *base; { + char comBuf[270]; + register char *cp; + char *cpBeg; + char *rcp; + FILE *argResult; + int ch; + int l1, l2; + + if (!H_stack) { + add_history(base); + sprintf(comBuf, "%d", H_tail_base + H_len); + set_var(LEVEL_SET, V_HISTNUM, comBuf); + } + for(cp = base; *cp; cp++) { + if(*cp == '\\') + cp++; + else if(*cp == '`') { + cpBeg = cp++; + for(; *cp; cp++) { + if(*cp == '\\') + cp++; + else if(*cp == '`') + break; + } + if(*cp != '`') + break; + if(cp - cpBeg == 1) { + strcpy(cpBeg, cp + 1); + cp = cpBeg - 1; + continue; + } + movmem(cpBeg + 1, comBuf, cp - cpBeg - 1); + comBuf[cp - cpBeg - 1] = 0; + strcat(comBuf, " >"); + strcat(comBuf, argExec); + exec1_command(comBuf); + rcp = comBuf; + if(argResult = fopen(argExec,"r")) { + while(rcp - comBuf < sizeof(comBuf) - 1 && + (ch = getc(argResult)) != EOF) { + if(ch == '\n') + ch = ' '; + *rcp++ = ch; + } + fclose(argResult); + DeleteFile(argExec); + } + l2 = rcp - comBuf; + l2 = min(l2, max(0, 255 - (cpBeg - base))); + l1 = strlen(cp + 1); + l1 = min(l1, max(0, 255 - ((cpBeg + l2) - base))); + if(l1 && (cp + 1) != (cpBeg + l2)) { + movmem(cp + 1, cpBeg + l2, l1); + } else if(!l1) + cpBeg[l2] = 0; + if(l2) + movmem(comBuf, cpBeg, l2); + } + } + return(exec1_command(base)); + } + + exec1_command(base) + char *base; + { register char *scr; register int i; scr = malloc((strlen(base) << 2) + 2); /* 4X */ preformat(base, scr); i = fcomm(scr, 1); *** :z/globals.c Sun Apr 10 20:41:46 1988 --- globals.c Sat Apr 30 18:20:24 1988 *************** *** 84,89 **** --- 84,90 ---- long Uniq; /* unique value */ char *Cin_name, *Cout_name; /* redirection input/output name or NULL */ char *Pipe1, *Pipe2; /* the two pipe temp. files */ + char *argExec; /* `arg exec` temp. file */ struct Process *Myprocess; int S_histlen = 20; /* Max # history entries */ *** :z/main.c Sun Apr 10 20:41:48 1988 --- main.c Sat Apr 30 18:18:15 1988 *************** *** 90,96 **** init() { ! static char pipe1[32], pipe2[32]; stdin->_flags |= 0x80; /* make sure we're set as a tty */ stdout->_flags |= 0x80; /* incase of redirection in .login */ --- 102,108 ---- init() { ! static char pipe1[32], pipe2[32], arg_exec[32]; stdin->_flags |= 0x80; /* make sure we're set as a tty */ stdout->_flags |= 0x80; /* incase of redirection in .login */ *************** *** 107,114 **** --- 124,133 ---- Uniq = (long)Myprocess; Pipe1 = pipe1; Pipe2 = pipe2; + argExec = arg_exec; sprintf (pipe1, "ram:pipe1_%ld", Uniq); sprintf (pipe2, "ram:pipe2_%ld", Uniq); + sprintf (arg_exec, "ram:argExec_%ld", Uniq); } *** :z/shell.h Sun Apr 10 20:42:00 1988 --- shell.h Sat Apr 30 18:19:06 1988 *************** *** 117,122 **** --- 140,146 ---- extern char *Cin_name, *Cout_name; extern char Cin_type, Cout_type; /* these variables are in transition */ extern char *Pipe1, *Pipe2; + extern char *argExec; extern long Src_base[MAXSRC]; extern long Src_pos[MAXSRC]; *** :z/rawconsole.c Sun Apr 10 20:41:32 1988 --- rawconsole.c Sat Apr 30 21:43:32 1988 *************** *** 9,32 **** * */ #if RAW_CONSOLE extern int aux; /* for use with aux: */ - #include "shell.h" - void setraw(onoff) { if (onoff) set_raw(); else set_con(); } char * rawgets(line,prompt) char *line, *prompt; { ! char *get_var(); char *gets(); register int n, pl; register int max, i; unsigned char c1,c2,c3; --- 9,71 ---- * */ + #include "shell.h" + #if RAW_CONSOLE extern int aux; /* for use with aux: */ void setraw(onoff) { + #ifdef MANX if (onoff) set_raw(); else set_con(); + #else + if (onoff) raw(stdin); + else cooked(stdin); + #endif } + /* fignore is a ',' separated list of file name suffixes. + * return true if one of the suffixes is a suffix str + baseLength. + */ + + static int + ignoreSuff(baseLength, fignore, str) + int baseLength; + char *fignore; + char *str; + { + char suff[32]; + char *endStr; + char *cp; + int len1, len2; + + if(!fignore || strlen(str) <= baseLength) + return(0); + endStr = str + baseLength; + len1 = strlen(endStr); + for(;*fignore; fignore++) { + for(cp = suff; *fignore && *fignore != ',';) { + *cp++ = *fignore++; + } + *cp = 0; + len2 = strlen(suff); + if(!len2 || len1 < len2) + continue; + if(!strcmp(suff, endStr + (len1 - len2))) + return(1); + } + return(0); + } + char * rawgets(line,prompt) char *line, *prompt; { ! #ifdef MANX char *gets(); + #endif register int n, pl; register int max, i; unsigned char c1,c2,c3; *************** *** 37,42 **** --- 76,82 ---- int insert = 1; char rep[20]; char typeahd[256]; + char metaExpBuf[256]; static int width; int recall = -1; struct HIST *hist; *************** *** 46,51 **** --- 86,92 ---- fflush(stdout); } if (!IsInteractive(Input()) || aux ) return(gets(line)); + #ifdef MANX if (WaitForChar((long)Input(), 100L) || /* don't switch to 1L ...*/ stdin->_bp < stdin->_bend) { /* else causes read err's*/ /* printf("%s",prompt); */ *************** *** 52,57 **** --- 93,99 ---- gets(line); return(line); } + #endif setraw(1); printf("\015%s\2336n",prompt); savn = pl = n = 0; *************** *** 148,153 **** --- 190,283 ---- break; } break; + case 4: /* List filename alternatives. The parsing is too simple. */ + strcpy(metaExpBuf, "dir -S "); + { + int j; + + for(j = i; j > pl; j--) { + if(line[j - 1] == 32) + break; + } + if(i > j) { + strncat(metaExpBuf, line + j, i - j); + } + strcat(metaExpBuf, "*"); + } + printf("\233%dC\n",max - i); + setraw(0); + exec1_command(metaExpBuf); + setraw(1); + line[max] = 0; + printf( "%s%s\015\233%dC", prompt, ps, i); + break; + case 9: /* Filename completion. */ + metaExpBuf[0] = 0; + { + char **eav; + int eac; + int j, k; + int length; + char *c1, *c2; + char *fignore; + int orgLen; + + fignore = get_var(LEVEL_SET,"fignore"); + for(j = i; j > pl; j--) { + if(line[j - 1] == 32) + break; + } + if(i > j) { + strncat(metaExpBuf, line + j, i - j); + } + orgLen = strlen(metaExpBuf); + strcat(metaExpBuf, "*"); + if(eav = expand(metaExpBuf, &eac)) { + for(k = 0; k < eac && fignore; k++) { + if(!ignoreSuff(orgLen, fignore, eav[k])) + break; + } + if(k == eac) { + free_expand (eav); + break; + } + strcpy(metaExpBuf, eav[k]); + for(; k < eac; k++) { + if(ignoreSuff(orgLen, fignore, eav[k])) + continue; + c1 = metaExpBuf; + c2 = eav[k]; + while(*c1 && *c1 == *c2) { + c1++; + c2++; + } + *c1 = 0; + } + free_expand (eav); + if(length = strlen(metaExpBuf)) { + if(isdir(metaExpBuf)) { + if(metaExpBuf[length - 1] != '/' && + metaExpBuf[length - 1] != ':') { + strcat(metaExpBuf, "/"); + length++; + } + } else if(!access(metaExpBuf, 0)) { + strcat(metaExpBuf, " "); + length++; + } + } + if(i != j + length && max - i) + movmem(line + i, line + j + length, + max - i); + if(length) + movmem(metaExpBuf, line + j, length); + max += length - (i - j); + line[max] = 0; + i = j + length; + printf( "\015%s%s\015\233%dC", prompt, ps, i); + } + } + break; case 8: if (i > pl) { i--; *************** *** 242,247 **** --- 373,379 ---- line[max] = '\0'; } } + fflush(stdout); } setraw(0); return(NULL);