home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / docum / dos-ref.doc / examples / chap6.arj / TSHELL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-26  |  2.3 KB  |  79 lines

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