This is cui.c in view mode; [Download] [Up]
/* $Id$ */ /* * Copyright 1993 Rainer Klute <klute@irb.informatik.uni-dortmund.de> * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. The author makes no representations about the suitability * of this software for any purpose. It is provided "as is" without express * or implied warranty. * */ #include <stdio.h> #include <string.h> #include "cui.h" #include "xplz.h" #include "batch.h" #include "convert.h" #include "patchlevel.h" #include "message.h" #include "strada.h" #include "ui.h" #include "utils.h" static void CuiMsgFlush (UiComponents *uc) { fprintf (stderr, "\n"); } static void CuiMsgWrite (UiComponents *uc, char *msg) { fprintf (stderr, msg); } #define CuiNoteWrite CuiMsgWrite static void CuiNoteClear (UiComponents *uc) {} #define CuiNoteFlush CuiMsgFlush static Boolean RecordRead (char *record) { Note ("."); return True; } static Boolean PofadaRecordRead (char *record) { return RecordRead (record); } static Boolean StradaRecordRead (char *record) { return RecordRead (record); } static Boolean UmsdaRecordRead (char *record) { return RecordRead (record); } static Boolean OrtardaRecordRead (char *record) { return RecordRead (record); } static void CuiPostfachliste (PofadaSet *pofadaSet, char *ortsname) { Pofada *l; Pofada *newPobox; int i, j; char msg[300]; char *isoMsg; int entriesLeft = pofadaSet->entries; char postanstalt[5]; newPobox = pofadaSet->list; postanstalt[0] = '\0'; for (l = pofadaSet->list, i = j = 0; i < pofadaSet->entries; i++, l++) { msg[0] = '\0'; if (strncmp (l->npanst, postanstalt, sizeof (l->npanst)) != 0) { strncpy (postanstalt, l->npanst, sizeof (l->npanst)); strncat (msg, l->plz_w_o, sizeof (l->plz_w_o)); strncat (msg, l->plzalt, sizeof (l->plzalt)); strcat (msg, " "); strncat (msg, ortsname, sizeof (((Umsda *) 0)->ortname_a)); StripBlanks (msg); strcat (msg, " "); strncat (msg, l->npanst, sizeof (l->npanst)); } else { entriesLeft--; continue; } #if defined (HANDLE_BROKEN_DATAFILES) isoMsg = IbmAndBrokenToIso (msg); #else isoMsg = IbmToIso (msg); #endif Message (isoMsg); MessageFlush (); free (isoMsg); } } static void AppendHn (char *s, char *tag, int length) { char *c = tag; while (*c == ' ' && c - tag < length) c++; if (c - tag < length) { strncat (s, c, length - (c - tag)); StripBlanks (s); } } static void CuiStrassenliste (PlzConversion *pc) { Strada *l; Strada *newStreet; int i, j; char msg[300]; char *isoMsg; char ortsteil[sizeof (((Strada *) 0)->ortsteil)]; char sname[sizeof (((Strada *) 0)->sname)]; char strlfdnr[sizeof (((Strada *) 0)->strlfdnr)]; int entriesLeft; if (pc->strassen == (StradaSet *) 0) { if (pc->orte->entries > 0) pc->strassen = Strassenverzeichnis (pc->orte->list[0].alort); else if (pc->archivOrte->entries > 0) pc->strassen = Strassenverzeichnis (pc->archivOrte->list[0].alort); } entriesLeft = pc->strassen->entries; newStreet = pc->strassen->list; ortsteil[0] = sname[0] = strlfdnr[0] = '\0'; for (l = pc->strassen->list, i = j = 0; i < pc->strassen->entries; i++, l++) { /* neue Postleitzahl: */ msg[0] = '\0'; strncat (msg, l->plz_z, sizeof (l->plz_z)); strcat (msg, " "); /* Straßenname: */ strncat (msg, l->sname, sizeof (l->sname)); StripBlanks (msg); isoMsg = IbmToIso (msg); /* Hausnummernbereich (falls vorhanden): */ if (strntoi (l->nplz_z, sizeof (l->nplz_z)) > 1) { Message (isoMsg); free (isoMsg); Message (", "); msg[0] = '\0'; AppendHn (msg, l->hnr1von, sizeof (l->hnr1von)); AppendHn (msg, l->hnr2von, sizeof (l->hnr2von)); strcat (msg, "-"); AppendHn (msg, l->hnr1bis, sizeof (l->hnr1bis)); AppendHn (msg, l->hnr2bis, sizeof (l->hnr2bis)); isoMsg = IbmToIso (msg); Message (isoMsg); free (isoMsg); } else { if (strncmp (l->sname, sname, sizeof (l->sname)) != 0 || strncmp (l->strlfdnr, strlfdnr, sizeof (l->strlfdnr)) != 0) { Message (isoMsg); free (isoMsg); strncpy (sname, l->sname, sizeof (l->sname)); strncpy (strlfdnr, l->strlfdnr, sizeof (l->strlfdnr)); } else { entriesLeft--; continue; } } /* Orts-String (bei mehreren gleichnamigen Straßen): */ if (strntoi (l->anzgleist, sizeof (l->anzgleist)) > 1) { if (strncmp (l->ortsteil, ortsteil, sizeof (l->ortsteil)) != 0) { strncpy (ortsteil, l->ortsteil, sizeof (l->ortsteil)); strcpy (msg, ", "); strncat (msg, l->plz_w_o, sizeof (l->plz_w_o)); StripBlanks (msg); strncat (msg, l->plzalt, sizeof (l->plzalt)); strcat (msg, " "); strncat (msg, pc->ort, sizeof (((Umsda *) 0)->ortname_a)); StripBlanks (msg); strcat (msg, " "); strncat (msg, l->npanst, sizeof (l->npanst)); StripBlanks (msg); strcat (msg, " ("); strncat (msg, l->ortsteil, sizeof (l->ortsteil)); StripBlanks (msg); strcat (msg, ")"); StripBlanks (msg); isoMsg = IbmToIso (msg); Message (isoMsg); free (isoMsg); } else { entriesLeft--; continue; } } MessageFlush (); } } static void PlzFound (Batch *batch) { PlzConversion *pc = batch->pc; char *help1, *help2; char ortString[300]; help1 = ColumnReplace (batch->inputRecord, batch->columnStreet, batch->separator, StrasseString (pc->strasse, pc->hausnummer, pc->postfach)); if (batch->columnPlz > 0 && batch->columnPlz != batch->columnPlace) { help2 = ColumnReplace (help1, batch->columnPlz, batch->separator, pc->plz_neu); free (help1); help1 = help2; help2 = ColumnReplace (help1, batch->columnPlace, batch->separator, pc->ort); } else { sprintf (ortString, "%s %s", pc->plz_neu, pc->ort); help2 = ColumnReplace (help1, batch->columnPlace, batch->separator, ortString); } FputsCharSet (help2, batch->ofl, batch->outputFormat); free (help1); free (help2); } static void PlzNotFound (Batch *batch) { FputsCharSet (batch->inputRecord, batch->efl, batch->outputFormat); } static void CuiOrtsliste (UmsdaSet *orte, OrtardaSet *archivOrte) { Umsda *lu; Ortarda *lo; int i; char msg[300]; char *isoMsg; char *c; for (lu = orte->list, i = 0; i < orte->entries; i++) { /* PLZ alt, Ortsname, Postanstalt: */ msg[0] = '\0'; strncat (msg, lu->plz_w_o, sizeof (lu->plz_w_o)); strncat (msg, lu->plzalt, sizeof (lu->plzalt)); strcat (msg, " "); strncat (msg, lu->ortname_a, sizeof (lu->ortname_a)); StripBlanks (msg); strcat (msg, " "); strncat (msg, lu->npanst_a, sizeof (lu->npanst_a)); StripBlanks (msg); isoMsg = IbmToIso (msg); Message (isoMsg); free (isoMsg); /* Ortszusatz: */ *msg = '\0'; c = lu->ortzusa; if (*c != ',' && *c != '-') strcat (msg, " "); while (*c == ' ' && c - lu->ortzusa < sizeof (lu->ortzusa)) c++; if (c - lu->ortzusa < sizeof (lu->ortzusa)) strncat (msg, c, sizeof (lu->ortzusa) - (c - lu->ortzusa)); StripBlanks (msg); isoMsg = IbmToIso (msg); Message (isoMsg); MessageFlush (); free (isoMsg); lu++; } for (lo = archivOrte->list; i < orte->entries + archivOrte->entries; i++) { /* PLZ alt, Ortsname, Postanstalt: */ msg[0] = '\0'; strncat (msg, lo->plz_w_o, sizeof (lo->plz_w_o)); strncat (msg, lo->plzalt, sizeof (lo->plzalt)); strcat (msg, " "); strncat (msg, lo->ortname_a, sizeof (lo->ortname_a)); StripBlanks (msg); strcat (msg, " "); strncat (msg, lo->npanst_a, sizeof (lo->npanst_a)); StripBlanks (msg); isoMsg = IbmToIso (msg); Message (isoMsg); free (isoMsg); /* aktueller Ortsname: */ strcpy (msg, " -> "); strncat (msg, lo->ortname_n, sizeof (lo->ortname_n)); StripBlanks (msg); isoMsg = IbmToIso (msg); Message (isoMsg); MessageFlush (); free (isoMsg); lo++; } MessageFlush (); } struct Optionen { char *string; enum {OptionDisplay, OptionOrt, OptionStrasse, OptionVerzeichnis, OptionStapelbetrieb, OptionEingabedatei, OptionAusgabedatei, OptionFehlerdatei, OptionTrennzeichen, OptionPostleitzahl, OptionZeichensatz, OptionVerkehrsgebiet} option; }; int Option (struct Optionen optionen[], int numOptionen, char *s) { int i; int bestMatchValue = 0; int bestMatchOption = -1; int cmp; char *h; char *s1; char *o1; int len; h = IbmToIso (s); s1 = IsoToCapitals (h); free (h); for (i = 0; i < numOptionen; i++) { h = IbmToIso (optionen[i].string); o1 = IsoToCapitals (h); free (h); len = strlen (s1); cmp = strncmp (s1, o1, len); free (o1); if (cmp == 0) { if (len == strlen (o1)) { bestMatchOption = optionen[i].option; break; } else if (len != bestMatchValue) { bestMatchValue = len; bestMatchOption = optionen[i].option; } else { bestMatchOption = -1; break; } } } free (s1); return bestMatchOption; } void CuiInterface (int argc, char *argv[]) { static ConversionData cd; static PlzConversion pcs; PlzConversion *pc = &pcs; Boolean verzeichnis = False; Boolean stapelbetrieb = False; Boolean fehler = False; char c; char string[300]; char *strasse, *hausnummer, *postfach, *plz_alt, *ort, *postanstalt, *ortsteil; char *plz_neu; char **p; static struct Optionen optionen[] = {{"Display", OptionDisplay}, {"Ort", OptionOrt}, {"Strasse", OptionStrasse}, {"Verzeichnis", OptionVerzeichnis}, {"Stapelbetrieb", OptionStapelbetrieb}, {"Eingabedatei", OptionEingabedatei}, {"Ausgabedatei", OptionAusgabedatei}, {"Fehlerdatei", OptionFehlerdatei}, {"Trennzeichen", OptionTrennzeichen}, {"Postleitzahl", OptionPostleitzahl}, {"PLZ", OptionPostleitzahl}, {"Zeichensatz", OptionZeichensatz}, {"Verkehrsgebiet", OptionVerkehrsgebiet} }; ort = strasse = plz_neu = strdup (""); cd.pc = &pcs; cd.pc->plz_alt = (char *) 0; cd.pc->ort = (char *) 0; cd.pc->postanstalt = (char *) 0; cd.pc->ortsteil = (char *) 0; cd.pc->strasse = (char *) 0; cd.pc->hausnummer = (char *) 0; cd.pc->postfach = (char *) 0; cd.pc->plz_neu = (char *) 0; cd.pc->verkehrsgebiet = 'W'; cd.pc->orte = (UmsdaSet *) 0; cd.pc->strassen = (StradaSet *) 0; cd.pc->postfaecher = (PofadaSet *) 0; cd.batch = (Batch *) calloc (1, sizeof (Batch)); UpdateString (&(cd.batch->inputFile), ""); UpdateString (&(cd.batch->outputFile), ""); UpdateString (&(cd.batch->errorFile), ""); cd.batch->separator = ','; cd.batch->columnStreet = -1; cd.batch->columnPlz = -1; cd.batch->columnPlace = -1; cd.batch->outputFormat = OutputISO; cd.batch->ifl = (FILE *) 0; cd.batch->ofl = (FILE *) 0; cd.batch->efl = (FILE *) 0; cd.batch->pc = cd.pc; cd.batch->fehlerAnhalten = False; cd.batch->userData = &cd; cd.batch->status = BatchInit; cd.batch->inputRecord = (char *) 0; cd.batch->successCallback = PlzFound; cd.batch->failureCallback = PlzNotFound; cd.batch->beforeConvertCallback = (void (*)()) 0; cd.batch->afterConvertCallback = (void (*)()) 0; cd.batch->finishedCallback = (void (*)()) 0; userInterfaceMethods.NoteClear = CuiNoteClear; userInterfaceMethods.NoteWrite = CuiNoteWrite; userInterfaceMethods.MsgWrite = CuiMsgWrite; userInterfaceMethods.MsgFlush = CuiMsgFlush; userInterfaceMethods.PofadaRecordRead = PofadaRecordRead; userInterfaceMethods.StradaRecordRead = StradaRecordRead; userInterfaceMethods.UmsdaRecordRead = UmsdaRecordRead; userInterfaceMethods.OrtardaRecordRead = OrtardaRecordRead; Message ("\nxplz "); Message (RELEASE); Message (" - Das Postleitzahlenbuch\n"); Message ("© 1993 Rainer Klute, Universität Dortmund, IRB\n"); MessageFlush (); for (p = argv + 1; *p != (char *) 0; p++) { switch (Option (optionen, sizeof (optionen) / sizeof (optionen[0]), *p)) { case OptionDisplay: { p++; break; } case OptionOrt: { ort = strdup (*(++p)); break; } case OptionStrasse: { strasse = strdup (*(++p)); break; } case OptionVerzeichnis: { verzeichnis = True; break; } case OptionStapelbetrieb: { stapelbetrieb = True; break; } case OptionEingabedatei: { cd.batch->inputFile = *(++p); break; } case OptionAusgabedatei: { cd.batch->outputFile = *(++p); break; } case OptionFehlerdatei: { cd.batch->errorFile = *(++p); break; } case OptionTrennzeichen: { cd.batch->separator = **(++p); break; } case OptionPostleitzahl: { cd.batch->columnPlz = atoi (*(++p)); break; } case OptionZeichensatz: { p++; if (strcmp (*p, "IBM") == 0 || strcmp (*p, "ibm") == 0) cd.batch->outputFormat = OutputIBM; else if (strcmp (*p, "ISO") == 0 || strcmp (*p, "iso") == 0 || strcmp (*p, "ISO8859-1") == 0 || strcmp (*p, "iso8859-1") == 0 || strcmp (*p, "ISO-8859-1") == 0 || strcmp (*p, "iso-8859-1") == 0) cd.batch->outputFormat = OutputISO; else if (strcmp (*p, "ATARI") == 0 || strcmp (*p, "atari") == 0) cd.batch->outputFormat = OutputAtari; else { fprintf (stderr, "Unbekannter Ausgabezeichensatz: -z %s\n\n", *p); fehler = True; } break; } case OptionVerkehrsgebiet: { if (**p == 'O' || **p == 'o' || **p == 'W' || **p == 'w') cd.pc->verkehrsgebiet = toupper (**p); break; } default: fehler = True; } } if (cd.batch->columnPlz == -1) cd.batch->columnPlz = cd.batch->columnPlace; if (fehler || !*ort) { fputs ("Aufruf: ", stderr); fputs (argv[0], stderr); fputs ("\n", stderr); fputs (" -ort [PLZ-alt] Ort [Postanstalt] [(Ortsteil)]\n", stderr); fputs (" [-strasse {Strasse [Hausnr.]|\"Postfach\" Nr.}]\n", stderr); fputs (" [-verzeichnis]\n", stderr); fputs (" [-verkehrsgebiet {W | O}]\n", stderr); fputs ("\n", stderr); fputs ("oder:\n", stderr); fputs ("\n", stderr); fputs (" ", stderr); fputs (argv[0], stderr); fputs ("\n", stderr); fputs (" -stapelbetrieb\n", stderr); fputs (" -eingabedatei name\n", stderr); fputs (" -ausgabedatei name\n", stderr); fputs (" -fehlerdatei name\n", stderr); fputs (" -trennzeichen t\n", stderr); fputs (" -ort spalte\n", stderr); fputs (" -strasse spalte\n", stderr); fputs (" [{-postleitzahl | -plz} spalte]\n", stderr); fputs (" [-verkehrsgebiet {W | O}]\n", stderr); fputs (" [-zeichensatz {ISO-8859-1 | IBM | ATARI}]\n", stderr); fputs ("\n", stderr); fputs ("Alle Optionen können bis auf Eindeutigkeit abgekürzt werden.\n", stderr); fputs ("\n", stderr); return; } if (stapelbetrieb) { if (atoi (strasse)) cd.batch->columnStreet = atoi (strasse); if (atoi (ort)) cd.batch->columnPlace = atoi (ort); while (!BatchConvert (cd.batch)) ; } else { strcpy (string, strasse); ParseStrasse (string, &strasse, &hausnummer, &postfach); strcpy (string, ort); ParseOrt (string, &plz_alt, &ort, &postanstalt, &ortsteil); ConvertPlz (pc, strasse, hausnummer, postfach, plz_alt, ort, postanstalt, ortsteil); free (strasse); free (hausnummer); free (postfach); free (plz_alt); free (ort); free (postanstalt); free (ortsteil); MessageFlush(); if (IsOrtGefunden (pc)) { if (!IsOrtEindeutig (pc)) { /* Mehrere PLZ, möglicherweise auch mehrere Orte */ if (verzeichnis) CuiOrtsliste (pc->orte, pc->archivOrte); } if (pc->status == PlzPlzNeuGefunden) plz_neu = strdup (pc->plz_neu); strcpy (string, OrtString (pc->plz_alt, pc->ort, pc->postanstalt, pc->ortsteil)); ort = strdup (string); } if (IsStrasseGefunden (pc)) { strcpy (string, StrasseString (pc->strasse, pc->hausnummer, pc->postfach)); strasse = strdup (string); if (!IsStrasseEindeutig (pc) && verzeichnis) CuiStrassenliste (pc); } if (IsPostfachGefunden (pc)) { strcpy (string, "Postfach "); strcat (string, pc->postfach); strasse = strdup (string); if (!IsPostfachEindeutig (pc) && verzeichnis) CuiPostfachliste (pc->postfaecher, pc->orte->list->ortname_a); } if (IsOrtGefunden (pc) && verzeichnis) { if (*(pc->strasse) && (!IsStrasseGefunden (pc) || !IsStrasseEindeutig (pc))) CuiStrassenliste (pc); } if (IsStrasseGefunden (pc) || IsPostfachGefunden (pc)) { Message (strasse); Message (", "); } if (IsOrtGefunden (pc)) Message (ort); if (pc->status == PlzPlzNeuGefunden) { Message (" --> "); Message (plz_neu); Message (" "); Message (pc->ort); MessageFlush (); } else { Message ("\n"); Message (ConversionStatusString (pc->status)); MessageFlush (); } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.