home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* SDR.C */
- /* Search, Delete, Replace */
- /* (c) 1989 A. Krempl & TOOLBOX */
- /* ------------------------------------------------------ */
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
-
- /* -------------- Definitionen -------------------------- */
- #define COPYRIGHT " (c) 1989 A.Krempl & TOOLBOX"
- #define BOOL int
- #define TRUE 1
- #define FALSE 0
- #define MAX_STRING 255
-
- /* -------------- Funktionsdeklarationen ---------------- */
- void param_check(int, char **); /* Parameter-Auswertung */
- void mode_check(int, char **); /* Mode-Einstellung */
- void open_input(int, char **); /* Eing. Datei öffnen */
- void open_output(int, char **); /* Ausg. Datei öffnen */
- void ascii_mode(int, char **); /* ASCII-Bearbeitung */
- void usage(char *); /* Hilfetext */
-
- /* String Functionen */
- int str_index(char *, char *, BOOL);
- int remove_substring(char *, int, int);
- int insert_string(char *, char *, int);
-
- /* -------------- Globale Deklarationen ----------------- */
- FILE *fopen(),
- *input_file, /* ASCII Filepointer */
- *output_file;
-
- char readmode[4],
- writemode[4];
-
- /* -------------- Schalter (Parameter Status) ----------- */
- BOOL search = FALSE; /* Such Modus */
- BOOL delete = FALSE; /* Lösch Modus */
- BOOL replace = FALSE; /* Ersetzen Modus */
- BOOL replaceplus = FALSE; /* Ersetzen+ Modus */
- BOOL u_case = FALSE; /* Groß-, Kleinschreibung */
-
- /* -------------- Veränderbare Parameterpositionen ------ */
- int switch_index = 1; /* Schalter in argv[] */
- int line_index = 2; /* Zeilen-Suchstring */
- int search_index = 2; /* Suchstring in argv[] */
- int replace_index = 3; /* Ersatzstring in argv[] */
- int input_index = 3; /* Eingangsfile in argv[] */
- int output_index = 4; /* Ausgangsfile in argv[] */
-
-
- /* ------------- Hauptprogramm ------------------------ */
- main(argc, argv)
-
- int argc;
- char *argv[];
- {
- /* Vorbereitung */
- param_check(argc, argv); /* Parameter-Auswertung */
- mode_check(argc, argv); /* Mode-Einstellung */
- open_input(argc, argv); /* Eingangsdatei öffnen */
- open_output(argc, argv); /* Ausgangsdatei öffnen */
-
- ascii_mode(argc, argv); /* ASCII-Bearbeitung */
-
- exit(0);
- }
-
- /* ------------ Parameter Prüfung --------------------- */
- void param_check(arg_c, arg_v)
- int arg_c;
- char *arg_v[];
- {
- /* Argumentenanzahl überprüfen */
- if(arg_c < 4)
- {
- usage(arg_v[0]);
- }
- /* Schalter feststellen */
- /* Suchen */
- if(str_index("-s-S", arg_v[switch_index], FALSE) != -1)
- {
- search = TRUE;
- if(strcmp(arg_v[switch_index], "-S") == 0)
- u_case = TRUE;
- }
- /* Löschen */
- else if(str_index("-d-D", arg_v[switch_index],
- FALSE) != -1)
- {
- delete = TRUE;
- if(strcmp(arg_v[switch_index], "-D") == 0)
- u_case = TRUE;
- }
- /* Ersetzen */
- else if(str_index("-r-R", arg_v[switch_index],
- FALSE) != -1)
- {
- replace = TRUE;
- if(strcmp(arg_v[switch_index], "-R") == 0)
- u_case = TRUE;
- input_index++; /* Eingangsdatei in argv[] */
- output_index++; /* Ausgangsdatei in argv[] */
- }
- /* Zeilen - Ersetzen */
- else if(str_index("+r+R", arg_v[switch_index],
- FALSE) != -1)
- {
- replaceplus = TRUE;
- if(strcmp(arg_v[switch_index], "+R") == 0)
- u_case = TRUE;
- search_index++; /* Suchstring in argv[] */
- replace_index++; /* Ersatzstring in argv[] */
- input_index++; /* Eingangsdatei in argv[] */
- input_index++;
- output_index++; /* Ausgangsdatei in argv[] */
- output_index++;
- }
- /* Nicht gültiger Parameter */
- else
- {
- usage(arg_v[0]);
- }
- }
-
- /* ------------ Modus überprüfen ---------------------- */
- void mode_check(arg_c, arg_v)
- int arg_c;
- char *arg_v[];
- {
- arg_c = arg_c; /* Dummy, falls noch gebraucht */
-
- /* Bei SEARCH Dateinamen auf Gleichheit prüfen */
- if(search)
- {
- if(strcmp(arg_v[input_index], arg_v[output_index])
- == 0)
- {
- printf("Bei [-s] darf Quelle und Ziel nicht ");
- printf("gleich sein.\n");
- exit(-1);
- }
- }
- /* File-Eröffnungsmode festlegen */
- strcpy(readmode, "r+");
- strcpy(writemode, "w+");
- }
-
- /* --------- Eingangsdatei eröffnen ------------------- */
- void open_input(arg_c, arg_v)
- int arg_c;
- char *arg_v[];
- {
- /* Angabe auf Eingabedatei überprüfen */
- if(search && (arg_c < 4))
- usage(arg_v[0]);
- else if(delete && (arg_c < 4))
- usage(arg_v[0]);
- else if(replace && (arg_c < 5))
- usage(arg_v[0]);
- else if(replaceplus && (arg_c < 6))
- usage(arg_v[0]);
- else
- {
- /* Eingabedatei auf öffnen prüfen */
- if((input_file = fopen(arg_v[input_index],
- readmode)) == NULL)
- {
- printf("\nFehler bei öffnen von %s\n",
- arg_v[input_index]);
- exit(-1);
- }
- }
- }
-
- /* ---------- Ausgangsdatei eröffnen ------------------ */
- void open_output(arg_c, arg_v)
- int arg_c;
- char *arg_v[];
- {
- /* Auf Ausgangsdatei prüfen oder auf stdout setzen */
- if(search && (arg_c == 4))
- output_file = stdout;
- else if(delete && (arg_c == 4))
- output_file = stdout;
- else if(replace && (arg_c == 5))
- output_file = stdout;
- else if(replaceplus && (arg_c == 6))
- output_file = stdout;
- else
- {
- /* Ausgabedatei auf öffnen prüfen */
- if((output_file = fopen(arg_v[output_index],
- writemode)) == NULL)
- {
- printf("\nFehler bei öffnen von %s\n",
- arg_v[output_index]);
- exit(-1);
- }
- }
- }
-
- /* -------- Bearbeitung im ASCII Modus ---------------- */
- void ascii_mode(arg_c, arg_v)
- int arg_c;
- char *arg_v[];
- {
- BOOL line = FALSE; /* Bei +r Zeile gefunden ? */
- int location,
- length; /* Länge Teilzeichenkette */
- /* aus Datei gelesene Zeichenkette */
- unsigned char string[MAX_STRING];
-
- arg_c = arg_c; /* Dummy, falls noch gebraucht */
-
- /* Länge des Suchstrings feststellen */
- length = strlen(arg_v[search_index]);
-
- /* Suchen, löschen, ersetzen */
- if(!replaceplus)
- {
- while(fgets(string, MAX_STRING, input_file))
- {
- /* solange Teilstring enthalten */
- while((location = str_index(string,
- arg_v[search_index], u_case)) != -1)
- {
- if(search)
- {
- /* nichts ändern, String schreiben */
- fputs(string, output_file);
- break;
- }
- else if(delete)
- {
- /* Entferne den zu löschenden Teil */
- remove_substring(string, location, length);
- }
- else if(replace)
- {
- /* Entferne den zu ersetzenden Teil */
- remove_substring(string, location, length);
-
- /* Füge neuen Substring ein */
- insert_string(string, arg_v[replace_index],
- location);
- }
- }
- if(!search)
- {
- /* Neuen String wieder schreiben */
- fputs(string, output_file);
- }
- } /* while(fgets ... */
- } /* if(!replaceplus) */
-
- /* Suchen, ersetzen mit Zeilenindex */
- if(replaceplus)
- {
- while(fgets(string, MAX_STRING, input_file))
- {
- /* Zuerst Zeile suchen */
- while((location = str_index(string,
- arg_v[line_index], u_case)) != -1)
- {
- line = TRUE;
- break;
- }
- /* Nur bei gefundener Zeile ändern */
- if(line)
- {
- /* solange Teilstring enthalten */
- while((location = str_index(string,
- arg_v[search_index], u_case)) != -1)
- {
- /* Entferne den zu ersetzenden Teil */
- remove_substring(string, location, length);
-
- /* Füge neuen Substring ein */
- insert_string(string, arg_v[replace_index],
- location);
-
- } /* while((location ... */
- } /* if(line) */
-
- /* Neuen String wieder schreiben */
- fputs(string, output_file);
- line = FALSE;
-
- } /* while(fgets ... */
- } /* if(replaceplus) */
-
- fclose(input_file);
- fclose(output_file);
-
- }
-
- /* ------------- Anwendungshilfe ---------------------- */
- void usage(name)
- char *name;
- {
- printf("\n");
- printf("%s\n\n", COPYRIGHT);
- printf(" Usage: %s -[s][d][r] String ", name);
- printf("[String] Quelle [Ziel]\n\n"),
- printf(" Suchen [-s]:\n");
- printf(" %s -s String Quelle\n", name);
- printf(" Löschen [-d]:\n");
- printf(" %s -d String Quelle\n", name);
- printf(" Ersetzen [-r]:\n");
- printf(" %s -r String1 String2 ", name);
- printf("Quelle Ziel\n");
- printf(" Ersetzen [+r]: Nur in Zeilen mit ");
- printf("String1 (Nur ASCII)\n");
- printf(" %s +r String1 String2 ", name);
- printf("String3 Quelle Ziel\n\n"),
- printf(" -s, -d, -r Groß-, Kleinschreibung aktiv\n");
- printf(" -S, -D, -R -- \" -- ");
- printf("ausgeschaltet\n");
- printf(" Die Zeilenlänge ist auf 255 Zeichen ");
- printf("beschränkt (ASCII-Datei).");
- printf(" Bei Ersatz durch\n");
- printf(" längere Strings ist darauf zu achten. ");
- printf("Wird keine Zieldatei ");
- printf(" angegeben, gilt\n");
- printf(" Standard-Out. Falls Zieldatei = ");
- printf("Quelldatei, nach Möglichkeit");
- printf(" gleiche String-\n");
- printf(" längen benutzen. Leerzeichen und ");
- printf("Sonderzeichen als Parameter");
- printf(" müßen unter Hoch-\n");
- printf(" komma gesetzt werden.\n");
-
- exit(-1);
- }
-
- /* ------- Position von Substring zurückgeben --------- */
- int str_index(string, substring, u_case)
- char string[];
- char substring[];
- int u_case;
-
- {
- int i, j, k;
-
- if(u_case == FALSE)
- {
- for(i = 0; string[i] != NULL; i++)
- {
- for(j = i, k = 0; substring[k] == string[j];
- k++, j++)
- {
- if(substring[k + 1] == NULL)
- return(i); /* Substring wurde gefunden */
- }
- }
- return(-1); /* Substring nicht gefunden */
- }
- else
- {
- for(i = 0; string[i] != NULL; i++)
- {
- for(j = i, k = 0; toupper(substring[k]) ==
- toupper(string[j]); k++, j++)
- {
- if(substring[k + 1] == NULL)
- return(i); /* Substring wurde gefunden */
- }
- }
- return(-1); /* Substring wurde gefunden */
- }
- }
-
- /* ------- Substring aus String herausnehmen ---------- */
- int remove_substring(string, first, num_char)
- char string[];
- int first; /* Pos. des ersten zu entf. Zeichen */
- int num_char; /* Anzahl der zu entf. Zeichen */
-
- {
- int length; /* Länge von String */
- int index1; /* zeigt auf 1. zu entf. Zeichen */
- int index2; /* zeigt auf 1. verbl. Zeichen */
-
- length = strlen(string);
- if(first >= length || first < 0)
- return(-1); /* ungültige Anfangsposition */
-
- if(first + num_char <= length)
- index2 = first + num_char;
- else
- index2 = length; /* lösche nur bis NULL */
-
- /* entfernen */
- for(index1 = first; (string[index1] = string[index2])
- != '\0'; index1++)
- {
- index2++;
- }
- }
-
- /* -------- Substring in String einfügen ---------------- */
- int insert_string(string, substring, location)
- char string[];
- char substring[]; /* einzufügender Teilstring */
- int location;
-
- {
- int index1; /* Index innerhalb von string */
- int index2; /* Index innerhalb von substring */
- int index_temp; /* Index innerhalb von temp */
- char temp[MAX_STRING] ; /* Temporärer String */
-
- /* Überprüfen der Positionsangabe */
- if(location >= strlen(string))
- return(-1);
-
- /* Zeichen auf temp kopieren */
- for(index_temp = 0, index1 = 0; index1 < location;
- index1++, index_temp++)
- {
- temp[index_temp] = string[index1];
- }
-
- /* substring an temp anhängen */
- for(index2 = 0; substring[index2] != NULL; ++index2,
- index_temp++)
- {
- temp[index_temp] = substring[index2];
- }
-
- /* Rest von string an temp anhängen */
- while((temp[index_temp++] = string[index1++]) != '\0');
-
- /* Zurückgeben von temp an string */
- strcpy(string, temp);
- }
- /* ------------------------------------------------------ */
- /* Ende von SDR.C */