home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 488.lha / csh_v5.0 / src / csh500src.lzh / set.c < prev    next >
C/C++ Source or Header  |  1991-02-24  |  6KB  |  294 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  * Version 2.07M by Steve Drew 10-Sep-87
  8.  * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  9.  * Version 5.00L by Urban Mueller 17-Feb-91
  10.  *
  11.  */
  12.  
  13. #include "shell.h"
  14.  
  15. static char *sys_expand( char *str, char *t );
  16. static void set_sys_var( char *name );
  17.  
  18. #define MAXLEVELS (3+MAXSRC)
  19. #define HASH 32
  20.  
  21. typedef struct VNode {
  22.     struct VNode *next;
  23.     char *text;
  24.     char name[1];
  25. } NODE;
  26.  
  27. typedef struct VRoot {
  28.     NODE *first[HASH];
  29. } ROOT;
  30.  
  31. ROOT Mbase[ MAXLEVELS ];
  32.  
  33. void
  34. set_var( int level, char *name, char *str )
  35. {
  36.     NODE **first=&Mbase[level].first[*name & HASH-1], *node;
  37.     char *t, c;
  38.  
  39.     if( !str ) str="";
  40.  
  41.     for( t=name; isalphanum(*t); t++ ) ;
  42.     c=*t; *t=0;
  43.  
  44.     for( node=*first; node; node=node->next )
  45.         if( !strcmp( node->name, name) ) {
  46.             free( node->text );
  47.             goto copy;
  48.         }
  49.  
  50.     node=malloc(sizeof(NODE) + strlen(name));
  51.     node->next=*first;
  52.     *first=node;
  53.     strcpy( node->name, name );
  54.  
  55. copy:
  56.     node->text=strcpy( malloc(strlen(str)+1), str );
  57.     *t=c;
  58.     if( *name=='_' )
  59.         set_sys_var( name );
  60. }
  61.  
  62.  
  63. char *
  64. get_var( int level, char *name )
  65. {
  66.     NODE *node=Mbase[level].first[*name & HASH-1];
  67.     char *t, c;
  68.  
  69.     for ( t= name; *(signed char *)t > 0; t++ ) ; /*  *t!=0 && *t<0x80  */
  70.     c=*t; *t=0;
  71.  
  72.     for( ; node; node=node->next )
  73.         if( !strcmp(node->name,name) )
  74.             { *t=c; return node->text; }
  75.     *t=c;
  76.     return NULL;
  77. }
  78.  
  79. void
  80. unset_level( int level )
  81. {
  82.     NODE *node;
  83.     int i;
  84.  
  85.     for( i=0; i<HASH; i++ ) {
  86.         for( node=Mbase[level].first[i]; node; node=node->next ) {
  87.             Free ( node->text );
  88.             Free ( node );
  89.         }
  90.         Mbase[level].first[i] = NULL;
  91.     }
  92. }
  93.  
  94. void
  95. unset_var( int level, char *name )
  96. {
  97.     NODE **first=&Mbase[level].first[*name & HASH-1], *node, *prev;
  98.     char *t, c;
  99.  
  100.     for( t=name; isalphanum(*t); t++ ) ;
  101.     c=*t; *t=0;
  102.  
  103.     for( node=*first, prev=NULL; node; prev=node, node=node->next )
  104.         if( !strcmp( node->name, name) ) {
  105.             if( prev ) prev->next=node->next; else *first=node->next;
  106.             Free( node->text );
  107.             Free( node );
  108.             if( *name=='_' )
  109.                 set_sys_var( name );
  110.             break;
  111.         }
  112.     *t=c;
  113. }
  114.  
  115.  
  116. void
  117. set_var_n( int level, char *name, char *str, int n )
  118. {
  119.     char c, len=strlen(str);
  120.  
  121.     if( n>len )
  122.         n=len;
  123.  
  124.     if( n>=0 ) {
  125.         c=str[n]; str[n]=0;
  126.         set_var( level, name, str );
  127.         str[n]=c;
  128.     } else 
  129.         set_var( level, name, "" );
  130. }
  131.  
  132. int
  133. do_unset_var( char *str, int level )
  134. {
  135.     int i;
  136.  
  137.     for (i = 1; i < ac; ++i)
  138.         unset_var (level, av[i]);
  139.     return 0;
  140. }
  141.  
  142. int
  143. do_set_var( char *command, int level )
  144. {
  145.     ROOT *root = &Mbase[level];
  146.     NODE *node;
  147.     int i;
  148.     char *str;
  149.  
  150.     switch (ac) {
  151.     case 1:
  152.         for( i=0; i<HASH && !breakcheck(); i++ )
  153.             for( node=root->first[i]; node && !dobreak(); node=node->next )
  154.                 printf ("%s%-10s %s\n", o_lolite, node->name, node->text);
  155.         break;
  156.     case 2:
  157.         if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
  158.         break;
  159.     default:
  160.         set_var (level, av[1], next_word (next_word (command)));
  161.         break;
  162.     }
  163.     return 0;
  164. }
  165.  
  166.  
  167. extern char shellvers[];
  168.  
  169. static char *
  170. sys_expand( char *str, char *t )
  171. {
  172.     struct DateStamp dss;
  173.     DateStamp(&dss);
  174.  
  175.     if( !str ) {
  176.         *t=0;
  177.         return t;
  178.     }
  179.  
  180.     while (*str)
  181.         if (*str=='%') {
  182.             str+=2;
  183.             switch( str[-1] ) {
  184.             case 'p': t+=sprintf(t,"%s", get_var(LEVEL_SET, "_cwd")); break;
  185.             case 'm': t+=sprintf(t,"%d", AvailMem( 0 )/1024);         break;
  186.             case 't': t+=sprintf(t,"%s", next_word(dates(&dss)));     break;
  187.             case 'd':    sprintf(t,"%s", dates(&dss)); t=index(t,' ');break;
  188.             case 'c': t+=sprintf(t,"%s", o_hilite);                   break;
  189.             case 'v': t+=sprintf(t,"%s", shellvers );                 break;
  190.             case 'n': t+=sprintf(t,"%s", get_var(LEVEL_SET,"_clinumber"));break;
  191.             case 'h': t+=sprintf(t,"%s", get_var(LEVEL_SET, v_histnum));  break;
  192.             case 'f': t+=sprintf(t,"%s", oneinfo(get_var(LEVEL_SET,v_cwd),4));break;
  193.             case 'r': t+=sprintf(t,"%d", (SBYTE)Myprocess->pr_Task.tc_Node.ln_Pri);break;
  194.             default : *t++=str[-1];
  195.             }
  196.         }
  197.         else *t++=*str++;
  198.     *t=0;
  199.     return t;
  200. }
  201.  
  202. char truetitle[200];
  203.  
  204. char o_hilite[24], o_lolite[8], *o_csh_qcd, o_kick20, o_nobreak;
  205. char o_minrows, o_scroll, o_nowindow, o_noraw, o_vt100, o_nofastscr;
  206. char o_nobreak, o_bground, o_resident, o_internal;
  207. long o_noreq;
  208.  
  209. extern char trueprompt[100];
  210.  
  211. static void
  212. set_sys_var( char *name )
  213. {
  214.     char *get, *str, c=name[1], col;
  215.  
  216.     if( c==v_debug  [1] ) debug  =  get_var(LEVEL_SET,v_debug  )!=NULL;
  217.     if( c==v_verbose[1] ) Verbose=  get_var(LEVEL_SET,v_verbose)!=NULL;
  218.     if( c==v_nobreak[1] ) o_nobreak=get_var(LEVEL_SET,v_nobreak)!=NULL;
  219.     if( c==v_hilite [1] && !strcmp( name, v_hilite)) {
  220.         o_hilite[0]=o_lolite[0]=0;
  221.         get= get_var(LEVEL_SET,v_hilite);
  222.         str= o_hilite;
  223.         while( get && *get ) {
  224.             switch( *get++ ) {
  225.             case 'b': str+=sprintf( str, "\033[1m" ); break;
  226.             case 'i': str+=sprintf( str, "\033[3m" ); break;
  227.             case 'u': str+=sprintf( str, "\033[4m" ); break;
  228.             case 'r': str+=sprintf( str, "\033[7m" ); break;
  229.             case 'c': str+=strlen(str);
  230.                       if( *get>='0' && *get<='9' ) {
  231.                          col=*get++;
  232.                          if( *get==',' && get[1]>='0' && get[1]<='9' ) {
  233.                              str+=sprintf( str,"\033[3%cm\033[4%cm",col,get[1]);
  234.                              get+=2;
  235.                          } else 
  236.                              str+=sprintf( str,"\033[3%cm",col );
  237.                       }
  238.                       break;
  239.             }
  240.         }
  241.         *str=0;
  242.         if( *o_hilite )
  243.             strcpy(o_lolite,"\033[m");
  244.         strcpy(sys_expand(str,trueprompt),o_lolite);
  245.     }
  246.     if( c==v_scroll[1] ) {
  247.         o_scroll=0;
  248.         if( (str= get_var(LEVEL_SET,v_scroll))) {
  249.             o_scroll=atoi( str );
  250.             if( o_scroll<2 ) o_scroll=0;
  251.             if( o_scroll>8 ) o_scroll=8;
  252.         }
  253.     }
  254.     if( c==v_minrows[1] ) {
  255.         o_minrows=34;
  256.         if( (str= get_var(LEVEL_SET,v_minrows))) {
  257.             o_minrows=atoi( str );
  258.             if( o_minrows<8 )   o_minrows=8;
  259.             if( o_minrows>100 ) o_minrows=100, o_scroll=0;
  260.         }
  261.     }
  262.     if( c==v_qcd[1] ) {
  263.         o_csh_qcd="s:csh-qcd";
  264.         if( str=get_var(LEVEL_SET,v_qcd) )
  265.             o_csh_qcd=str;
  266.     }
  267.     if( c==v_noreq[1] ) {
  268.         o_noreq= get_var(LEVEL_SET,v_noreq ) ? -1 : 0;
  269.         Myprocess->pr_WindowPtr = (APTR)o_noreq;
  270.     }
  271.     if( c==v_hist[1] )
  272.         S_histlen=(str= get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
  273.     if( c==v_titlebar[1] )
  274.         update_sys_var( v_titlebar );
  275. }
  276.  
  277. void
  278. update_sys_var( char *name )
  279. {
  280.     char c=name[1], *str, buf[250];
  281.  
  282.     if( c==v_prompt[1] ) {
  283.         if( (str=get_var(LEVEL_SET,v_prompt) ) ==NULL) str="$ ";
  284.         strcpy(sys_expand(str,trueprompt),o_lolite);
  285.     }
  286.     if( c==v_titlebar[1] && !o_nowindow && Win ) {
  287.         sys_expand( get_var(LEVEL_SET, v_titlebar), buf);
  288.         if (strcmp(Win->Title, buf)) {
  289.             strcpy(truetitle,buf);
  290.             SetWindowTitles(Win, truetitle, (char *)-1);
  291.         }
  292.     }
  293. }
  294.