home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************
- * MINIFILTER *
- * (C) PASCAL INTERNATIONAL *
- ****************************************************************/
- #include <stdio.h>
- #define NOVOID /* Compiler kennt kein void eventuell weglassen*/
- #ifdef NOVOID
- #define void /* */
- #endif
- #define B_READ "br" /* modus für lesen bei fopen() */
- #define B_WRITE "bw" /* " schreiben " */
- /* bitte im Compilerhandbuch nachsehen */
- #define AND 1 /* als Symbole zur besseren Lesbarkeit */
- #define OR 2
- #define XOR 3
- #define FEHLER 999
- /* Makros */
- #define islower(c) ((c)>='a' && (c)<='z') /* Kleinbuchstabe ? */
- #define toupper(c) (islower(c) ? (c)-32 : (c)) /* mache gro₧ */
- #define ishex(c) (((c) >= '0' && (c) <= '9')||((c) >= 'A' && (c) <= 'F'))
- /* Hexziffer ? */
- /* Einige Deklarationen */
- FILE *fopen();
- int fgetc();
- int strcmp();
- int strlen();
- int hole_operator();
- int hole_maske();
- int transform();
- void error();
-
- /* globale Variablen */
- int op; /* Operator */
- int mask; /* Maske */
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- FILE *in,*out; /* Filepointer für Ein- Ausgabe */
- int c; /* Zeichen */
- if(argc < 5) /* Wir brauchen 5 Argumente */
- error("Argumente: Quelle Ziel Operator Maske\n");
-
- if((op = hole_operator(argv[3])) == FEHLER) error("falscher Operator\n");
- if((mask = hole_maske(argv[4])) == FEHLER) error("falsche Konstante\n");
- if(!(in = fopen(argv[1],B_READ))) error("Quelle nicht zu öffnen\n");
- if(!(out = fopen(argv[2],B_WRITE))) error("Ziel nicht zu öffnen\n");
- while((c = fgetc(in)) != EOF) fputc(transform(c),out);
- fclose(in); fclose(out);
- puts("F E R T I G\n");
- getchar();
- exit(0);
- }
-
- int hole_operator(str)
- char str[];
- {
- int j = -1;
- while(str[++j]) /* ist wahr bis Ende erreicht wird: '\0' */
- str[j] = toupper(str[j]); /* umgewandelt in Großbuchstaben */
- if(!strcmp(str,"AND")) return(AND); /* strcpy liefert 0 bei Gleichheit */
- else if(!strcmp(str,"OR")) return(OR);
- else if(!strcmp(str,"XOR")) return(XOR);
- else return(FEHLER);
- }
-
- /* hole_maske() */
- Jedes Z kann '0' bis '9' oder 'A' bis 'F' sein.
- Für '0' bis '9' erhält man durch subtrahieren von 48 die
- korrespondierende Zahl ( '1' ist z. B. 49).
- Für 'A' bis 'F' mu₧ 55 abgezogen werden ( 'A' ist 65).
- str[2] ist dann noch mit 16 zu multiplizieren. */
-
- int hole_maske(str)
- char str[];
- {
- int j = -1;
- int zahl = 0;
- while(str[++j]) /* ist wahr bis Ende erreicht wird: '\0' */
- str[j] = toupper(str[j]); /* umgewandelt in Gro₧buchstaben */
- if( str[0] != '0' || str[1] != 'X' || strlen(str) != 4
- || !ishex(str[2]) || !ishex(str[3]) )
- return(FEHLER);
- if(str[2] < 'A') zahl += (str[2] - 48) * 16; /* zwischen 0 und 9 */
- else zahl += (str[2] - 55) * 16; /* zwischen A und F */
- if(str[3] < 'A') zahl += str[3] - 48;
- else zahl += str[3] - 55;
- return(zahl);
- }
-
- int transform(c)
- int c;
- {
- switch(op)
- {
- case AND: c &= mask;
- break;
- case OR: c |= mask;
- break;
- case XOR: c ^= mask;
- }
- return(c);
- }
-
- void error(s)
- char s[];
- {
- puts(s); getchar(); exit(1);
- }
-