Commit 55dcd559 authored by undermink's avatar undermink
Browse files

init

parents
CFLAGS = -ansi -pedantic -Wall -O0 -g
LFLAGS = -g
all: address
parser.o address.o: parser.h address.h
scanner.o parser.o: scanner.h
address: address.o scanner.o parser.o
clean:
rm address.o scanner.o parser.o address
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"address.h" /* Anfuehrungs-Zeichen: Arbeitsverzeichnis */
#include"parser.h"
/* http://www.devtal.de/~thoto/ckurs/addressbuch3.tar.gz */
int aktuelleid=0;
/* Einlesen eines Datensatzes in neue Karteikarte */
struct knoten* einlesen(){
struct knoten* neueadresse;
/* Speicher fuer Adresskarte reservieren */
neueadresse=(struct knoten*) malloc(sizeof(struct knoten));
printf("Eingabe (Nach-)Name: "); /*Ausgabe des Promptes*/
(neueadresse->adresse).name=malloc(256); /*Speicher reservieren*/
/*Einlesen*/
scanf("%s",neueadresse->adresse.name); /*alternative: (*neueadresse).name*/
while (getchar() != '\n'); /*Speicher fuer naechsten scanf-Aufruf leeren*/
printf("Eingabe Vorname: ");
neueadresse->adresse.vorname=malloc(512);
scanf("%512s",neueadresse->adresse.vorname);
while (getchar() != '\n');
printf("Eingabe Telephon: ");
neueadresse->adresse.telephon=malloc(128);
scanf("%128s",neueadresse->adresse.telephon);
while (getchar() != '\n');
printf("Eingabe Strasse: ");
neueadresse->adresse.strasse=malloc(512);
scanf("%512s",neueadresse->adresse.strasse);
while (getchar() != '\n');
printf("Eingabe Hausnummer: ");
neueadresse->adresse.hausnummer=malloc(16);
scanf("%16s",neueadresse->adresse.hausnummer);
while (getchar() != '\n');
printf("Eingabe Ort: ");
neueadresse->adresse.ort=malloc(512);
scanf("%512s",neueadresse->adresse.ort);
while (getchar() != '\n');
printf("Eingabe PLZ: ");
scanf("%d",&neueadresse->adresse.plz);
while (getchar() != '\n');
/* printf("Eingabe IP: ");
scanf("%x",neueadresse->ip); */
neueadresse->id=aktuelleid++;
neueadresse->next=0x00;
return neueadresse; /* Rueckgabe der erstellten Adresskarte */
}
/*struct knoten* knoten_entfernen(struct knoten* knoten){
struct knoten* tempnext;
tempnext=knoten->next;
free(knoten);
return tempnext;
}*/
void loeschen(struct knoten** padrdb, int id){
struct knoten* adrdb=*padrdb;
struct knoten* tempnext;
if(id>=aktuelleid){ /* id > Maximalwert */
printf("Datensatz mit ID %d nicht vorhanden.\n", id); /*404*/
return;
}
if(adrdb==0x00){ /* erstes Element existiert nicht */
printf("Keine Datensaetze vorhanden.\n");
return;
}
if(adrdb->id==id){ /* erstes Element = id */
tempnext=adrdb->next; /* Next retten */
free(adrdb);
(*padrdb)=tempnext;
printf("Datensatz mit ID %d geloescht.\n", id);
}else {
while(adrdb->next!=0x00){ /* Element -> next existiert */
if(adrdb->next->id==id){ /* ID d. naechst. Elem. = ges. ID? */
/* loeschen */
tempnext=adrdb->next->next; /* Next retten */
free(adrdb->next);
adrdb->next=tempnext;
printf("Datensatz mit ID %d geloescht.\n", id);
return;
}else{ /* naechstes Element */
adrdb=adrdb->next; /* Schleifenerhoehung */
}
}
}
}
void ausgabe(struct adresse* x){ /* Ausgabe: Trivial */
printf("Name: %s\n",x->name);
printf("Vorname: \t%s\n",x->vorname);
printf("Telephon: \t%s\n",x->telephon);
printf("Strasse: \t%s\n",x->strasse);
printf("Hausnummer:\t%s\n",x->hausnummer);
printf("PLZ/Ort: \t%d %s \n\n",x->plz, x->ort);
}
void ausgabemitid(struct knoten* adrdb){
/* for(initialisierung;gueltigkeitspruefung;mutation) */
for(;adrdb!=0x00; adrdb=adrdb->next){
printf("\t%d:\t%s\t%s\n", adrdb->id,
adrdb->adresse.vorname, adrdb->adresse.name);
}
}
char* stringescape(char* peingabe){
char* eingabe, *ausgabe, *rausgabe;
int laenge;
eingabe=peingabe;
laenge=0;
/* ermittle Laenge der escapten Zeichenkette */
while((*eingabe)!='\0'){
switch(*eingabe){
case '\\': /* Sonderzeichen: Laenge um zwei erhoehen. */
case '"':
laenge+=2;
break;
default:
laenge++;
}
eingabe++; /* Zaehler erhoehen -> Position auf naechstes Zeichen */
}
eingabe=peingabe; /* Zeiger zuruecksetzen */
ausgabe=(char*) malloc(laenge+1); /* Speicher reservieren */
rausgabe=ausgabe;
while((*eingabe)!='\0'){
/* Sonderzeichen: Backslash einfuegen */
if(*eingabe=='\\'||*eingabe=='"'){
*ausgabe='\\';
ausgabe++;
}
/* Zeichen kopieren */
*ausgabe=*eingabe;
ausgabe++;
eingabe++; /* Zaehler erhoehen -> Position auf naechstes Zeichen */
}
*ausgabe=0x00; /* Ende der Zeichenkette */
return rausgabe;
}
void dateiausgabe(struct adresse* x, FILE* fd){ /* Ausgabe: Trivial */
char* wname=stringescape(x->name);
char* wvorname=stringescape(x->vorname);
char* wtelephon=stringescape(x->telephon);
char* wstrasse=stringescape(x->strasse);
char* whausnummer=stringescape(x->hausnummer);
char* wort=stringescape(x->ort);
fprintf(fd,"\"%s\";\"%s\";",wname,wvorname);
fprintf(fd,"\"%s\";",wtelephon);
fprintf(fd,"\"%s\";\"%s\";",wstrasse,whausnummer);
fprintf(fd,"%d;\"%s\"\n",x->plz, wort);
free(wname);
free(wvorname);
free(wtelephon);
free(wstrasse);
free(whausnummer);
free(wort);
}
void menue(struct knoten* adrdb){
int k; /* Kommando */
int id;
char* speicherort;
FILE* fd;
struct knoten* iadrdb;
k=0x00;
printf("\e[H\e[2J");
while(k!='q'){
printf("Bitte Kommando eingeben:\n\
i: Einlesen, a: Alle Datensaetze Ausgeben, l: Datensatz loeschen, \
b: bearbeiten, m: mehrere einlesen, s: auf Platte schreiben f: Datei einlesen \
q: beenden\n");
k=getchar();
while(getchar()!='\n');
switch(k){
case 'i':
iadrdb=adrdb;
/* noch keine Adresse vorhanden */
if(iadrdb==0x00) adrdb=einlesen();
else {
while((*iadrdb).next!=0x00) iadrdb=iadrdb->next;
iadrdb->next=einlesen();
}
break;
case 'a':
/* Ausgabe */
iadrdb=adrdb; /* Pointer auf Adressdatenbank duplizieren */
/* So koennen wir die Adressdatenbank behalten, und dennoch die
* Speicheradresse des aktuellen Eintrages verwenden */
/* Schleife bis der Zeiger auf die "Karteikarte" NULL ist. */
while(iadrdb!=0x00){
ausgabe(&(iadrdb->adresse)); /* Ausgeben */
iadrdb=iadrdb->next; /* Naechster Eintrag */
}
break;
case 'l':
ausgabemitid(adrdb);
printf("Bitte ID eingeben: ");
scanf("%d", &id);
while(getchar()!='\n');
loeschen(&adrdb,id);
break;
case 'b':
printf("Fuer dieses Feature bitte folgendes DLC installiern.");
break;
case 's':
printf("Speicherort angeben: \n");
speicherort=malloc(1024);
scanf("%s", speicherort);
while(getchar()!='\n');
fd=fopen(speicherort, "w+");
if(!fd){
fprintf(stderr, "Konnte Datei nicht oeffnen\n");
break;
}
iadrdb=adrdb; /* Pointer auf Adressdatenbank duplizieren */
while(iadrdb!=0x00){
dateiausgabe(&(iadrdb->adresse),fd); /* Ausgeben */
iadrdb=iadrdb->next; /* Naechster Eintrag */
}
fclose(fd);
printf("OK.\n");
break;
case 'f':
printf("Speicherort angeben: \n");
speicherort=malloc(1024);
scanf("%s", speicherort);
while(getchar()!='\n');
fd=fopen(speicherort, "r+");
if(!fd){
fprintf(stderr, "Konnte Datei nicht oeffnen\n");
break;
}
adrdb=parse_file(fd);
fclose(fd);
printf("OK.\n");
break;
case 'q':
case '\n':
break;
default:
printf("Lern lesen du Penner!");
}
}
}
int main(int argc, char** argv){
struct knoten* adrdb; /*adressdatenbank*/
adrdb=0x00;
menue(adrdb);
return 0;
}
#ifndef __ADDRESS_H__
#define __ADDRESS_H__
struct adresse{ /* Struktur aller Adressen: "Karteikarte" */
char* vorname;
char* name;
char* telephon;
char* strasse;
char* hausnummer;
int plz;
char* ort;
int ip;
} ;
struct knoten{
struct adresse adresse; /* void* daten; */
int id;
struct knoten* next;
} ;
#endif /* __ADDRESS_H__ */
"Müller";"Peter";"42231337";"Mirker Strasse";"23";42230;"Wuppertal"
"Jung";"Peter";"469-100";"Johannes Rau Platz";"1";42275;"Wuppertal"
#include"parser.h"
#include"scanner.h"
#include<stdlib.h>
struct knoten* parse_file(FILE* fd){
char* buf;
int tmp;
int mem;
struct symbol sym;
struct knoten* adrdb,* thisknot, *prevknot;
enum { z_daten, z_zahl, z_igno, z_bsli, z_bsl} modus;
enum { ins_vorname, ins_name, ins_telephon, ins_strasse, ins_hausnummer,
ins_plz, ins_ort } schreibziel;
modus=z_daten; /* Modi intialisieren */
schreibziel=ins_name;
mem=256; /* Speichergroesse */
thisknot=(struct knoten*) malloc(sizeof(struct knoten)); /* Datensatz */
thisknot->adresse.name=(char*) malloc(mem); /* anlegen */
buf=thisknot->adresse.name; /* Schreibzeiger */
adrdb=thisknot; /* Initialisierung: Erster Eintrag */
prevknot=NULL;
while((sym=scan_sym(fd)).sym_typ!=s_eof){
switch(modus){
case z_daten:
if(sym.sym_typ==s_anf)
modus=z_igno;
else if(sym.sym_typ==s_sem){
*buf='\0';
if(schreibziel==ins_name){
schreibziel=ins_vorname;
mem=512; /* Speichergroesse */
thisknot->adresse.vorname=(char*) malloc(mem);
buf=thisknot->adresse.vorname; /* Schreibzeiger */
}else if(schreibziel==ins_vorname){
schreibziel=ins_telephon;
mem=128; /* Speichergroesse */
thisknot->adresse.telephon=(char*) malloc(mem);
buf=thisknot->adresse.telephon; /* Schreibzeiger */
}else if(schreibziel==ins_telephon){
schreibziel=ins_strasse;
mem=512; /* Speichergroesse */
thisknot->adresse.strasse=(char*) malloc(mem);
buf=thisknot->adresse.strasse; /* Schreibzeiger */
}else if(schreibziel==ins_strasse){
schreibziel=ins_hausnummer;
mem=16; /* Speichergroesse */
thisknot->adresse.hausnummer=(char*) malloc(mem);
buf=thisknot->adresse.hausnummer; /* Schreibzeiger */
}else if(schreibziel==ins_hausnummer){ schreibziel=ins_plz;
thisknot->adresse.plz=tmp=0;
modus=z_zahl;
}else {
fprintf(stderr, "Parserfehler, Zeichen:%c\n", sym.code);
return 0;
}
} else if(sym.sym_typ==s_bsl)
modus=z_bsl;
else if(sym.sym_typ==s_brk){
if(schreibziel!=ins_ort) {
fprintf(stderr, "Ungueltige CSV-Datei\n");
return 0x00;
}
modus=z_daten;
*buf='\0'; /* Datensatz anlegen */
prevknot=thisknot;
thisknot=(struct knoten*) malloc(sizeof(struct knoten));
thisknot->adresse.name=(char*) malloc(512);
mem=512; /* Speichergroesse */
buf=thisknot->adresse.name; /* Schreibzeiger */
prevknot->next=thisknot; /* Verkettung */
schreibziel=ins_name;
} else if(sym.sym_typ==s_zif || sym.sym_typ==s_chr){
*buf=sym.code;
buf++;
mem--;
if(mem==0x00){ fprintf(stderr, "Zu gross."); return 0;}
} else {
fprintf(stderr, "Unbekannter Modus.\n");
return 0x00; /* Crash! */
}
break;
case z_zahl:
if(sym.sym_typ==s_anf || sym.sym_typ==s_brk ||
sym.sym_typ==s_bsl || sym.sym_typ==s_chr){
fprintf(stderr, "Ungueltiges Zeichen fuer Zahl gelesen.\n");
return 0;
} else if(sym.sym_typ==s_sem){
if(schreibziel==ins_plz){
thisknot->adresse.plz=tmp;
schreibziel=ins_ort;
mem=512; /* Speichergroesse */
thisknot->adresse.ort=(char*) malloc(mem);
buf=thisknot->adresse.ort; /* Schreibzeiger */
modus=z_daten;
}else {
fprintf(stderr, "Parserfehler. Zeichen:%c\n", sym.code);
return 0;
}
} else if(sym.sym_typ==s_zif){
tmp*=10;
tmp+=sym.code-0x30;
} else {
fprintf(stderr, "Unbekannter Modus.\n");
return 0x00; /* Crash! */
}
break;
case z_igno:
if(sym.sym_typ==s_anf){
modus=z_daten;
} else if(sym.sym_typ==s_sem || sym.sym_typ==s_brk ||
sym.sym_typ==s_zif || sym.sym_typ==s_chr){
*buf=sym.code;
buf++;
mem--;
if(mem==0x00){ fprintf(stderr, "Zu gross."); return 0;}
}else if(sym.sym_typ==s_bsl){
modus=z_bsli;
} else {
fprintf(stderr, "Unbekanntes Symbol.\n");
return 0x00; /* Crash! */
}
break;
case z_bsli:
if(sym.sym_typ!=s_eof){
*buf=sym.code;
buf++;
mem--;
if(mem==0x00){ fprintf(stderr, "Zu gross."); return 0;}
modus=z_igno;
}
break;
case z_bsl:
if(sym.sym_typ!=s_eof){
*buf=sym.code;
buf++;
mem--;
if(mem==0x00){ fprintf(stderr, "Zu gross."); return 0;}
modus=z_daten;
}
break;
}
}
if(schreibziel==ins_name) {
if(prevknot!=NULL) prevknot->next=NULL;
}else if(schreibziel==ins_ort) {
thisknot->next=NULL;
}
return adrdb;
}
#include"address.h"
#include<stdio.h>
#ifndef __PARSER_H__
#define __PARSER_H__
struct knoten* parse_file(FILE* fd);
#endif /* __PARSER_H__ */
#include"scanner.h"
struct symbol scan_sym(FILE* fd){
struct symbol ret;
if(feof(fd)){
ret.sym_typ=s_eof;
}else{
switch (ret.code=getc(fd)){
case '"':
ret.sym_typ=s_anf;
/* ret.code brauchen wir garnicht */
break;
case ';':
ret.sym_typ=s_sem;
break;
case '\n':
ret.sym_typ=s_brk;
break;
case '\\':
ret.sym_typ=s_bsl;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
ret.sym_typ=s_zif;
break;
default:
ret.sym_typ=s_chr;
}
}
return ret;
}
#include <stdio.h>
struct symbol{
enum { s_anf, s_sem, s_brk, s_eof, s_bsl, s_zif, s_chr } sym_typ;
/*Anfuehrungsz. Semikolon, Linebreak, End-Of-File, Backslash, Ziffer, Zeichen*/
int code;
} ;
struct symbol scan_sym(FILE* fd);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment