home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 001-099 / ff055.lzh / Csh / comm2.c < prev    next >
C/C++ Source or Header  |  1987-03-01  |  7KB  |  288 lines

  1.  
  2. /*
  3.  * COMM2.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  * version 2.05M (Manx Version and Additions) by Steve Drew 20-Jan-87
  8.  *
  9.  */
  10.  
  11. #include "shell.h"
  12.  
  13. #define BPTR_TO_C(strtag, var)  ((struct strtag *)(BADDR( (ULONG) var)))
  14.  
  15. #define TO_ASC(n)       ((n) + '0')             /* make it printable! */
  16.  
  17. /* Casting conveniences */
  18. #define PROC(task)              ((struct Process *)task)
  19. #define ROOTNODE                ((struct RootNode *)DOSBase->dl_Root)
  20. #define CLI(proc)               (BPTR_TO_C(CommandLineInterface, proc->pr_CLI))
  21.  
  22. /* Externs */
  23. extern struct DosLibrary *DOSBase;      /* dos library base pointer */
  24.  
  25. do_abortline()
  26. {
  27.    Exec_abortline = 1;
  28.    return (0);
  29. }
  30.  
  31. do_return()
  32. {
  33.    Exec_abortline = 1;
  34.    if (Src_stack) {
  35.       fseek (Src_base[Src_stack - 1], 0, 2); 
  36.       return ((ac < 2) ? 0 : atoi(av[1]));
  37.    } else {
  38.       main_exit ((ac < 2) ? 0 : atoi(av[1]));
  39.    }
  40. }
  41.  
  42. /*
  43.  * STRHEAD
  44.  *
  45.  * place a string into a variable removing everything after and including
  46.  * the 'break' character or until a space is found in the string.
  47.  *
  48.  * strhead varname breakchar string
  49.  *
  50.  */
  51.  
  52. do_strhead()
  53. {
  54.    register char *str = av[3];
  55.    char bc = *av[2];
  56.  
  57.    while (*str && *str != bc)
  58.       ++str;
  59.    *str = '\0';
  60.    set_var (LEVEL_SET, av[1], av[3]);
  61.    return (0);
  62. }
  63.  
  64. do_strtail()
  65. {
  66.    register char *str = av[3];
  67.    char bc = *av[2];
  68.  
  69.    while (*str && *str != bc)
  70.       ++str;
  71.    if (*str)
  72.       ++str;
  73.    set_var (LEVEL_SET, av[1], str);
  74.    return (0);
  75. }
  76.  
  77.  
  78.  
  79. /*
  80.  * if A < B   <, >, =, <=, >=, !=, where A and B are either:
  81.  * nothing
  82.  * a string
  83.  * a value (begins w/ number)
  84.  */
  85.  
  86. do_if(garbage, com)
  87. char *garbage;
  88. {
  89.    char *v1, *v2, *v3, result, num;
  90.    int n1, n2;
  91.  
  92.    switch (com) {
  93.    case 0:
  94.       if (If_stack && If_base[If_stack - 1]) {
  95.          If_base[If_stack++] = 1;
  96.          break;
  97.       }
  98.       result = num = 0;
  99.       if (ac <= 2) {       /* if $var; */
  100.          if (ac == 1 || strlen(av[1]) == 0 || (strlen(av[1]) == 1 && *av[1] == ' '))
  101.             goto do_result;
  102.          result = 1;
  103.          goto do_result;
  104.       }
  105.       if (ac != 4) {
  106.          ierror(NULL, 500);
  107.          break;
  108.       }
  109.       v1 = av[1]; v2 = av[2]; v3 = av[3];
  110.       while (*v1 == ' ')
  111.          ++v1;
  112.       while (*v2 == ' ')
  113.          ++v2;
  114.       while (*v3 == ' ')
  115.          ++v3;
  116.       if (*v1 >= '0' && *v1 <= '9') {
  117.          num = 1;
  118.          n1 = atoi(v1);
  119.          n2 = atoi(v3);
  120.       }
  121.       while (*v2) {
  122.          switch (*v2++) {
  123.          case '>':
  124.             result |= (num) ? (n1 >  n2) : (strcmp(v1, v3) > 0);
  125.             break;
  126.          case '<':
  127.             result |= (num) ? (n1 <  n2) : (strcmp(v1, v3) < 0);
  128.             break;
  129.          case '=':
  130.             result |= (num) ? (n1 == n2) : (strcmp(v1, v3) ==0);
  131.             break;
  132.          default:
  133.             ierror (NULL, 503);
  134.             break;
  135.          }
  136.       }
  137. do_result:
  138.       If_base[If_stack++] = !result;
  139.       break;
  140.    case 1:
  141.       if (If_stack > 1 && If_base[If_stack - 2])
  142.          break;
  143.       if (If_stack)
  144.          If_base[If_stack - 1] ^= 1;
  145.       break;
  146.    case 2:
  147.       if (If_stack)
  148.          --If_stack;
  149.       break;
  150.    }
  151.    disable = (If_stack) ? If_base[If_stack - 1] : 0;
  152.    return (0);
  153. }
  154.  
  155. do_label()
  156. {
  157.    char aseek[32];
  158.  
  159.    if (Src_stack == 0) {
  160.       ierror (NULL, 502);
  161.       return (-1);
  162.    }
  163.    sprintf (aseek, "%ld %d", Src_pos[Src_stack-1], If_stack);
  164.    set_var (LEVEL_LABEL + Src_stack - 1, av[1], aseek);
  165.    return (0);
  166. }
  167.  
  168. do_goto()
  169. {
  170.    int new;
  171.    long pos;
  172.    char *lab;
  173.  
  174.    if (Src_stack == 0) {
  175.       ierror (NULL, 502);
  176.    } else {
  177.       lab = get_var (LEVEL_LABEL + Src_stack - 1, av[1]);
  178.       if (lab == NULL) {
  179.          ierror (NULL, 501);
  180.       } else {
  181.          pos = atoi(lab);
  182.          fseek (Src_base[Src_stack - 1], pos, 0);
  183.          Src_pos[Src_stack - 1] = pos;
  184.          new = atoi(next_word(lab));
  185.          for (; If_stack < new; ++If_stack)
  186.             If_base[If_stack] = 0;
  187.          If_stack = new;
  188.       }
  189.    }
  190.    Exec_abortline = 1;
  191.    return (0);      /* Don't execute rest of this line */
  192. }
  193.  
  194.  
  195. do_inc(garbage, com)
  196. char *garbage;
  197. {
  198.    char *var;
  199.    char num[32];
  200.  
  201.    if (ac == 3)
  202.       com = atoi(av[2]);
  203.    var = get_var (LEVEL_SET, av[1]);
  204.    if (var) {
  205.       sprintf (num, "%d", atoi(var)+com);
  206.       set_var (LEVEL_SET, av[1], num);
  207.    }
  208.    return (0);
  209. }
  210.  
  211. do_input()
  212. {
  213.    char in[256];
  214.  
  215.    if ((gets(in)) != 0)
  216.       set_var (LEVEL_SET, av[1], in);
  217.    return (0);
  218. }
  219.  
  220. do_ver()
  221. {
  222.    puts (VERSION);
  223.    return (0);
  224. }
  225.  
  226.  
  227. do_ps()
  228. {
  229.     /* this code fragment based on ps.c command by Dewi Williams */
  230.  
  231.         register ULONG   *tt;           /* References TaskArray         */
  232.         register int     count;         /* loop variable                */
  233.         register UBYTE   *port;         /* msgport & ptr arith          */
  234.         register struct Task *task;     /* EXEC descriptor              */
  235.         char             strbuf[64];   /* scratch for btocstr()        */
  236.         char             *btocstr();    /* BCPL BSTR to ASCIIZ          */
  237.  
  238.         tt = (unsigned long *)(BADDR(ROOTNODE->rn_TaskArray));
  239.  
  240.         printf("Proc Command Name         CLI Type    Pri.  Address  Directory\n");
  241.         Forbid();               /* need linked list consistency */
  242.         
  243.         for (count = 1; count <= (int)tt[0] ; count++) {/* or just assume 20?*/
  244.                 if (tt[count] == 0) continue;           /* nobody home */
  245.  
  246.                 /* Start by pulling out MsgPort addresses from the TaskArray
  247.                  * area. By making unwarranted assumptions about the layout
  248.                  * of Process and Task structures, we can derive these
  249.                  * descriptors. Every task has an associated process, since
  250.                  * this loop drives off a CLI data area.
  251.                  */
  252.  
  253.                 port = (UBYTE *)tt[count];
  254.                 task = (struct Task *)(port - sizeof(struct Task));
  255.  
  256.                 /* Sanity check just in case */
  257.                 if (PROC(task)->pr_TaskNum == 0 || PROC(task)->pr_CLI == 0)
  258.                         continue;               /* or complain? */
  259.  
  260.                         btocstr(CLI(PROC(task))->cli_CommandName, strbuf);
  261.             printf("%2d   %-21s",count,strbuf);
  262.             strcpy(strbuf,task->tc_Node.ln_Name);
  263.                         strbuf[11] = '\0';
  264.                         printf("%-11s",strbuf);
  265.                         printf(" %3d  %8lx  %s\n",
  266.                            task->tc_Node.ln_Pri,task,
  267.                            btocstr(CLI(PROC(task))->cli_SetName, strbuf));
  268.         }
  269.         Permit();               /* outside critical region */
  270.         return(0);
  271. }
  272.  
  273.  
  274. char *
  275. btocstr(b, buf)
  276. ULONG   b;
  277. char    *buf;
  278. {
  279.         register char   *s;
  280.  
  281.         s = (char *)BADDR(b);   /* Shift & get length-prefixed str */
  282.         bmov(s +1, buf, s[0]);
  283.         buf[s[0]] = '\0';
  284.         return buf;
  285. }
  286.  
  287.  
  288.