home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / shell / csh535src.lha / set.c < prev    next >
C/C++ Source or Header  |  1993-12-20  |  10KB  |  460 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 *prompt_string( char *str, char *t );
  16. static void set_sys_var( char *name, char *val );
  17.  
  18. #define MAXLEVELS (4+MAXSRC)
  19.  
  20. static ROOT _Mbase[MAXLEVELS], *Mbase[MAXLEVELS], *Topbase[MAXLEVELS];
  21.  
  22. void
  23. init_mbase(void)
  24. {
  25.     int  i;
  26.     char *c;
  27.  
  28.     for( i=0; i<MAXLEVELS; i++ )
  29.         Topbase[i]=Mbase[i]=&_Mbase[i];
  30.  
  31. #ifdef isalphanum
  32.     for( c=isalph+'0'; c<=isalph+'9'; *c++=1 ) ;
  33.     for( c=isalph+'A'; c<=isalph+'Z'; *c++=1 ) ;
  34.     for( c=isalph+'a'; c<=isalph+'z'; *c++=1 ) ;
  35.     isalph['_']=1;
  36. #endif
  37. }
  38.  
  39.  
  40.  
  41. void
  42. set_var( int level, char *name, char *str )
  43. {
  44.     char *val;
  45.  
  46.     if(!str) str="";
  47.     if(!(val=malloc(strlen(str)+1))) {
  48.         ierror(NULL,512);
  49.         return;
  50.     }
  51.     strcpy( val, str );
  52.  
  53.     set_var_mem( level, name, val );
  54. }
  55.  
  56.  
  57.  
  58. void
  59. set_var_mem( int level, char *name, char *str ) /* does not make a copy */
  60. {
  61.     NODE **first, *node;
  62.     ROOT *root, *nul=0;
  63.     int  local= level & LEVEL_LOCAL;
  64.     char *t, c;
  65.  
  66.     for( t=name; isalphanum(*t); t++ ) ;
  67.     c=*t; *t=0;
  68.  
  69.     level &=~ LEVEL_LOCAL;
  70.  
  71.     for( root= Mbase[level]; root; root= local? nul : root->parent ) {
  72.         first= & root->first[*name & MAXHASH-1];
  73.         for( node=*first; node; node=node->next ) {
  74.             if( !strcmp( node->name, name) ) {
  75.                 free( node->text );
  76.                 goto copy;
  77.             }
  78.         }
  79.     }
  80.  
  81.     if(!(node=malloc(sizeof(NODE) + strlen(name)))) {
  82.         ierror(NULL,512);
  83.         return;
  84.     }
  85.     node->next=*first;
  86.     *first=node;
  87.     strcpy( node->name, name );
  88.  
  89. copy:
  90.     node->text=str;
  91.     if( *name=='_' )
  92.         set_sys_var( name, node->text );
  93.  
  94.     *t=c;
  95. }
  96.  
  97. static char VarBuf[256];
  98.  
  99. void *
  100. get_var( int level, void *varname )
  101. {
  102.     NODE *node;
  103.     ROOT *root;
  104.     char *t, c, *res=NULL;
  105.     int  f=*(char *)varname & MAXHASH-1;
  106.  
  107.     for ( t= varname; (signed char)*t>0; t++ ) ;
  108.     c=*t; *t=0;
  109.  
  110.     for( root= Mbase[level]; root; root=root->parent )
  111.         for( node=root->first[f]; node; node=node->next )
  112.             if( !strcmp(node->name,varname) )
  113.                 { res=node->text; goto done; }
  114.  
  115.     /* AMK: OS20-GetVar replaces ARP-Getenv */
  116.     if(level==LEVEL_SET && *(char*)varname!='_' && GetVar(varname,VarBuf,256,GVF_BINARY_VAR)>=0L)
  117.         res=VarBuf;
  118.  
  119. done:
  120.     *t=c;
  121.     return res;
  122. }
  123.  
  124. void
  125. unset_level( int level )
  126. {
  127.     NODE *node;
  128.     int i;
  129.  
  130.     for( i=0; i<MAXHASH; i++ ) {
  131.         for( node=Mbase[level]->first[i]; node; node=node->next ) {
  132.             if( *node->name=='_' && level==LEVEL_SET ) {
  133.                 Mbase[level]->first[i]= node->next;
  134.                 set_sys_var( node->name, get_var( LEVEL_SET, node->name ));
  135.             }
  136.             Free ( node->text );
  137.             Free ( node );
  138.         }
  139.         Mbase[level]->first[i] = NULL;
  140.     }
  141. }
  142.  
  143. void
  144. unset_var( int level, char *name )
  145. {
  146.     ROOT *root;
  147.     NODE **first, *node, *prev;
  148.     char *t, c;
  149.     int  f=*name & MAXHASH-1;;
  150.  
  151.     for( t=name; isalphanum(*t); t++ ) ;
  152.     c=*t; *t=0;
  153.  
  154.     for( root= Mbase[level]; root; root=root->parent ) {
  155.         first= & root->first[f];
  156.         for( node=*first, prev=NULL; node; prev=node, node=node->next ) {
  157.             if( !strcmp( node->name, name) ) {
  158.                 if( prev ) prev->next=node->next; else *first=node->next;
  159.                 Free( node->text );
  160.                 Free( node );
  161.                 if( *name=='_' )
  162.                     set_sys_var( name, NULL );
  163.                 goto done;
  164.             }
  165.         }
  166.     }
  167. done:
  168.     *t=c;
  169. }
  170.  
  171.  
  172. void
  173. set_var_n( int level, char *name, char *str, int n )
  174. {
  175.     char c, len=strlen(str);
  176.  
  177.     if( n>len )
  178.         n=len;
  179.  
  180.     if( n>=0 ) {
  181.         c=str[n]; str[n]=0;
  182.         set_var( level, name, str );
  183.         str[n]=c;
  184.     } else
  185.         set_var( level, name, "" );
  186. }
  187.  
  188. int
  189. do_unset_var( char *str, int level )
  190. {
  191.     int i;
  192.  
  193.     for (i = 1; i < ac; ++i)
  194.         unset_var (level, av[i]);
  195.     return 0;
  196. }
  197.  
  198. /*
  199.  * print given string, print control chars quoted (e.g. '^L' as '^' 'L')
  200.  *
  201.  * 05/18/93 ch
  202.  */
  203. void printf_ctrl(char *s)
  204. {
  205.     int c,i=0;
  206.     char *p;
  207.     if (p = malloc(strlen(s)*2 + 1)) {
  208.         while(c=(*s++)) {
  209.             if(c<32) {
  210.                 p[i++] = '^';
  211.                 p[i++] = 'A'-1+c;
  212.             }
  213.             else
  214.                 p[i++] = c;
  215.         }
  216.         p[i] = 0;
  217.         puts(p);
  218.         free(p);
  219.     }
  220.     else
  221.         puts(s);
  222. }
  223.  
  224. int
  225. do_set_var( char *command, int level )
  226. {
  227.     ROOT *root;
  228.     NODE *node;
  229.     char *str, *val;
  230.     int  i=2, j= *av[0]=='a' ? ' ' : 0xA0;
  231.  
  232.     if( ac>2 ) {
  233.         if( *av[i]=='=' && !av[i][1] && ac>3) i++;
  234.         val= compile_av( av, *av[i] ? i : i+1, ac, j, 0 );
  235.         set_var_mem(level, av[1], val);
  236.     } else if( ac==2 ) {
  237.         if (str=get_var(level,av[1])) {
  238.             printf("%-10s ",av[1]);
  239.             printf_ctrl(str);
  240.             /*putchar('\n');*/
  241.         }
  242.     } else if( ac==1 ) {
  243.         if( level& LEVEL_LOCAL )
  244.             root= Mbase[ level&~LEVEL_LOCAL];
  245.         else
  246.             root= Topbase[ level ];
  247.         for( i=0; i<MAXHASH && !breakcheck(); i++ )
  248.             for( node=root->first[i]; node && !dobreak(); node=node->next ) {
  249.                 printf("%s%-10s ",o_lolite,node->name);
  250.                 printf_ctrl(node->text);
  251.                 /*putchar('\n');*/
  252.                 /*quickscroll();*/
  253.             }
  254.     }
  255.  
  256.     return 0;
  257. }
  258.  
  259.  
  260. extern char shellvers[];
  261. extern char shellctr[];
  262. extern long ExecTimer, ExecRC;
  263.  
  264. static char *
  265. prompt_string( char *str, char *t )
  266. {
  267.     struct DateStamp dss;
  268.     char *u,*dev,buf[10];
  269.     DateStamp(&dss);
  270.  
  271.     if( !str ) {
  272.         *t=0;
  273.         return t;
  274.     }
  275.  
  276.     while (*str) {
  277.         if (*str!='%') {
  278.             *t++=*str++;
  279.             continue;
  280.         }
  281.         str+=2;
  282.         switch( str[-1] ) {
  283.         case 'p': t+=sprintf(t,"%s", get_var(LEVEL_SET, "_cwd"));  break;
  284.         case 'm': t+=sprintf(t,"%d", AvailMem( 0 )/1024);          break;
  285.         case 't': t+=sprintf(t,"%s", next_word(dates(&dss,0)));    break;
  286.         case 'c': t+=sprintf(t,"%s", o_hilite);                    break;
  287.         case 'v': t+=sprintf(t,"%s", shellvers );                  break;
  288.         case 'n': t+=sprintf(t,"%s", get_var(LEVEL_SET,"_clinumber"));break;
  289.         case 'h': t+=sprintf(t,"%d", H_num);                       break;
  290.         case 'd':    sprintf(t,"%s", dates(&dss,0));if(u=index(t,' '))t=u;break;
  291.         case 'f': t+=sprintf(t,"%s", oneinfo(get_var(LEVEL_SET,v_cwd),4));break;
  292.         /* AMK: OS20-GetVar replaces ARP-Getenv */
  293.         case 's': if (GetVar(shellctr,buf,10,GVF_GLOBAL_ONLY|GVF_BINARY_VAR)<0L)
  294.                     u = NULL;
  295.                   else
  296.                     u = buf;
  297.                   t+=sprintf(t,"%s", u?buf:"?");break;
  298.         case 'V': if (u=get_var(LEVEL_SET, "_cwd"))
  299.                 dev = strdup(u);
  300.               else
  301.                 dev = NULL;
  302.               if (dev && (u=strchr(dev,':')))
  303.                 *u = '\0';
  304.               t+=sprintf(t,"%s",dev);
  305.               if (dev) free(dev);
  306.               break;
  307.         case 'x': t+=sprintf(t,"%2d",ExecRC);                             break;
  308.         case 'r': t+=sprintf(t,"%d", (signed char)
  309.                                        Myprocess->pr_Task.tc_Node.ln_Pri);break;
  310.         case 'e': t+=sprintf(t,"%d:%02d.%02d",ExecTimer/6000,ExecTimer/100%60,
  311.                                              ExecTimer%100);              break;
  312.         default : *t++=str[-2]; *t++=str[-1]; break;
  313.         }
  314.     }
  315.     *t=0;
  316.     return t;
  317. }
  318.  
  319. void
  320. push_locals( ROOT *newroot )
  321. {
  322.     int i;
  323.     NODE **nodeptr;
  324.  
  325.     newroot->parent=Mbase[ LEVEL_SET ];
  326.     Mbase[ LEVEL_SET ]=newroot;
  327.  
  328.     nodeptr=newroot->first;
  329.     for( i=MAXHASH; i>0; --i )
  330.         *nodeptr++=NULL;
  331. }
  332.  
  333. void
  334. pop_locals( void )
  335. {
  336.     unset_level( LEVEL_SET );
  337.     Mbase[ LEVEL_SET ]=Mbase[ LEVEL_SET ]->parent;
  338. }
  339.  
  340. int
  341. do_local(void)
  342. {
  343.     int i;
  344.  
  345.     if( ac==1 )
  346.         do_set_var( "", LEVEL_SET | LEVEL_LOCAL);
  347.     else 
  348.         for( i=1; i<ac; i++ )
  349.             set_var( LEVEL_SET | LEVEL_LOCAL, av[i], "");
  350.     return 0;
  351. }
  352.  
  353.  
  354. char truetitle[200];
  355.  
  356. char o_rback[12]="rback";
  357. char o_hilite[24], o_lolite[8], *o_csh_qcd, o_nobreak;
  358. char o_minrows, o_scroll, o_nowindow, o_noraw, o_vt100, o_nofastscr;
  359. char o_bground, o_resident, o_pipe[16]="T:", o_datefmt, o_nomatch=0;
  360. char o_abbrev=1, o_insert=1, *o_every, o_cquote=0;
  361. long o_noreq, o_failat=20;
  362.  
  363. extern char trueprompt[100];
  364.  
  365. #define ISVAR(x) ( !strcmp( name, x ) )
  366.  
  367. static void
  368. set_sys_var( char *name, char *val )
  369. {
  370.     char *put, col;
  371.  
  372.     if     (ISVAR(v_debug   )) debug    = val!=NULL;
  373.     else if(ISVAR(v_nobreak )) o_nobreak= val!=NULL;
  374.     else if(ISVAR(v_insert  )) o_insert = val!=NULL;
  375.     else if(ISVAR(v_nomatch )) o_nomatch= val!=NULL;
  376.     else if(ISVAR(v_cquote  )) o_cquote = val!=NULL;
  377.     else if(ISVAR(v_every   )) o_every  = val;
  378.     else if(ISVAR(v_failat  )) o_failat = val?atoi(val):20;
  379.     else if(ISVAR(v_rback   )) strcpy(o_rback,val?val:"rback");
  380.     else if(ISVAR(v_abbrev  )) o_abbrev=val?*val!='n':1;
  381.     else if(ISVAR(v_datefmt )) o_datefmt= val && !strcmp(val,"subst");
  382.     else if(ISVAR(v_qcd     )) o_csh_qcd= val;
  383.     else if(ISVAR(v_noreq   )) Myprocess->pr_WindowPtr=(APTR)(o_noreq=val?-1:0);
  384.     else if(ISVAR(v_hist    )) S_histlen= val ? atoi(val) : 0;
  385.     else if(ISVAR(v_titlebar)) update_sys_var( v_titlebar );
  386.     else if(ISVAR(v_pipe    )) appendslash(strcpy(o_pipe,val?val:"t:"));
  387.     else if(ISVAR(v_verbose )) {
  388.         Verbose=0;
  389.         if( val ) {
  390.             if( index(val,'s' )) Verbose|= VERBOSE_SOURCE;
  391.             if( index(val,'a' )) Verbose|= VERBOSE_ALIAS;
  392.             if( index(val,'h' )) Verbose|= VERBOSE_HILITE;
  393.         }
  394.     } else if( ISVAR(v_hilite)) {
  395.         o_hilite[0]=o_lolite[0]=0;
  396.         if( !val )
  397.             val="";
  398.         put= o_hilite;
  399.         while( val && *val ) {
  400.             switch( *val++ ) {
  401.             case 'b': put+=sprintf( put, "\033[1m" ); break;
  402.             case 'i': put+=sprintf( put, "\033[3m" ); break;
  403.             case 'u': put+=sprintf( put, "\033[4m" ); break;
  404.             case 'r': put+=sprintf( put, "\033[7m" ); break;
  405.             case 'c': put+=strlen(put);
  406.                       if( *val>='0' && *val<='9' ) {
  407.                          col=*val++;
  408.                          if( *val==',' && val[1]>='0' && val[1]<='9' ) {
  409.                              put+=sprintf( put,"\033[3%cm\033[4%cm",col,val[1]);
  410.                              val+=2;
  411.                          } else
  412.                              put+=sprintf( put,"\033[3%cm",col );
  413.                       }
  414.                       break;
  415.             }
  416.         }
  417.         *put=0;
  418.         if( *o_hilite )
  419.             strcpy(o_lolite,"\033[m");
  420.         strcpy(prompt_string(put,trueprompt),o_lolite);
  421.     } else if( ISVAR( v_scroll )) {
  422.         o_scroll=0;
  423.         if( val ) {
  424.             o_scroll=atoi( val );
  425.             if( o_scroll<2 ) o_scroll=0;
  426.             if( o_scroll>8 ) o_scroll=8;
  427.         }
  428.     } else if( ISVAR(v_minrows)) {
  429.         o_minrows=34;
  430.         if( val ) {
  431.             o_minrows=atoi( val );
  432.             if( o_minrows<8 )   o_minrows=8;
  433.             if( o_minrows>100 ) o_minrows=100, o_scroll=0;
  434.         }
  435.     }
  436. }
  437.  
  438.  
  439. extern BOOL nowintitle;  /* defined in main.c */
  440.  
  441. void
  442. update_sys_var( char *name )
  443. {
  444.     char c=name[1], *str, buf[250];
  445.  
  446.     if( c==v_prompt[1] ) {
  447.         if( (str=get_var(LEVEL_SET,v_prompt) ) ==NULL) str="$ ";
  448.         strcpy(prompt_string(str,trueprompt),o_lolite);
  449.     }
  450.     if( c==v_titlebar[1] && !o_nowindow && Win ) {
  451.         prompt_string( get_var(LEVEL_SET, v_titlebar), buf);
  452.         if (strcmp((char*)Win->Title, buf)) {
  453.             strcpy(truetitle,buf);
  454.             if (!nowintitle)
  455.                 SetWindowTitles(Win, truetitle, (char *)-1);
  456.         }
  457.     }
  458. }
  459.  
  460.