home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d512 / csh.lha / Csh / Csh515s.lzh / set.c < prev    next >
C/C++ Source or Header  |  1991-06-23  |  8KB  |  376 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 (4+MAXSRC)
  19.  
  20. ROOT _Mbase[MAXLEVELS], *Mbase[ MAXLEVELS ];
  21.  
  22. void
  23. init_mbase(void)
  24. {
  25.     int i;
  26.     for( i=0; i<MAXLEVELS; i++ )
  27.         Mbase[i]=&_Mbase[i];
  28. }
  29.  
  30. void
  31. set_var( int level, char *name, char *str )
  32. {
  33.     NODE **first, *node;
  34.     char *t, c;
  35.     int  truelevel=level;
  36.  
  37.     if( !str ) str="";
  38.  
  39.     for( t=name; isalphanum(*t); t++ ) ;
  40.     c=*t; *t=0;
  41.  
  42.     if( level==LEVEL_SET ) level=LEVEL_LOCAL;
  43.  
  44.     for( ;; ) {
  45.         first=&Mbase[level]->first[*name & MAXHASH-1];
  46.         for( node=*first; node; node=node->next )
  47.             if( !strcmp( node->name, name) ) {
  48.                 free( node->text );
  49.                 goto copy;
  50.             }
  51.         if( truelevel!=LEVEL_SET )
  52.             break;
  53.         level=LEVEL_SET, truelevel=-1;
  54.     }
  55.  
  56.     if(!(node=malloc(sizeof(NODE) + strlen(name)))) {
  57.         ierror(NULL,512);
  58.         return;
  59.     }
  60.     node->next=*first;
  61.     *first=node;
  62.     strcpy( node->name, name );
  63.  
  64. copy:
  65.     if(!(node->text=malloc(strlen(str)+1))) {
  66.         ierror(NULL,512);
  67.         return;
  68.     }
  69.     strcpy( node->text, str );
  70.     *t=c;
  71.     if( *name=='_' )
  72.         set_sys_var( name );
  73. }
  74.  
  75.  
  76. void *
  77. get_var( int level, void *varname )
  78. {
  79.     NODE *node;
  80.     char *t, c, *name=varname;
  81.     int  truelevel=level;
  82.  
  83.     if( level==LEVEL_SET ) level=LEVEL_LOCAL;
  84.  
  85.     for ( t= name; (signed char)*t>0; t++ ) ;
  86.     c=*t; *t=0;
  87.  
  88.     for( ;; ) {
  89.         node=Mbase[level]->first[*name & MAXHASH-1];
  90.  
  91.         for( ; node; node=node->next )
  92.             if( !strcmp(node->name,name) )
  93.                 { *t=c; return node->text; }
  94.         if( truelevel!=LEVEL_SET )
  95.             break;
  96.         level=LEVEL_SET, truelevel=-1;
  97.     }
  98.  
  99.     *t=c;
  100.  
  101.     return NULL;
  102. }
  103.  
  104. void
  105. unset_level( int level )
  106. {
  107.     NODE *node;
  108.     int i;
  109.  
  110.     for( i=0; i<MAXHASH; i++ ) {
  111.         for( node=Mbase[level]->first[i]; node; node=node->next ) {
  112.             Free ( node->text );
  113.             Free ( node );
  114.         }
  115.         Mbase[level]->first[i] = NULL;
  116.     }
  117. }
  118.  
  119. void
  120. unset_var( int level, char *name )
  121. {
  122.     NODE **first=&Mbase[level]->first[*name & MAXHASH-1], *node, *prev;
  123.     char *t, c;
  124.  
  125.     for( t=name; isalphanum(*t); t++ ) ;
  126.     c=*t; *t=0;
  127.  
  128.     for( node=*first, prev=NULL; node; prev=node, node=node->next )
  129.         if( !strcmp( node->name, name) ) {
  130.             if( prev ) prev->next=node->next; else *first=node->next;
  131.             Free( node->text );
  132.             Free( node );
  133.             if( *name=='_' )
  134.                 set_sys_var( name );
  135.             break;
  136.         }
  137.     *t=c;
  138. }
  139.  
  140.  
  141. void
  142. set_var_n( int level, char *name, char *str, int n )
  143. {
  144.     char c, len=strlen(str);
  145.  
  146.     if( n>len )
  147.         n=len;
  148.  
  149.     if( n>=0 ) {
  150.         c=str[n]; str[n]=0;
  151.         set_var( level, name, str );
  152.         str[n]=c;
  153.     } else 
  154.         set_var( level, name, "" );
  155. }
  156.  
  157. int
  158. do_unset_var( char *str, int level )
  159. {
  160.     int i;
  161.  
  162.     for (i = 1; i < ac; ++i)
  163.         unset_var (level, av[i]);
  164.     return 0;
  165. }
  166.  
  167. int
  168. do_set_var( char *command, int level )
  169. {
  170.     ROOT *root = Mbase[level];
  171.     NODE *node;
  172.     int i;
  173.     char *str;
  174.  
  175.     switch (ac) {
  176.     case 1:
  177.         for( i=0; i<MAXHASH && !breakcheck(); i++ )
  178.             for( node=root->first[i]; node && !dobreak(); node=node->next )
  179.                 printf ("%s%-10s %s\n", o_lolite, node->name, node->text);
  180.         break;
  181.     case 2:
  182.         if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
  183.         break;
  184.     default:
  185.         set_var (level, av[1], next_word (next_word (command)));
  186.         break;
  187.     }
  188.     return 0;
  189. }
  190.  
  191.  
  192. extern char shellvers[];
  193. extern char shellctr[];
  194.  
  195. static char *
  196. sys_expand( char *str, char *t )
  197. {
  198.     struct DateStamp dss;
  199.     char *u,buf[10];
  200.     DateStamp(&dss);
  201.  
  202.     if( !str ) {
  203.         *t=0;
  204.         return t;
  205.     }
  206.  
  207.     while (*str)
  208.         if (*str=='%') {
  209.             str+=2;
  210.             switch( str[-1] ) {
  211.             case 'p': t+=sprintf(t,"%s", get_var(LEVEL_SET, "_cwd"));  break;
  212.             case 'm': t+=sprintf(t,"%d", AvailMem( 0 )/1024);          break;
  213.             case 't': t+=sprintf(t,"%s", next_word(dates(&dss,0)));    break;
  214.             case 'c': t+=sprintf(t,"%s", o_hilite);                    break;
  215.             case 'v': t+=sprintf(t,"%s", shellvers );                  break;
  216.             case 'n': t+=sprintf(t,"%s", get_var(LEVEL_SET,"_clinumber"));break;
  217.             case 'h': t+=sprintf(t,"%s", get_var(LEVEL_SET, v_histnum));  break;
  218.             case 'd':    sprintf(t,"%s", dates(&dss,0));if(u=index(t,' '))t=u;break;
  219.             case 'f': t+=sprintf(t,"%s", oneinfo(get_var(LEVEL_SET,v_cwd),4));break;
  220.             case 'r': t+=sprintf(t,"%d", (SBYTE)Myprocess->pr_Task.tc_Node.ln_Pri);break;
  221.             case 's': t+=sprintf(t,"%s", (u=Getenv(shellctr,buf,10)?buf:"?"));break;
  222.             default : *t++=str[-2]; *t++=str[-1]; break;
  223.             }
  224.         }
  225.         else *t++=*str++;
  226.     *t=0;
  227.     return t;
  228. }
  229.  
  230. void
  231. push_locals( ROOT *newroot )
  232. {
  233.     int i;
  234.     NODE **nodeptr;
  235.  
  236.     newroot->prev=Mbase[ LEVEL_LOCAL ];
  237.     Mbase[ LEVEL_LOCAL ]=newroot;
  238.  
  239.     nodeptr=newroot->first;
  240.     for( i=MAXHASH; i>0; --i )
  241.         *nodeptr++=NULL;
  242.  
  243. }
  244.  
  245. void
  246. pop_locals( void )
  247. {
  248.     ROOT *prev=Mbase[ LEVEL_LOCAL ]->prev;
  249.     unset_level( LEVEL_LOCAL );
  250.     Mbase[ LEVEL_LOCAL ]=prev;
  251. }
  252.  
  253. int
  254. do_local(void)
  255. {
  256.     int i;
  257.  
  258.     if( ac==1 )
  259.         do_set_var( "", LEVEL_LOCAL);
  260.     else 
  261.         for( i=1; i<ac; i++ )
  262.             set_var(LEVEL_LOCAL,av[i],"");
  263.     return 0;
  264. }
  265.  
  266.  
  267. char truetitle[200];
  268.  
  269. char o_rback[12]="rback";
  270. char o_hilite[24], o_lolite[8], *o_csh_qcd, o_kick20, o_nobreak;
  271. char o_minrows, o_scroll, o_nowindow, o_noraw, o_vt100, o_nofastscr;
  272. char o_bground, o_resident, o_internal, o_pipe[16]="T:", o_datefmt;
  273. char o_abbrev=1;
  274. long o_noreq;
  275.  
  276. extern char trueprompt[100];
  277.  
  278. static void
  279. set_sys_var( char *name )
  280. {
  281.     char *get, *str, c=name[1], col;
  282.  
  283.     if( c==v_debug  [1] ) debug  =  get_var(LEVEL_SET,v_debug  )!=NULL;
  284.     if( c==v_nobreak[1] ) o_nobreak=get_var(LEVEL_SET,v_nobreak)!=NULL;
  285.     if( c==v_rback  [1] && (str=get_var(LEVEL_SET,v_rback)))strcpy(o_rback,str);
  286.     if( c==v_abbrev [1] && (str=get_var(LEVEL_SET,v_abbrev)))o_abbrev=*str!='n';
  287.     if( c==v_verbose[1] ) {
  288.         Verbose=0;
  289.         if( str=get_var(LEVEL_SET,v_verbose)) {
  290.             if( index(str,'s' )) Verbose|= VERBOSE_SOURCE;
  291.             if( index(str,'a' )) Verbose|= VERBOSE_ALIAS;
  292.             if( index(str,'h' )) Verbose|= VERBOSE_HILITE;
  293.         }
  294.     }
  295.     if( c==v_pipe   [1] ) {
  296.         strcpy(o_pipe,"t:");
  297.         if( str=get_var(LEVEL_SET,v_pipe) )
  298.             strcpy(o_pipe,str);
  299.         appendslash(o_pipe);
  300.     }
  301.     if( c==v_hilite [1] && !strcmp( name, v_hilite)) {
  302.         o_hilite[0]=o_lolite[0]=0;
  303.         get= get_var(LEVEL_SET,v_hilite);
  304.         str= o_hilite;
  305.         while( get && *get ) {
  306.             switch( *get++ ) {
  307.             case 'b': str+=sprintf( str, "\033[1m" ); break;
  308.             case 'i': str+=sprintf( str, "\033[3m" ); break;
  309.             case 'u': str+=sprintf( str, "\033[4m" ); break;
  310.             case 'r': str+=sprintf( str, "\033[7m" ); break;
  311.             case 'c': str+=strlen(str);
  312.                       if( *get>='0' && *get<='9' ) {
  313.                          col=*get++;
  314.                          if( *get==',' && get[1]>='0' && get[1]<='9' ) {
  315.                              str+=sprintf( str,"\033[3%cm\033[4%cm",col,get[1]);
  316.                              get+=2;
  317.                          } else 
  318.                              str+=sprintf( str,"\033[3%cm",col );
  319.                       }
  320.                       break;
  321.             }
  322.         }
  323.         *str=0;
  324.         if( *o_hilite )
  325.             strcpy(o_lolite,"\033[m");
  326.         strcpy(sys_expand(str,trueprompt),o_lolite);
  327.     }
  328.     if( c==v_scroll[1] ) {
  329.         o_scroll=0;
  330.         if( (str= get_var(LEVEL_SET,v_scroll))) {
  331.             o_scroll=atoi( str );
  332.             if( o_scroll<2 ) o_scroll=0;
  333.             if( o_scroll>8 ) o_scroll=8;
  334.         }
  335.     }
  336.     if( c==v_datefmt[1] ) {
  337.         o_datefmt=(str=get_var(LEVEL_SET,v_datefmt)) && !strcmp(str,"subst");
  338.     }
  339.     if( c==v_minrows[1] ) {
  340.         o_minrows=34;
  341.         if( (str= get_var(LEVEL_SET,v_minrows))) {
  342.             o_minrows=atoi( str );
  343.             if( o_minrows<8 )   o_minrows=8;
  344.             if( o_minrows>100 ) o_minrows=100, o_scroll=0;
  345.         }
  346.     }
  347.     if( c==v_qcd[1] ) o_csh_qcd=get_var(LEVEL_SET,v_qcd);
  348.  
  349.     if( c==v_noreq[1] ) {
  350.         o_noreq= get_var(LEVEL_SET,v_noreq ) ? -1 : 0;
  351.         Myprocess->pr_WindowPtr = (APTR)o_noreq;
  352.     }
  353.     if( c==v_hist[1] )
  354.         S_histlen=(str= get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
  355.     if( c==v_titlebar[1] )
  356.         update_sys_var( v_titlebar );
  357. }
  358.  
  359. void
  360. update_sys_var( char *name )
  361. {
  362.     char c=name[1], *str, buf[250];
  363.  
  364.     if( c==v_prompt[1] ) {
  365.         if( (str=get_var(LEVEL_SET,v_prompt) ) ==NULL) str="$ ";
  366.         strcpy(sys_expand(str,trueprompt),o_lolite);
  367.     }
  368.     if( c==v_titlebar[1] && !o_nowindow && Win ) {
  369.         sys_expand( get_var(LEVEL_SET, v_titlebar), buf);
  370.         if (strcmp((char*)Win->Title, buf)) {
  371.             strcpy(truetitle,buf);
  372.             SetWindowTitles(Win, truetitle, (char *)-1);
  373.         }
  374.     }
  375. }
  376.