home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
-
- Mikro-Shell: Startprogramm fuer Okami-Shell
-
- Version 1.2
-
- WR 1.11.89
-
- Änderungen:
-
- 18.02.90 Optional Übergabe der Konfigurationsdatei
- 01.03.90 Internes Kommando: echo
- 31.03.90 Übergabe mehrerer Konfigurationsdateien
- internes Kommando: incl
- 10.05.90 Länge des Para-Strings in Pexec korrekt
- Zeilenumbruch mit \ am Ende einer Zeile
- 28.12.90 Kommandozeile mit -c und Kommandos
- internes Kommando: ver
-
- *******************************************************************/
- static char _M_ID_[]="@(#)Microshell - msh.c";
-
- #include <stdio.h>
- #include <ctype.h>
- #include <osbind.h>
-
- /* Die Include-Datei cmpdat.h wird von einem Okami-Script zum Compiler-
- ** Aufruf angelegt und enthält nur eine Zeile:
-
- #define _CMP_DAT "Datum, Uhrzeit"
-
- ** Wer diese Datei nicht anlegen will, kann diese Zeile anstelle der
- ** jetzt folgenden include-Anweisung benutzen.
- */
-
- #include <cmpdat.h>
-
- /* Ein paar Makros */
-
- #define StrEqu(a,b) (!strcmp(a,b)) /* Test: Strings gleich */
- #define StrNEqu(a,b,n) (!strncmp(a,b,n)) /* Test: Strings gleich */
- #define StrLast(S) (*(S+strlen(S)-1)) /* String: letztes char.*/
-
- /* Strings mit Programmname und Versionsnummer */
-
- char TPName[]= "Microshell";
- char TPVersion[]= "1.2";
-
- /* Weitere globale Variablen und defines */
-
- char KONFFILE[]= "msh.inf"; /* Default bei argc==1 */
- #define CMDLEN (3*80)
- #define ARGV0 "msh" /* eigentlich: argv[0] */
-
-
- /************************************************************************/
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- register int i;
- short ExFlag=0; /* 0: Script, 1: Kommando */
-
- if (argc==1) /* keine Parameter */
- msh(KONFFILE);
- else
- for (i=1;i<argc;i++)
- {
- if (StrEqu(argv[i],"-c"))
- {
- ExFlag=1;
- continue;
- }
- if (ExFlag)
- DoCom(argv[i]);
- else
- msh(argv[i]);
- }
-
- }
-
- /************************************************************************
-
- msh: ein MSH-Script ausführen
-
- ************************************************************************/
- msh(FName)
- char *FName;
- {
- FILE *FPtr; /* File-Ptr. Konf.datei */
- char St[CMDLEN+1]; /* eingelesene Zeile */
- char Para2[CMDLEN+1]; /* Hilfsstring */
- register char *Para;
- char c;
-
- while (isspace(*FName)) FName++;
-
- if ((FPtr=fopen(FName,"r"))==NULL)
- {
- fputs(ARGV0,stdout);
- fputs(": cannot open ",stdout);
- puts(FName);
- return;
- }
-
- while (fgets(St,3*80,FPtr)!=NULL)
- {
- Para=St;
-
- while (isspace(*Para)) Para++; /* führende Leerzeichen */
-
- if (*Para=='\0' || *Para=='\n' || *Para=='#')
- continue;
-
- for (;;) /* endende Leerzeichen */
- {
- c=StrLast(Para);
- if (isspace(c))
- StrLast(Para)='\0';
- else
- break;
- }
-
- while(StrLast(Para)=='\\') /* \ am Ende: Zeilenumbruch */
- {
- StrLast(Para)='\0';
- fgets(Para2,80,FPtr);
- while (Para2[strlen(Para2)-1]=='\n')
- Para2[strlen(Para2)-1]='\0';
- strcat(Para,Para2);
- }
-
- /* Kommando ausführen */
-
- DoCom(St);
- }
-
- fclose(FPtr);
- }
-
- /************************************************************************
-
- DoCom: ein MSH-Kommando ausführen
-
- ************************************************************************/
- DoCom(Para)
- char *Para;
- {
- char *Com;
- static short Flag=1; /* Flag für Meldungen */
- char Para2[CMDLEN+1]; /* Hilfsstring */
-
- if (Para[0]=='-') /* -: Meldung abschalten */
- {
- Flag=0;
- return;
- }
- if (Para[0]=='+') /* +: Meldung einschalten */
- {
- Flag=1;
- return;
- }
-
- for (Com=Para;*Para && !isspace(*Para);Para++);
- if (*Para!='\0')
- *Para++='\0';
-
- if (StrEqu(Com,"echo")) /* internes Kommando: echo */
- puts(Para);
-
- else if (StrEqu(Com,"incl")) /* internes Kommando: incl */
- msh(Para);
-
- else if (StrEqu(Com,"ver")) /* internes Kommando: ver */
- {
- fputs(TPName,stdout); /* kein printf, dadurch wird */
- fputs(" Version ",stdout); /* der Code zu lang */
- puts(TPVersion);
- fputs("Compiled ",stdout);
- puts(_CMP_DAT);
- }
-
- else
- {
- /* Kommentarmodus: Kommando ausgeben */
- if (Flag)
- {
- fputs(Com,stdout);
- fputc(' ',stdout);
- puts(Para);
- }
-
- Para2[0]=(char)strlen(Para);
- strcpy(Para2+1,Para);
- if (Pexec(0,Com,Para2,NULL)<0)
- if (Flag)
- {
- fputs(Com,stdout);
- puts(": not found");
- }
- }
- }
-