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 / main.c < prev    next >
C/C++ Source or Header  |  1991-02-24  |  9KB  |  403 lines

  1. /*
  2.  * MAIN.C
  3.  *
  4.  * Matthew Dillon, 24 Feb 1986
  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. void breakreset(void);
  16. struct Window *getwindow (void);
  17.  
  18. char shellname[]   ="CShell V5.00L";
  19. char shellversion[]="500";
  20. char shellvers[]   ="5.00";
  21. char shellctr []   ="CshCounter";
  22. char shellres []   ="CshResident";
  23. char shellv   []   ="\0$VER: csh 5.00";
  24.  
  25. static void add_residents(void);
  26.  
  27. char *oldtitle;
  28. char trueprompt[100];
  29. char Inline[260];
  30. struct IntuitionBase *IntuitionBase;
  31. struct Window *Win;
  32. struct ArpBase *ArpBase;
  33. int    oldtaskpri=-999;
  34.  
  35. static char *defset[]={
  36.     v_histnum,  "0",
  37.     v_titlebar, shellname,
  38.     v_hist,     "50",
  39.     v_lasterr,  "0",
  40.     v_stat,     "0",
  41.     v_path,     "RAM:,RAM:c,df0:c,df1:c,sys:system",
  42.     v_rxpath,   "REXX:",
  43.     v_scroll,   "3",
  44.     v_minrows,  "34",
  45.     v_hilite,   "c7",
  46.     v_lcd,      "",
  47.     v_qcd,      "s:csh-qcd",
  48.     "_terminal","",
  49.     "_man",     "shell.doc",
  50.     "_insert",  "1",
  51.     "_version", shellversion,
  52.     "f1",       "cdir df0:\15",
  53.     "F1",       "cdir df1:\15",
  54.     "f3",       "cdir RAM:\15",
  55.     "F3",       "cdir vd0:\15",
  56.     "f4",       "cd df0:\15",
  57.     "F4",       "cd df1:\15",
  58.     "f5",       "cls; ls\15",
  59.     "F5",       "cdir ",
  60.     "f6",       "ls -s\15",
  61.     "f7",       "info\15",
  62.     "F7",       "assign \15",
  63.     "f8",       "window -lf\15",
  64.     "F8",       "window -sb\15",
  65.     "f10",      "cls\15",
  66.     "F10",      "exit\15",
  67.     NULL,       NULL
  68. };
  69.  
  70. static char *defalias[]={
  71.     "cdir", "%q cd $q; cls; dir",
  72.     "cls",  "echo -n ^l",
  73.     "diffdir","dir -u",
  74.     "dswap","cd $_lcd",
  75.     "exit", "endcli;quit",
  76.     "fg",   "pri 0 1",
  77.     "kr",   "rm -r RAM:* >NIL:",
  78.     "nice", "pri 0 -1",
  79.     "lp",   "cat >PRT:",
  80.     "q",    "quit",
  81.     "manlist", "sea -qwnl $_man \"    *\"",
  82.     NULL,   NULL
  83. };
  84.  
  85. #ifndef AZTEC_C
  86. chkabort()
  87. {
  88.     return 0;
  89. }
  90. #endif
  91.  
  92. extern struct Library *DosBase;
  93.  
  94. main(argc, argv)
  95. char *argv[];
  96. {
  97.     int i;
  98.     char buf[10];
  99.     static char pipe1[32], pipe2[32];
  100.     struct Window *getwindow();
  101.     char nologin=0 , *mymem=malloc(4);
  102. #ifdef AZTEC_C
  103.     extern int Enable_Abort;
  104.     Enable_Abort = 0;
  105. #endif
  106.  
  107.     if( argc==0 )               /* Prevent starting from workbench */
  108.         exit(0);
  109.  
  110.     if( !(av=malloc( max_ac*sizeof(char *)))) exit( 0 );
  111.  
  112.     initmap();
  113.  
  114.     if(!(ArpBase=(struct ArpBase *)OpenLibrary("arp.library",34L)))
  115.         { printf("No arp library\n"); exit(0); }
  116.  
  117.     IntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase;
  118.  
  119.     if( ArpBase->DosBase->lib_Version >= 36 )
  120.         o_kick20=1;
  121.     set_var( LEVEL_SET, "_kick2x", (o_kick20) ? "1" : "0" );
  122.  
  123.     if( !IsInteractive(Input()))
  124.         o_bground=1;
  125.     set_var( LEVEL_SET, v_bground, (o_bground) ? "1" : "0" );
  126.  
  127.  
  128.     Forbid();
  129.     i=0;
  130.     if (Getenv(shellctr,buf,10L)) i=atoi(buf);
  131.     if (Getenv(shellres,buf,10L)) o_resident=1;
  132.     sprintf(buf, "%d", i+1);
  133.     Setenv(shellctr, buf);
  134.     Permit();
  135.  
  136. #ifdef isalphanum
  137.     for( i='a'; i<='z'; i++ )
  138.         isalph[i]=1;
  139.     for( i='A'; i<='Z'; i++ )
  140.         isalph[i]=1;
  141.     for( i='0'; i<='9'; i++ )
  142.         isalph[i]=1;
  143.     isalph['_']=1;
  144. #endif
  145.  
  146. #ifdef AZTEC_C
  147.     stdin->_flags    |= _IONBF;    /* make sure we're set as an unbuffered tty */
  148.     stdout->_flags    |= _IONBF;    /* in case of redirection in .login */
  149.     Close(_devtab[2].fd);
  150.     _devtab[2].mode |= O_STDIO;
  151.     _devtab[2].fd = _devtab[1].fd;    /* set stderr to Output() otherwise */
  152.                     /* don't work with aux driver */
  153. #else
  154.     /* if( setvbuf( stdout,NULL,_IOLBF,BUFSIZ )) exit(20); */
  155.     /* setnbf( stdout ); */
  156.     /* Close( _ufbs[2] ); */
  157.     /*_ufbs[2]=_ufbs[1]; */
  158.     /* setnbf( stderr ); */
  159. #endif
  160.  
  161.     Myprocess = (struct Process *)FindTask(0L);
  162.     Mycli=(struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2);
  163.  
  164.     if( !o_nowindow && (Win=getwindow()) && IsInteractive(Input())) {
  165.         oldtitle=(char *)(Win->Title);
  166.         set_menu();
  167.     }
  168.  
  169.     Pipe1 = pipe1;
  170.     Pipe2 = pipe2;
  171.     sprintf(pipe1, "t:pipe1_%ld", mymem);
  172.     sprintf(pipe2, "t:pipe2_%ld", mymem);
  173.  
  174.     sprintf(buf,"%ld",Myprocess->pr_TaskNum);
  175.     set_var(LEVEL_SET, "_clinumber", buf);
  176.  
  177.     seterr();
  178.     if (Myprocess->pr_CurrentDir == NULL)
  179.         do_cd("x :");
  180.     else do_pwd(NULL);
  181.  
  182.     o_nowindow= 1;
  183.  
  184.     set_var(LEVEL_SET,v_prompt, (IsInteractive(Input())) ? "%c%p> ":"");
  185.     for( i=0; defset[i]; i+=2 )
  186.         set_var( LEVEL_SET, defset[i], defset[i+1] );
  187.     for( i=0; defalias[i]; i+=2 )
  188.         set_var( LEVEL_ALIAS, defalias[i], defalias[i+1] );
  189.  
  190.     o_nowindow= 0;
  191.  
  192.     for (i = 1; i < argc; ++i) {
  193.         if (*argv[i]=='-') {
  194.             char *str=argv[1];
  195.  
  196.             if( index(str,'k') ) set_var(LEVEL_SET,v_nobreak,"1");
  197.             if( index(str,'i') ) o_internal=1;
  198.             if( index(str,'r') ) add_residents();
  199.             if( index(str,'v') ) Verbose=1, set_var(LEVEL_SET,v_verbose,"1");
  200.             if( index(str,'n') ) nologin=TRUE;
  201.             if( index(str,'b') ) {
  202.                 oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
  203.                 SetTaskPri( &Myprocess->pr_Task, -1 );
  204.             }
  205.             if( index(str,'f') ) {
  206.                 oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
  207.                 SetTaskPri( &Myprocess->pr_Task,  1 );
  208.             }
  209.             if( index(str,'c') ) {
  210.                 Inline[0] = ' ';
  211.                 Inline[1] = '\0';
  212.                 while (++i < argc)
  213.                     { strcat(Inline,argv[i]); strcat(Inline," "); }
  214.                 exec_command(Inline);
  215.                 main_exit(Lastresult);
  216.             }
  217.             if( index(str,'a')) {
  218.                 o_nowindow= o_noraw= 1;
  219.                 set_var( LEVEL_SET, v_hilite, "" );
  220.             }
  221.             if( index(str,'t')) {
  222.                 o_nowindow= o_vt100= o_nofastscr= 1;
  223.                 /*       clr     */
  224.                 set_var( LEVEL_SET, v_hilite, "r" );
  225.                 set_var( LEVEL_SET, v_noreq, "1" );
  226.                 set_var( LEVEL_SET, "_terminal", "1" );
  227.                 set_var( LEVEL_ALIAS, "cls", "e -n ^[[0\\;0H^[[J" );
  228.             }
  229.         } else {
  230.             sprintf (Inline, "source %s",argv[i]);
  231.             av[1] = argv[i];
  232.             do_source (Inline);
  233.         }
  234.     }
  235.  
  236.     if (!nologin && exists(av[1] = "S:.login")) do_source("x S:.login");
  237.  
  238.     for (;;) {
  239.         if (breakcheck())
  240. #ifdef AZTEC_C
  241.         while (WaitForChar(Input(), 100L) || stdin->_bp < stdin->_bend)
  242. #else
  243.         while (WaitForChar(Input(), 100L) || stdin->_rcnt != stdin->_wcnt )
  244. #endif
  245.             gets(Inline);
  246.         clearerr(stdin);  /* prevent acidental quit */
  247.         exec_every();
  248.         update_sys_var(v_titlebar);
  249.         update_sys_var(v_prompt);
  250.         breakreset();
  251. #if RAW_CONSOLE
  252.         if (Quit || !rawgets(Inline, disable ? "_ " : trueprompt)) main_exit(0);
  253. #else
  254.         printf("%s", disable ? "_ " : trueprompt);
  255.         fflush(stdout);
  256.         if (Quit || !gets(Inline)) main_exit(0);
  257. #endif
  258.         breakreset();
  259.         if (*Inline) exec_command(Inline);
  260.     }
  261. }
  262.  
  263. void
  264. main_exit(n)
  265. {
  266.     int i;
  267.     char buf[10];
  268.  
  269.     Getenv(shellctr,buf,10L);
  270.     i=atoi(buf);
  271.     sprintf(buf,"%d",i-1);
  272.     Setenv(shellctr,buf);
  273.     if( oldtitle )
  274.         SetWindowTitles(Win,oldtitle,(char *)-1);
  275.     if( oldtaskpri != -999 )
  276.         SetTaskPri(&Myprocess->pr_Task,oldtaskpri);
  277.     for (i=1; i<MAXMYFILES; i++) myclose(i);
  278.     remove_menu();
  279.     CloseLibrary((struct Library *)ArpBase);
  280.     exit(0);
  281. }
  282.  
  283. int
  284. breakcheck()
  285. {
  286.     return !o_nobreak && SetSignal(0L,0L) & SIGBREAKF_CTRL_C;
  287. }
  288.  
  289. void
  290. breakreset()
  291. {
  292.     SetSignal(0L, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D);
  293. }
  294.  
  295. dobreak()
  296. {
  297.     if (breakcheck()) { printf("^C\n"); return(1); }
  298.     return(0);
  299. }
  300.  
  301. /* this routine causes manx to use this Chk_Abort() rather than it's own */
  302. /* otherwise it resets our ^C when doing any I/O (even when Enable_Abort */
  303. /* is zero).  Since we want to check for our own ^C's             */
  304.  
  305. long
  306. Chk_Abort()
  307. {
  308.     return(0);
  309. }
  310.  
  311. void
  312. _wb_parse()
  313. {
  314. }
  315.  
  316. do_howmany()
  317. {
  318.     char buf[10];
  319.  
  320.     Getenv(shellctr, buf, 10L);
  321.     printf("Shell(s) running: %s\n",buf);
  322.     return 0;
  323. }
  324.  
  325. static struct Window *
  326. getwindow()
  327. {
  328.     struct InfoData *infodata;
  329.     struct Window *win;
  330.     long args[8];
  331.  
  332.     if( o_nowindow )
  333.         return NULL;
  334.     infodata=(void *)AllocMem((long)sizeof(struct InfoData),MEMF_CLEAR|MEMF_PUBLIC);
  335.     args[0]=(long)infodata >> 2;
  336.     Write(Output(),"",1);        /* make window appear */
  337.     SendPacket(ACTION_DISK_INFO,args,(void *)Myprocess->pr_ConsoleTask);
  338.     win=(struct Window *)infodata->id_VolumeNode;
  339.     FreeMem(infodata,(long)sizeof(struct InfoData));
  340.     if( win==NULL )
  341.         o_nowindow=1;
  342.     newwidth();
  343.     return win;
  344. }
  345.  
  346. #ifndef AZTEC_C
  347.  
  348. char *
  349. rindex( char *str , char c )
  350. {
  351.     char *ret=NULL;
  352.  
  353.     for( ; *str; str++ )
  354.         if( *str==c )
  355.             ret=str;
  356.     return ret;
  357. }
  358.  
  359. #endif
  360.  
  361. extern struct DosLibrary *DOSBase;
  362.  
  363. struct ResidentList {
  364.     BPTR rl_Next;
  365.     LONG rl_UseCount;
  366.     BPTR rl_SegList;
  367.     char rl_SegName[1];
  368. };
  369.  
  370.  
  371. static void
  372. add_residents()
  373. {
  374.     char buf[80], *g, *p, c;
  375.     struct RootNode *Node;
  376.     struct DosInfo  *Info;
  377.     struct ResidentList *res;
  378.     struct ResidentProgramNode *rpn;
  379.  
  380.     if( ArpBase->ResidentPrgList )
  381.         return;
  382.  
  383.     Forbid(); 
  384.     Node=(struct RootNode *)DOSBase->dl_Root;
  385.     Info=(struct DosInfo  *)(Node->rn_Info*4);
  386.     res=(struct ResidentList *)((long)Info->di_NetHand*4);
  387.  
  388.     for( ; res; res=(struct ResidentList *)((long)res->rl_Next*4) ) {
  389.         g=res->rl_SegName, p=buf;
  390.         for( c=*g++; c>0; --c ) *p++=*g++;
  391.         *p=0;
  392.         if( res->rl_UseCount>=0 )
  393.             res->rl_UseCount++;
  394.         else
  395.             continue;
  396.         AddResidentPrg( res->rl_SegList, buf);
  397.         for(rpn=ArpBase->ResidentPrgList; rpn; rpn=rpn->rpn_Next)
  398.             if( rpn->rpn_Segment==res->rl_SegList )
  399.                 rpn->rpn_Usage++;
  400.     }
  401.     Permit();
  402. }
  403.