003
05.08.2002, 18:21 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo, da es mir zeitlich wie virtual geht, hab ich mal einen betr. Thread im "alten" Forum raus gesucht, in welchem NULL zur damaligen Zeit folgendes postete:
C++: |
/* * replace.c * - Ersetzt die Kommentare in einem C/C++ Quelltext durch Leerzeichen. * * This file is * Copyright (C) 2001 Franz Fritsche <info@simple-line.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define DATEI_ENDE EOF #define gehe_ueber_in goto
FILE *file_oeffnen(const char *path, const char *mode); int file_schliessen(FILE *pfile);
inline int lese(char &zeichen); inline void schreibe(char zeichen);
void pruefe_optionen(int argc, char *argv[]); void benutzung(void); void help(void);
FILE *ein, *aus;
int main(int argc, char *argv[]) { pruefe_optionen(argc, argv);
/*--- Files oeffnen ---------------------------------------*/
ein = file_oeffnen(argv[1], "r"); aus = file_oeffnen(argv[2], "w");
/*--- Beginn der eigentlichen Bearbeitung -----------------*/
char c, d; /* Fuer die einzulesenden Zeichen */
gehe_ueber_in Zustand0;
Zustand0: /* Zustand0: Lese Source-Text */
while (lese(c) != DATEI_ENDE) { switch (c) { case '\a': case '\b': case '\f': case '\r': case '\t': case '\v': schreibe(' '); break;
case '\\': if (lese(d) != DATEI_ENDE) { schreibe(c); schreibe(d); } else /* Dateiende erreicht! */ { schreibe(c); gehe_ueber_in Endezustand; } break; /* Beginn einer String-Konstante */ case '"': schreibe('"'); gehe_ueber_in Zustand3;
case '/': if (lese(d) != DATEI_ENDE) { switch (d) { case '*': /* Beginn eines C-Kommentars */ schreibe(' '); schreibe(' '); gehe_ueber_in Zustand1;
case '/': /* Beginn eines C++-Kommentars */ schreibe(' '); schreibe(' '); gehe_ueber_in Zustand2;
default: schreibe(c); schreibe(d); } } else /* Dateiende erreicht! */ { schreibe(c); gehe_ueber_in Endezustand; } break;
default: schreibe(c); } } gehe_ueber_in Endezustand;
Zustand1: /* Zustand1: Lese C-Kommentar-Text */
while (lese(c) != DATEI_ENDE) { switch (c) { case '\n': schreibe('\n'); break;
case '*': if (lese(d) != DATEI_ENDE) { if (d == '/') /* C-Kommentar ist zu ende */ { schreibe(' '); schreibe(' '); gehe_ueber_in Zustand0; } else if (d == '\n') { schreibe(' '); schreibe('\n'); } else { schreibe(' '); schreibe(' '); } } else /* Dateiende erreicht! */ { schreibe(' '); gehe_ueber_in Endezustand; } break;
default: schreibe(' '); } } gehe_ueber_in Endezustand;
Zustand2: /* Lese C++-Kommentar-Text */
while (lese(c) != DATEI_ENDE) { switch (c) { case '\\': if (lese(d) != DATEI_ENDE) { if (d == '\n') { schreibe(' '); schreibe('\n'); } else { schreibe(' '); schreibe(' '); } } else /* Dateiende erreicht! */ { schreibe(' '); gehe_ueber_in Endezustand; } break;
case '\n': /* C++-Kommentar ist zu ende */ schreibe('\n'); gehe_ueber_in Zustand0;
default: schreibe(' '); } } gehe_ueber_in Endezustand;
Zustand3: /* Lese String-Konstante */
while (lese(c) != DATEI_ENDE) { switch (c) { case '\\': if (lese(d) != DATEI_ENDE) { schreibe(c); schreibe(d); } else /* Dateiende erreicht! */ { schreibe(c); gehe_ueber_in Endezustand; } break;
case '\"': schreibe(c); gehe_ueber_in Zustand0;
default: schreibe(c); } } gehe_ueber_in Endezustand;
Endezustand: file_schliessen(ein); file_schliessen(aus);
return 0; }
FILE *file_oeffnen(const char *path, const char *mode) { FILE *pfile;
pfile = fopen(path, mode); if (pfile == NULL) { fprintf(stderr, "REPLACE: Fehler: Die Datei %s konnte nicht geoeffnet werden!\n", path); exit(EXIT_FAILURE); }
return pfile; }
int file_schliessen(FILE *pfile) { int result;
result = fclose(pfile); if (result == EOF) { fprintf(stderr, "REPLACE: Fehler: Eine Datei konnte nicht geschlossen werden!"); exit(EXIT_FAILURE); }
return 0; }
inline int lese(char &zeichen) { int temp;
temp = fgetc(ein); zeichen = (char) temp;
return temp; }
inline void schreibe(char zeichen) { if (fputc(zeichen, aus) == EOF) { fprintf(stderr, "REPLACE: Beim Schreiben auf die Zieldatei ist ein Fehler aufgetreten!\n"); fprintf(stderr, "(Moeglicherweise ist der Datenträger voll?)\n"); exit(EXIT_FAILURE); } }
void pruefe_optionen(int argc, char *argv[]) { if (argc == 1 || argc > 3) { benutzung(); exit(EXIT_FAILURE); }
if (argv[1][0] == '/' || argv[1][0] == '-') { switch (argv[1][1]) { case '?': help(); exit(EXIT_SUCCESS); case 'h': case 'H': if (!strcmp(argv[1]+1,"h") || !strcmp(argv[1]+1,"help") || !strcmp(argv[1]+1,"H") || !strcmp(argv[1]+1,"HELP") || !strcmp(argv[1]+1,"Help")) { help(); exit(EXIT_SUCCESS); }
default: fprintf(stderr,"REPLACE: Ungueltige Option: %s\n",argv[1]); exit(EXIT_FAILURE); } }
if (argc == 2 || argv[2][0] == '/' || argv[2][0] == '-') { benutzung(); exit(EXIT_FAILURE); }
if (!strcmp(argv[1], argv[2])) { fprintf(stderr,"REPLACE: Fehler: Quelle und Ziel duerfen nicht identisch sein!\n"); exit(EXIT_FAILURE); } }
void benutzung(void) { fprintf(stderr,"Benutzung: REPLACE [Laufwerk:][Pfad]Quelle [Laufwerk:][Pfad]Ziel\n"); }
void help(void) { fprintf(stderr,"Ersetzt die Kommentare in einem C/C++ Quelltext durch Leerzeichen.\n\n" "REPLACE: [Laufwerk:][Pfad]Quelle [Laufwerk:][Pfad]Ziel\n\n\ Quelle\tDateiname der Quelldatei.\n\ Ziel \tDateiname der Zieldatei.\n"); }
|
als Ergänzung noch der Link zum gesamten Thread http://f22.parsimony.net/forum43115/messages/5344.htm -- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe Dieser Post wurde am 05.08.2002 um 18:33 Uhr von Uwe editiert. |