This is strada.c in view mode; [Download] [Up]
/* $Id: strada.c,v 3.1 1993/06/28 09:31:07 klute Exp klute $ */ /* * 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 <ctype.h> #include <limits.h> #ifdef __NeXT__ #include <stdlib.h> #else #include <malloc.h> #endif #include <memory.h> #include <stdio.h> #include <string.h> #include "message.h" #include "plzfile.h" #include "strada.h" #if defined (HANDLE_BROKEN_DATAFILES) #define IbmToIso IbmAndBrokenToIso #endif static PlzFile strada = {(FILE *) 0, 0, 0, 0}; StradaSet *Strassenverzeichnis (char *alort) { Range *foundEntries; StradaSet *result = (StradaSet *) malloc (sizeof (StradaSet)); Strada *r; long pos; int i; if (result == (StradaSet *) 0) { OutOfMemory ("Strassenverzeichnis"); return result; } OpenPlzFile (&strada, "strada"); if (strada.f == (FILE *) 0) return (StradaSet *) 0; foundEntries = BinarySearchAll (strada.f, strada.recordLength, 0L, strada.entries, ((Strada *) 0)->alort - ((Strada *) 0)->alort, sizeof (((Strada *) 0)->alort), alort, -1, userInterfaceMethods.StradaRecordRead, &strada); Note ("\n"); if (foundEntries == (Range *) 0) return (StradaSet *) 0; if (foundEntries->first == -1 && foundEntries->last == -1) result->entries = 0; else result->entries = foundEntries->last - foundEntries->first + 1; if (result->entries == 0) { free (foundEntries); result->list = (Strada *) 0; return result; } else result->list = (Strada *) malloc ((unsigned int) (result->entries * sizeof (Strada) + 2)); if (result->list == (Strada *) 0) { free (foundEntries); OutOfMemory ("Strassenverzeichnis"); return (StradaSet *) 0; } pos = foundEntries->first; for (r = result->list, i = 0; i < result->entries; i++, r++) { fgetr (r, pos++, &strada); } free (foundEntries); return result; } StradaSet *StrassenAndOrtsteil (StradaSet *stradaSet, char *ortsteil) { StradaSet *result = (StradaSet *) malloc (sizeof (StradaSet)); Strada *r; char buffer[sizeof (((Strada *) 0)->ortsteil) + 1]; char *help1; char *help2; int i; if (result == (StradaSet *) 0) { OutOfMemory ("AndOrtsteil"); return result; } result->list = (Strada *) calloc (stradaSet->entries, sizeof (Strada)); if (result->list == (Strada *) 0) { OutOfMemory ("SearchForArea"); free (result); return (StradaSet *) 0; } r = result->list; for (i = 0; i < stradaSet->entries; i++) { strncpy (buffer, stradaSet->list[i].ortsteil, sizeof (stradaSet->list[i].ortsteil)); buffer[sizeof (stradaSet->list[i].ortsteil)] = '\0'; StripBlanks (buffer); help1 = IbmToIso (buffer); help2 = IsoToCapitals (help1); free (help1); help1 = IsoToCapitals (ortsteil); if (strcmp (help1, help2) == 0) memcpy ((char *) r++, (char *) &(stradaSet->list[i]), sizeof (Strada)); free (help1); free (help2); } result->entries = r - result->list; return result; } StradaSet *StrassenAndPostanstalt (StradaSet *stradaSet, char *postanstalt) { StradaSet *result = (StradaSet *) malloc (sizeof (StradaSet)); Strada *r; int i; if (result == (StradaSet *) 0) { OutOfMemory ("StrassenAndPostanstalt"); return result; } result->list = (Strada *) calloc (stradaSet->entries, sizeof (Strada)); if (result->list == (Strada *) 0) { OutOfMemory ("StrassenAndPostanstalt"); free (result); return (StradaSet *) 0; } r = result->list; for (i = 0; i < stradaSet->entries; i++) { if (strntoi (stradaSet->list[i].npanst, sizeof (stradaSet->list[i].npanst)) == atoi (postanstalt)) memcpy ((char *) r++, (char *) &(stradaSet->list[i]), sizeof (Strada)); } result->entries = r - result->list; return result; } StradaSet *SearchForArea (StradaSet *stradaSet, char *zustellamt, char *ortsteil) { StradaSet *result = (StradaSet *) malloc (sizeof (StradaSet)); Strada *r; char *help1, *help2; int i; Boolean matchZustellamt; Boolean matchOrtsteil; if (result == (StradaSet *) 0) { OutOfMemory ("SearchForArea"); return result; } result->list = (Strada *) calloc (stradaSet->entries, sizeof (Strada)); if (result->list == (Strada *) 0) { OutOfMemory ("SearchForArea"); free (result); return (StradaSet *) 0; } r = result->list; for (i = 0; i < stradaSet->entries; i++) { matchZustellamt = matchOrtsteil = False; if (*zustellamt) { if (strntoi (stradaSet->list[i].npanst, sizeof (stradaSet->list[i].npanst)) == atoi (zustellamt)) matchZustellamt = True; } else matchZustellamt = True; if (*ortsteil) { char buffer[100]; strncpy (buffer, stradaSet->list[i].ortsteil, sizeof (stradaSet->list[i].ortsteil)); buffer[sizeof (stradaSet->list[i].ortsteil)] = '\0'; StripBlanks (buffer); help1 = IbmToIso (buffer); help2 = IsoToCapitals (help1); free (help1); help1 = IsoToCapitals (ortsteil); if (strcmp (help1, help2) == 0) matchOrtsteil = True; free (help1); free (help2); } else matchOrtsteil = True; if (matchZustellamt && matchOrtsteil) memcpy ((char *) r++, (char *) &(stradaSet->list[i]), sizeof (Strada)); } result->entries = r - result->list; return result; } StradaSet *SucheStrasse (char *alort, char *street) { static Shortcut abk[] = { {"Str.", "Strasse"}, {"str.", "strasse"}, {"STR.", "STRASSE"}, {"V.", "Von"}, {"v.", "von"}, {"St.", "Sankt"}, {"st.", "sankt"}, {"ST.", "SANKT"}, {"dr.", "doktor"}, {"Dr.", "Doktor"}, {"DR.", "DOKTOR"}, {(char *) 0, (char *) 0}, }; Range *foundEntries; Range help; StradaSet *result = (StradaSet *) malloc (sizeof (StradaSet)); Strada *r; char *help1, *help2; long pos; int i; if (result == (StradaSet *) 0) { OutOfMemory ("SucheStrasse"); return result; } OpenPlzFile (&strada, "strada"); if (strada.f == (FILE *) 0) return (StradaSet *) 0; foundEntries = BinarySearchAll (strada.f, strada.recordLength, 0L, strada.entries, ((Strada *) 0)->alort - ((Strada *) 0)->alort, sizeof (((Strada *) 0)->alort), alort, -1, userInterfaceMethods.StradaRecordRead, &strada); Note ("\n"); help2 = AbkuerzungenExpandieren (street, abk); help1 = IsoToCapitals (help2); free (help2); help2 = CStringToFixed (help1, sizeof (((Strada *) 0)->snamesort)); free (help1); help.first = foundEntries->first; help.last = foundEntries->last; free (foundEntries); foundEntries = BinarySearchAll (strada.f, strada.recordLength, help.first, help.last, ((Strada *) 0)->snamesort - ((Strada *) 0)->alort, sizeof (((Strada *) 0)->snamesort), help2, -1, userInterfaceMethods.StradaRecordRead, &strada); free (help2); if (foundEntries == (Range *) 0) return (StradaSet *) 0; if (foundEntries->first == -1 && foundEntries->last == -1) result->entries = 0; else result->entries = foundEntries->last - foundEntries->first + 1; if (result->entries == 0) { free (foundEntries); result->list = (Strada *) 0; return result; } else result->list = (Strada *) malloc ((unsigned int) (result->entries * sizeof (Strada) + 2)); if (result->list == (Strada *) 0) { free (foundEntries); OutOfMemory ("SucheStrasse"); return (StradaSet *) 0; } pos = foundEntries->first; for (r = result->list, i = 0; i < result->entries; i++, r++) { fgetr (r, pos++, &strada); } free (foundEntries); return result; } static void StrToUpper (char *s) { while (*s) { if (islower (*s)) *s = toupper (*s); s++; } } static Boolean Between (int from, char *fromZusatz, int number, char *zusatz, int to, char *toZusatz) { if (from > number) return False; if (from == number) { while (*fromZusatz == ' ') fromZusatz++; StrToUpper (fromZusatz); while (*zusatz == ' ') zusatz++; StrToUpper (zusatz); if (strcmp (fromZusatz, zusatz) > 0) return False; } if (number > to) return False; if (number == to) { while (*toZusatz == ' ') toZusatz++; StrToUpper (toZusatz); while (*zusatz == ' ') zusatz++; StrToUpper (zusatz); if (strcmp (zusatz, toZusatz) > 0) return False; } return True; } char *SearchForHouseNumber (StradaSet *stradaSet, char *houseNumber) { int i, j; Strada *s; static char plz[6]; int number; int from; int to; char fromZusatz[sizeof (s->hnr2von) + 1]; char toZusatz[sizeof (s->hnr2bis) + 1]; Boolean even; Boolean found = False; char zusatz[sizeof (s->hnr2von) + 1]; number = strntoi (houseNumber, 4); for (; isdigit (*houseNumber); houseNumber++) ; strcpy (zusatz, houseNumber); even = (number >> 1) << 1 == number; *plz = '\0'; for (s = stradaSet->list, i = 0; i < stradaSet->entries && !found; i++, s++) { if (s->hnr1von[sizeof (s->hnr1von) - 1] == ' ') from = INT_MIN; else from = strntoi (s->hnr1von, sizeof (s->hnr1von)); strncpy (fromZusatz, s->hnr2von, sizeof (s->hnr2von)); fromZusatz[sizeof (s->hnr2von)] = '\0'; if (s->hnr1bis[sizeof (s->hnr1bis) - 1] == ' ') to = INT_MAX; else to = strntoi (s->hnr1bis, sizeof (s->hnr1bis)); if (strncmp (s->hnr2bis, "Ende", sizeof (s->hnr2bis)) == 0) for (j = 0; j < sizeof (s->hnr2bis); j++) toZusatz[j] = 0xff; else { strncpy (toZusatz, s->hnr2bis, sizeof (s->hnr2bis)); toZusatz[sizeof (s->hnr2bis)] = '\0'; } switch (s->hnrkenn[0]) { case '0': { if (Between (from, fromZusatz, number, zusatz, to, toZusatz)) found = True; break; } case '1': { if (even && Between (from, fromZusatz, number, zusatz, to, toZusatz)) found = True; break; } case '2': { if (!even && Between (from, fromZusatz, number, zusatz, to, toZusatz)) found = True; break; } } } if (!found) return ""; else { s--; strncpy (plz, s->plz_z, sizeof (s->plz_z)); plz[sizeof (s->plz_z)] = '\0'; return plz; } } Boolean UniqueStreet (StradaSet *stradaSet) { Strada *s; int i; int number; char sname[sizeof (s->sname)]; s = stradaSet->list; strncpy (sname, s->sname, sizeof (s->sname)); number = strntoi (s->strlfdnr, sizeof (s->strlfdnr)); for (i = 1, s++; i < stradaSet->entries; i++, s++) if (strntoi (s->strlfdnr, sizeof (s->strlfdnr)) != number || strncmp (sname, s->sname, sizeof (s->sname)) != 0) return False; return True; } Boolean IsStrassePlzEindeutig (StradaSet *stradaSet) { return UniqueStreet (stradaSet) && *(stradaSet->list->nplz_z) == '1'; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.