home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP6 / TSHELL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-14  |  2.9 KB  |  95 lines

  1. /**********************************************************
  2.  *  TSHELL.C - Demonstration tiny command interpreter     *
  3.  *  Jim Kyle, July 10, 1990                               *
  4.  *  revised 15 May 1991                                   *
  5.  *                                                        *
  6.  *  Intended only to show basic principles; not for use   *
  7.  *  with DOS versions prior to 3.1 (EXEC function of such *
  8.  *  versions does not preserve stack registers).          *
  9.  *                                                        *
  10.  *  For Turbo C only due to pseudovariable usage.         *
  11.  *                                                        *
  12.  *      tcc -mt -c tshell                                 *
  13.  *      tlink /t /c c0t+tshell,tshell,,cs.lib             *
  14.  *                                                        *    
  15.  *  or (Borland C++ 2.0):                                 *
  16.  *      bcc -mt -c tshell.c                               *
  17.  *      tlink /t /c c0t+tshell,tshell,,cs.lib             *
  18.  *                                                        *
  19.  **********************************************************/
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <dos.h>
  23. #include <dir.h>
  24.  
  25. char cmdbuf[128];
  26. char *cmdlst[] = {"DIR","RUN"};
  27. int i;
  28.  
  29. void do_dir( void )     /* reports files in cur dir     */
  30. { struct ffblk wkarea;
  31.   int endir;
  32.  
  33.   if (strlen(cmdbuf) < 5)       /* default to all files */
  34.     strcpy( cmdbuf+4, "*.*" );
  35.   puts("\n    Files and sizes\n");
  36.   endir = findfirst( cmdbuf+4, &wkarea, 0 );
  37.   while ( !endir )
  38.     { printf("%-13s   %8ld\n",
  39.              wkarea.ff_name, wkarea.ff_fsize );
  40.       endir = findnext( &wkarea );
  41.     }
  42.   putchar( '\n' );
  43. }
  44.  
  45. void do_run( void )     /* caution, safe only for DOS3+ */
  46. { struct {
  47.     unsigned eseg, clo, cls;
  48.     long     fcb1, fcb2;
  49.   } parms;
  50.  
  51. #if 1
  52.   /* THANKS, chappell@vax1.trincoll.edu */
  53.   cmdbuf[0] = strlen(cmdbuf+1);
  54.   cmdbuf[1] = '/';
  55.   cmdbuf[2] = 'C';
  56.   cmdbuf[3] = ' ';
  57.   parms.eseg = 0;
  58.   parms.clo = (unsigned) cmdbuf;
  59. #else
  60.   /* AS PUBLISHED IN BOOK: WRONG! */
  61.   cmdbuf[1] = '/';
  62.   cmdbuf[2] = 'C';
  63.   cmdbuf[3] = ' ';
  64.   parms.eseg = 0;
  65.   parms.clo = (unsigned) cmdbuf+1;
  66. #endif  
  67.   parms.cls = _DS;
  68.   parms.fcb1 = parms.fcb2 = 0L;
  69.   _ES = _SS;
  70.   _BX = (unsigned) &parms;
  71.   _DX = (unsigned) "C:\\COMMAND.COM";
  72.   _AX = 0x4B00;
  73.   geninterrupt( 0x21 );
  74. }
  75.  
  76. void main( void )
  77. { puts( "  TINY SHELL DEMONSTRATOR\n" );
  78.   puts( "Copyright 1990  by Jim Kyle\n" );
  79.   puts( "  Commands: DIR, RUN only\n" );
  80.   for( ; ; )
  81.     { printf("tinyshell> ");
  82.       gets(cmdbuf);
  83.       for(i=0; i<2; i++)
  84.         if(strnicmp(cmdlst[i],cmdbuf,strlen(cmdlst[i]))==0)
  85.           break;
  86.       switch(i)
  87.         { case 0: do_dir();
  88.              break;
  89.           case 1: do_run();
  90.              break;
  91.           default: puts("Unknown command!!!\n");
  92.         }
  93.     }
  94. }
  95.