home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * TITEL : Filterprogramm *
- * *
- * DATEI : filter.c *
- * VERSION : 1.0 *
- * AUTOR : Joachim Eckart *
- * DATUM : 12/86 *
- ********************************************************************/
- /* usage filter.ttp [-m] [-c] [-b] [-fFILTERDATEI] QUELLE [ZIEL] *
- * *
- * m: ausblenden 7. bit -- Radikalkur *
- * c: Controlcodes au₧er CR,LF ausfiltern *
- * gefiltert wird erst nach Umsetzung (s. Filterdatei) *
- * f: Name der Filterdatei, fehlt dieser wird nur gemä₧ *
- * -m,-c,-b gefiltert. Im Extremfall wird nur kopiert. *
- * b: aus mehreren aufeinanderfolgenden blanks wird eins *
- * gemacht *
- * QUELLE: zu filternde Datei *
- * ZIEL: gefilterte Datei, fehlt diese wird FILTER.FIL *
- * genommen. *
- * *
- * Anmerkung: Die Reihenfolge der Argumente ist beliebig. Als QUELLE *
- * wird das erste Nicht-Schalter-Argument genommen. Das *
- * zweite, falls vorhanden ist das ZIEL. *
- * FILTER- *
- * DATEI : Mit beliebigem Editor erstellte Datei. Enthält pro *
- * Zeile eine Umsetzungsanweisung der Form: xxx yyy . *
- * Das Zeichen mit dem dezimalen Code xxx wird durch yyy *
- * ersetzt. 999 für yyy filtert das Zeichen xxx völlig *
- * aus. xxx und yyy können durch eine beliebige nicht *
- * numerische Zeichenfolge getrennt werden. Werden führ- *
- * ende Nullen nicht weggelassen ist überhaupt kein Trenn-*
- * zeichen erforderlich. Beginnt eine Zeile mit '*' oder *
- * ';' wird dise Zeile als Kommentar angesehen. Sie werden*
- * zur Laufzeit angezeigt, soda₧ der Ablauf gut zu ver- *
- * folgen ist. *
- ********************************************************************/
-
- #include <stdio.h>
- #include "arg.h" /* Definitionen für Argument Parser */
- #include "scr.h" /* an sich .c ,aber dann übersetzt make */
- #include "itoa.h" /* an sich .c ,aber dann übersetzt make */
-
- /*******************************************************************/
- /* Globale Variablen und Funktionen für ARGUMENTS */
- /*******************************************************************/
-
- FILE *in,*out,*fil; /* File handles */
-
- int filt[256]; /* gelesenes Zeichen wird gemä₧ Inhalt gefiltert */
-
- char *err[]= { /* Fehlermeldungen */
- "Fehler in Argumenten", /* 0 */
- "Öffnen Filterdatei nicht möglich !", /* 1 */
- "Öffnen Eingabedatei nicht möglich !", /* 2 */
- "Öffnen Ausgabedatei nicht möglich !", /* 3 */
- "Falsche Struktur in der Filterdatei !", /* 4 */
- "Fehler beim Lesen aus Eingabedatei !", /* 5 */
- "Fehler beim Schreiben in Ausgabedatei !", /* 6 */
- "Ein - und Ausgabedatei sind identisch !", /* 7 */
- "Programm abgebrochen -- Drücke Taste", /* 8 */
- };
- char *info[] = {
- "usage filter.ttp [-m] [-c] [-b] [-fFILTERDATEI] QUELLE [ZIEL]",
- "",
- "-m : Ausblenden 7. bit (Radikalkur).",
- "-c : Controlcodes au₧er CR,LF ausfiltern.",
- " Gefiltert wird erst nach Umsetzung.",
- "-f : Name der Filterdatei, fehlt dieser wird nur gemä₧",
- " -m,-c,-b gefiltert. Im Extremfall wird nur kopiert.",
- "-b : Aus mehreren aufeinanderfolgenden blanks wird eins",
- " gemacht.",
- "QUELLE: Zu filternde Datei",
- "ZIEL : Gefilterte Datei; fehlt diese wird FILTER.FIL",
- " genommen."
- };
- #define ISIZE ( sizeof(info)/ sizeof(char *) ) /* Einträge */
-
- int mask = 0xff; /* = 1111 1111 d.h Zeichen bleibt wie es ist */
- int control = 0; /* wenn 1, dann control codes filtern */
- int blank = 0; /* wenn 1, dann blanks killen */
- char *filtfile = ""; /* unbedingt als pointer nicht als Vektor */
- char *infile = "required.dat"; /* " " */
- char *outfile = "filter.fil"; /* " " */
-
- mask_f() /* wenn Schalter -m vorhanden wird das 7. bit maskiert */
- {
- mask=0x7f; /* Radikalfilter ausknipsen 7.bit durch bitweises und */
- } /* = 0111 1111 */
-
- out_f(s) /* wird immer aufgerufen, wenn in argv dann zeigt s darauf */
- register char *s; /* andernfalls ist s ein Leerstring */
- {
- if (strlen(s))
- outfile = s;
- }
-
- ARGUMENTS arg_tab[] = {
- OPT,FUNC,SCHALTER,'M',(long )&mask_f, /* mask_f() Adresse */
- OPT,BOOLEAN,SCHALTER,'C',(long)&control, /* Adresse control */
- OPT,BOOLEAN,SCHALTER,'B',(long)&blank, /* Adresse blank */
- OPT,STRING,SCHALTER,'F',(long )&filtfile, /* Zeiger auf Zeiger */
- NON_OPT,STRING,NO_SCHLT,' ',(long )&infile,/* Zeiger auf Zeiger */
- OPT,FORCE_FUNC,NO_SCHLT,' ',(long )&out_f /* out_f() immer */
- };
-
- #define TSIZE ( sizeof(arg_tab)/ sizeof(ARGUMENTS) ) /* Einträge */
-
- /********************************************************************/
- /* Hilfsfunktionen für main() */
- /********************************************************************/
-
- usage(message) /* Fehlermeldung und Abbruch */
- register char *message;
- {
- pos(0,24);rev_on();
- put_s(message);
- rev_off();
- get_hidden();
- exit(); /* Schlie₧en aller Dateien und Programm beenden */
- }
-
- help()
- {
- register int i;
- cls();
- for(i = 0; i < ISIZE; i++)
- {
- pos(10,i + 1);
- put_s(info[i]);
- }
- usage(err[0]);
- }
-
- var_init() /* filt[0] = 0, ......filt[255] = 255 */
- {
- register int i;
- crs_off();
- i = -1;
- while(++i < 256)
- filt[i]= i;
- }
-
- get_filtfile() /* Filterdatei lesen/ verarbeiten und schlie₧en */
- {
- char line[81];
- register char *lp;
- static int lc = 0; /* line counter für Filterdatei */
- lp = line;
- if(!(fil = fopen(filtfile,"r"))) usage(err[1]);
- while((fgets(lp,81,fil)) != (char *) 0)
- {
- lc++; /* mitzählen für Ausgabe Zeilennummer im Fehlerfall */
- *(lp + strlen(lp) - 1) = '\0'; /* newline weg */
- if(*lp == '*' || *lp == ';') /* Kommentarzeile ? */
- disp_comment(line + 1); /* Kommentar anzeigen */
- else if(!parse_line(lp)) { put_fs(23,REV | LEFT,"ZEILE :");
- print_i(lc);
- usage(err[4]);} /* Fehlerhafte Zeile */
- }
- fclose(fil);
- }
-
- #define isdigit(c) ((c) >= '0' && (c) <= '9') /* Ziffer ? */
- #define outrange(z) ((z) < 0 || (z) > 255) /* 8 bit ascii ? */
- #define EOL (*line == '\0') /* übers Stringende hinaus ? */
-
- int parse_line(line) /* zwei Zahlen in Zeile suchen */
- register char *line;
- {
- register char a[4];
- int x,y,i;
-
- i = 0; a[0] = '\0';
- while(!isdigit(*line) && !EOL)
- line ++; /* mache nichts wenn keine Zahl */
-
- while(isdigit(*line) && i < 4 && !EOL) /* hole erste Zahl */
- a[i++] = *line++;
- a[i] = '\0';
- if(strlen(a)) /* überhaupt was zahlartiges gelesen ? */
- x = atoi(a);
- else x = 9999; /* dummy-wert für keine Zahl gelesen */
-
- i = 0; a[0] = '\0';
- while(!isdigit(*line) && !EOL)
- line++; /* mache nichts wenn keine Zahl*/
-
- while(isdigit(*line) && i < 4 && !EOL) /* hole zweite Zahl */
- a[i++] = *line++;
- a[i] = '\0';
- if(strlen(a))
- y = atoi(a);
- else y = 9999; /* dummy-wert für keine Zahl gelesen */
-
- if(outrange(x) || (outrange(y) && y != 999))
- return(0); /* 999 ist ok , bedeudet ausfiltern */
- else {
- filt[x] = y;
- return(1); } /* Zeile war ok */
- }
-
- open_files() /* Quell- und Zieldatei öffnen */
- {
- if(!(in = fopen(infile,BR))) usage(err[2]);
- if(!(out = fopen(outfile,BW))) usage(err[3]);
- }
-
- close_files() /* Quell- und Zieldatei schlie₧en */
- {
- fclose(in);
- fclose(out);
- crs_on();
- }
-
- check_error() /* Lesefehler ? */
- {
- if(ferror(in)) usage(err[5]);
- if(ferror(out)) usage(err[6]);
- }
-
- display() /* Titel anzeigen */
- {
- cls();
- put_fs(2,REV | CENTER,
- "************************************************");
- put_fs(3,REV | CENTER,
- "*** F I L T E R ***");
- put_fs(4,CENTER,"*** Simultanfilterprogramm für Einzelzeichen ***");
- put_fs(5,CENTER,"*** (C) 1986 by J.Eckart & PASCAL Int. ***");
- put_fs(6,REV | CENTER,
- "************************************************");
-
- }
-
- disp_comment(s) /* display a comment line */
- register char *s;
- {
- static int cnt = 1;
- if(strlen(s) > 62) *(s + strlen(s)) = '\0';
- if(!(cnt % 8)) cnt = 1;
- pos(16,14 + cnt++);
- clrright();
- put_s(s);
- }
-
- show_file() /* Dateiinfo anzeigen */
- {
- rev_on();
- pos(16,8);put_s("EINGABE :");
- pos(16,9);put_s("AUSGABE :");
- pos(16,10);put_s("FILTER :");
- pos(16,11);put_s("MASKE :");
- pos(16,12);put_s("^CODES :");
- pos(16,13);put_s("BLANKS :");
- rev_off();
- pos(25,8);put_s(infile);
- pos(25,9);put_s(outfile);
- pos(25,10);
- if(strlen(filtfile))
- put_s(filtfile);
- else
- put_s("keine Filterdatei");
- pos(25,11);
- if(mask == 0x7f)
- put_s("Ja");
- else
- put_s("Nein");
- pos(25,12);
- if(control)
- put_s("Filtern");
- else
- put_s("Nicht filtern");
- pos(25,13);
- if(blank)
- put_s("viele --> eins");
- else
- put_s("so lassen");
- }
-
- ok() /* Noch mal nachfragen */
- {
- int c;
- put_fs(24,REV | RIGHT,"Ausführung starten? J/N");
- c = get_hidden();
- if (c != 'J' && c != 'j') usage(err[8]);
- put_fs(24,REV | RIGHT,"J ");
- }
-
- ready() /* Ende kundtun */
- {
- put_fs(24,REV | RIGHT,"FERTIG -- TASTE DRÜCKEN");
- get_hidden();
- }
-
- /********************************************************************/
- /* main() */
- /********************************************************************/
-
- #define iscntrl(c) ( ((c) >= 0 && (c) < 32 || (c) == 127)\
- && !((c) == 10 || (c) == 13) ) /* control code? */
- main(argc,argv)
- int argc;
- char **argv;
- {
- int i;
- int c,lastc; /* gelesenes und zuletzt gelesenes Zeichen */
- char m[10];
- var_init();
- lastc = 333; /* nicht vorkommender Wert als Initialisierung */
-
- if(parse_args(argc,argv,arg_tab,TSIZE)) /* Argument Parser aufrufen */
- help(); /* Fehler in Argumenten */
-
- cls();
- display();
- show_file(); /* Anzeigen */
- if(!strcmp(infile,outfile)) /* Quelle und Ziel identisch */
- usage(err[7]); /* das darf aber nicht sein */
- ok(); /* wirklich alles in Ordnung so ? */
- if(strlen(filtfile))
- get_filtfile(); /* Filerdatei bearbeiten */
- open_files(); /* Quelle und Ziel öffnen */
- pos(0,24); /* falls Ausgabe mit CON: als Ziel */
-
- while((c = getc(in)) != EOF) /* Zeichen lesen */
- {
- check_error(); /* Lesefehler ? */
- if(filt[c] == 999) continue; /* Zeichen unterschlagen */
-
- c &= mask; /* Maskieren - ohne -m Schalter nur Pseudo */
- if(blank && c == ' ' && lastc == ' ') /* blanks killen ? */
- continue ;
-
- if( !(control && iscntrl(c)) /* control code und -c prüfen */
- || c != filt[c] ) /* umgesetzte haben Priorität */
-
- putc((char)filt[c],out); /* Zeichen schreiben */
- lastc = c;
- }
-
- close_files(); /* Dateien schlie₧en */
- ready(); /* fertig */
- }
- /* EOS E n d O f S o u r c e */
-