From cee09b6d7cd615f7de15e40bd27d1b3d0451641f Mon Sep 17 00:00:00 2001 From: fritz Date: Mon, 3 Mar 1997 04:20:48 +0000 Subject: [PATCH] Added files in areacode. --- areacode/Makefile.in | 41 +++ areacode/actest.c | 100 ++++++++ areacode/acvers.c | 117 +++++++++ areacode/areacode.c | 567 ++++++++++++++++++++++++++++++++++++++++++ areacode/areacode.dat | Bin 0 -> 124607 bytes areacode/areacode.doc | 165 ++++++++++++ areacode/areacode.h | 123 +++++++++ 7 files changed, 1113 insertions(+) create mode 100644 areacode/Makefile.in create mode 100644 areacode/actest.c create mode 100644 areacode/acvers.c create mode 100644 areacode/areacode.c create mode 100644 areacode/areacode.dat create mode 100644 areacode/areacode.doc create mode 100644 areacode/areacode.h diff --git a/areacode/Makefile.in b/areacode/Makefile.in new file mode 100644 index 00000000..7980b06d --- /dev/null +++ b/areacode/Makefile.in @@ -0,0 +1,41 @@ +# +# This Makefile is used for compatibility to the +# isdn4k-utils package. In order to superseede +# the original Makefile, it is called GNUmakefile. +# + +ifeq (../.config,$(wildcard ../.config)) + include ../.config + DATAOPTS := DATATARGET=$(shell echo $(CONFIG_AREACODE_DATA))/areacodes + # + # Install as root with numeric Id's, since these are the + # only ones that _really_ exist on _every_ system. + # + BUILDOPTS := $(DATAOPTS) + INSTALLOPTS := $(DATAOPTS) INSTALL="install -o 0 -g 0 -m 644" +endif + +all: .depend + $(MAKE) -f make/linux.mak $(BUILDOPTS) all + +.depend: + $(MAKE) -f make/linux.mak $(BUILDOPTS) depend + +config: + @cp Makefile.in GNUmakefile + +clean: + $(MAKE) -f make/linux.mak clean + +distclean: + $(MAKE) -f make/linux.mak distclean + rm -f GNUmakefile + +install-man: + +install: + mkdir -p $(CONFIG_AREACODE_DATA) + $(MAKE) -f make/linux.mak $(INSTALLOPTS) install + +uninstall: + rm -f $(shell echo $(CONFIG_AREACODE_DATA))/areacodes diff --git a/areacode/actest.c b/areacode/actest.c new file mode 100644 index 00000000..d32cda94 --- /dev/null +++ b/areacode/actest.c @@ -0,0 +1,100 @@ +/*****************************************************************************/ +/* */ +/* ACTEST.C */ +/* */ +/* Test an areacode data file */ +/* */ +/* */ +/* */ +/* (C) 1996,97 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.com */ +/* */ +/* */ +/* This software is provided 'as-is', without any express or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include +#include + +#include "areacode.h" + + + +int main (int argc, char* argv []) +{ + acInfo AC; + char Buf [256]; + unsigned RC; + acMaxMem = 0; + + /* See if there is an argument given. If so, use it as name and path of + * the database. + */ + if (argc >= 2) { + acFileName = argv [1]; + } + + /* Test loop */ + while (1) { + + printf ("Enter phone number: "); + fflush (stdout); + gets (Buf); + if (strlen (Buf) == 0) { + break; + } + + switch ((RC = GetAreaCodeInfo (&AC, Buf))) { + + case acOk: + printf ("acOK:\n" + " PrefixLen = %d\n" + " Info = %s\n", + AC.AreaCodeLen, AC.Info); + break; + + case acFileError: + printf ("acFileError\n"); + break; + + case acInvalidFile: + printf ("acInvalidFile\n"); + break; + + case acWrongVersion: + printf ("acWrongVersion\n"); + break; + + default: + printf ("Unknown return: %u\n", RC); + break; + + } + printf ("\n"); + + } + + return 0; +} + diff --git a/areacode/acvers.c b/areacode/acvers.c new file mode 100644 index 00000000..6e4e5872 --- /dev/null +++ b/areacode/acvers.c @@ -0,0 +1,117 @@ +/*****************************************************************************/ +/* */ +/* ACVERS.C */ +/* */ +/* Get the version and build of an areacode data file */ +/* */ +/* */ +/* */ +/* (C) 1996,97 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.com */ +/* */ +/* */ +/* This software is provided 'as-is', without any express or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* This code assumes 8 bit bytes */ + + + +#include +#include +#include + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +#define MAGIC0 0x68 +#define MAGIC1 0x57 +#define MAGIC2 0x46 +#define MAGIC3 0x35 + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +static void Usage (const char* ProgName) +/* Print usage information and exit */ +{ + printf ("%s: Print the version of an areacode database\n\n" + "Usage: \t%s file ...\n", + ProgName, ProgName); + exit (1); +} + + + +int main (int argc, char* argv []) +{ + int I; + + if (argc < 2) { + Usage (argv [0]); + } + + for (I = 1; I < argc; I++) { + + FILE* F; + const char* Filename = argv [I]; + unsigned char MagicBuf [4]; + unsigned char BuildBuf [2]; + unsigned char VersionBuf [2]; + unsigned Build; + + if ((F = fopen (Filename, "rb")) == 0) { + perror ("Cannot open input file"); + exit (2); + } + + fread (MagicBuf, sizeof (MagicBuf), 1, F); + if (MagicBuf [0] != MAGIC0 || MagicBuf [1] != MAGIC1 || + MagicBuf [2] != MAGIC2 || MagicBuf [3] != MAGIC3) { + fprintf (stderr, "No dial prefix database\n"); + exit (3); + } + + fread (BuildBuf, sizeof (BuildBuf), 1, F); + fread (VersionBuf, sizeof (VersionBuf), 1, F); + fclose (F); + + Build = ((unsigned) BuildBuf [1]) * 256 + ((unsigned) BuildBuf [0]); + printf ("%d %d %u\n", VersionBuf [1], VersionBuf [0], Build); + + } + return 0; +} + + + diff --git a/areacode/areacode.c b/areacode/areacode.c new file mode 100644 index 00000000..1bfddd9c --- /dev/null +++ b/areacode/areacode.c @@ -0,0 +1,567 @@ +/*****************************************************************************/ +/* */ +/* AREACODE.C */ +/* */ +/* Portable library module to search for an area code in a database. */ +/* */ +/* */ +/* */ +/* (C) 1996,97 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.com */ +/* */ +/* */ +/* This software is provided 'as-is', without any express or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* + * The code assumes + * - 8 bit bytes + * - unsigned long is 32 bit. This may be changed by #defining u32 to + * a data type that is an 32 bit unsigned when compiling this module. + * - ascii character set + * + * The code does *not* assume + * - a specific byte order. Currently the code autoadjusts to big or + * little endian data. If you have something more weird than that, + * you have to add conversion code. + * + */ + + + +#include +#include +#include +#include + +#include "areacode.h" + + + +/*****************************************************************************/ +/* Externally visible data */ +/*****************************************************************************/ + + + +/* The name of the areacode data file. The default is what is #defined as + * DATA_FILENAME. If this is not #defined, the default is "areacode.dat", + * which is probably not what you want. In the latter case set this to + * the correct filename *before* your first call to GetAreaCodeInfo. + */ +#ifdef DATA_FILENAME +char* acFileName = DATA_FILENAME; +#else +char* acFileName = "areacode.dat"; +#endif + +/* How much dynamic memory is GetAreaCodeInfo allowed to consume? Having less + * memory means more disk access and vice versa. The function does even work + * if you set this value to zero. For maximum performance, the function needs + * 4 byte per area code stored in the data file. The default is 32KB. + */ +unsigned long acMaxMem = 0x8000L; + + + +/*****************************************************************************/ +/* Data and structures */ +/*****************************************************************************/ + + + +/* Define an unsigned quantity with 32 bits. Try to make some clever + * assumptions using the data from limits.h. This may break some older + * (non ISO compliant) compilers, but I can't help... + */ +#if !defined(u32) && defined(ULONG_MAX) +# if ULONG_MAX == 4294967295UL +# define u32 unsigned long +# endif +#endif +#if !defined(u32) && defined(UINT_MAX) +# if UINT_MAX == 4294967295UL +# define u32 unsigned +# endif +#endif +#if !defined(u32) && defined(USHRT_MAX) +# if USHRT_MAX == 4294967295UL +# define u32 unsigned short +# endif +#endif +#if !defined(u32) +# define u32 unsigned long +#endif + +/* The version of the data file we support */ +#define acVersion 0x100 + +/* The magic words in little and big endian format */ +#define LittleMagic 0x35465768L +#define BigMagic 0x68574635L + +/* Defining the byte ordering */ +#define boLittleEndian 0 +#define boBigEndian 1 + +/* The byte order used in the file is little endian (intel) format */ +#define FileByteOrder boLittleEndian + +/* This is the header data of the data file. It is not used anywhere in + * the code, just have a look at it since it describes the layout in the + * file. + */ +typedef struct { + u32 Magic; + u32 Version; /* Version in hi word, build in lo word */ + u32 Count; + u32 AreaCodeStart; + u32 NameIndexStart; + u32 NameStart; +} PrefixHeader; + +/* This is what's really used: */ +typedef struct { + + /* The file we read from */ + FILE* F; + + /* Machine byte order */ + unsigned ByteOrder; + + /* Stuff from the file header */ + unsigned Version; + unsigned Build; + u32 Count; + u32 AreaCodeStart; + u32 NameIndexStart; + u32 NameStart; + + /* Control data */ + long First; + long Last; + u32* Table; + +} AreaCodeDesc; + +/* Translation table for translation CP850 --> ISO-8859-1. To save some space, + * the table covers only values > 127 + */ +#ifdef CHARSET_ISO +static char ISOMap [128] = { + 0xC7, 0xFC, 0xE9, 0xE2, 0xE4, 0xE0, 0xE5, 0xE7, + 0xEA, 0xEB, 0xE8, 0xEF, 0xEE, 0xEC, 0xC4, 0xC5, + 0xC9, 0xE6, 0xC6, 0xF4, 0xF6, 0xF2, 0xFC, 0xF9, + 0xFF, 0xD6, 0xDC, 0xA2, 0xA3, 0xA5, 0x50, 0x66, + 0xE1, 0xED, 0xF3, 0xFA, 0xF1, 0xD1, 0xAA, 0xBA, + 0xBF, 0x2D, 0xAC, 0xC6, 0xBC, 0xA1, 0xAB, 0xBB, + 0xFE, 0xFE, 0xFE, 0x7C, 0x2B, 0x2B, 0x2B, 0x2B, + 0x2B, 0x2B, 0x7C, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, + 0x2B, 0x2B, 0x2B, 0x2B, 0x2D, 0x2B, 0x2B, 0x2B, + 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2D, 0x2B, 0x2B, + 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, + 0x2B, 0x2B, 0x2B, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, + 0x61, 0xDF, 0x63, 0x70, 0x5A, 0x73, 0xB5, 0x74, + 0x70, 0x54, 0x4F, 0x64, 0x38, 0x30, 0x65, 0x55, + 0x3D, 0xB1, 0x3E, 0x3C, 0x66, 0x4A, 0xF7, 0x7E, + 0xB0, 0xB7, 0xB7, 0x2F, 0x6E, 0xB2, 0xFE, 0xFF +}; +#endif + +/* Macro to convert from big endian to little endian format and vice versa. + * Beware: The macro evaluates its parameter more than once! + */ +#define _ByteSwap(__V) ((((__V) & 0x000000FF) << 24) | \ + (((__V) & 0xFF000000) >> 24) | \ + (((__V) & 0x0000FF00) << 8) | \ + (((__V) & 0x00FF0000) >> 8)) + + + +/*****************************************************************************/ +/* Helper functions */ +/*****************************************************************************/ + + + +static u32 _ByteSwapIfNeeded (u32 D, unsigned ByteOrder) +/* Put the bytes into the correct order according to ByteOrder */ +{ + /* Swap bytes if needed and return the result */ + switch (ByteOrder) { + case boLittleEndian: return D; + default: return _ByteSwap (D); + } +} + + + +static u32 ByteSwapIfNeeded (u32 D, const AreaCodeDesc* Desc) +/* Put the bytes into the correct order according to ByteOrder in Desc */ +{ + /* Swap bytes if needed and return the result */ + return _ByteSwapIfNeeded (D, Desc->ByteOrder); +} + + + +static u32 _Load_u32 (FILE* F, unsigned ByteOrder) +/* Load an u32 from the current file position and swap it if needed */ +{ + u32 D; + + /* Read the data from the file */ + fread (&D, sizeof (D), 1, F); + + /* Swap bytes if needed and return the result */ + return _ByteSwapIfNeeded (D, ByteOrder); +} + + + +static u32 Load_u32 (const AreaCodeDesc* Desc) +/* Load an u32 from the current file position and swap it if needed */ +{ + return _Load_u32 (Desc->F, Desc->ByteOrder); +} + + + +static unsigned LoadFileHeader (AreaCodeDesc* Desc) +/* Load the header of a data file. Return one of the acXXX codes. */ +{ + u32 Version; + + /* Load the magic word in the format used int the file (do not convert) */ + u32 Magic = _Load_u32 (Desc->F, FileByteOrder); + + /* Check what we got from the file, determine the byte order */ + switch (Magic) { + + case BigMagic: + Desc->ByteOrder = boBigEndian; + break; + + case LittleMagic: + Desc->ByteOrder = boLittleEndian; + break; + + default: + /* OOPS - the file is probably not a valid data file */ + return acInvalidFile; + + } + + /* Now read the rest of the header data */ + Version = Load_u32 (Desc); + Desc->Version = (Version >> 16); + Desc->Build = (Version & 0xFFFF); + Desc->Count = Load_u32 (Desc); + Desc->AreaCodeStart = Load_u32 (Desc); + Desc->NameIndexStart = Load_u32 (Desc); + Desc->NameStart = Load_u32 (Desc); + + /* Check for some error conditions */ + if (ferror (Desc->F)) { + /* Some sort of file problem */ + return acFileError; + } else if (feof (Desc->F) || Desc->Count == 0) { + /* This should not happen on a valid file */ + return acInvalidFile; + } else if (Desc->Version != acVersion) { + return acWrongVersion; + } else { + /* Data is sane */ + return acOk; + } +} + + + +static u32 EncodeNumber (const char* Phone) +/* Encode the number we got from the caller into the internally used BCD + * format. + */ +{ + unsigned I; + unsigned Len; + u32 P = 0; /* Initialize to make gcc happy */ + + /* Get the amount of characters to convert */ + Len = strlen (Phone); + if (Len > 8) { + Len = 8; + } + + /* Convert the characters */ + for (I = 0; I < Len; I++) { + P = (P << 4) | ((unsigned) ((unsigned char) Phone [I]) & 0x0F); + } + + /* Fill the rest of the number with 0x0F */ + I = 8 - Len; + while (I--) { + P = (P << 4) | 0x0F; + } + + /* Done - return the result */ + return P; +} + + + +static u32 ReadPhone (const AreaCodeDesc* Desc, long Index) +/* Read the phone number that is located at the given index. If we have a + * part of the table already loaded into memory, use the memory copy, else + * read the phone number from disk. + */ +{ + if (Desc->Table && Index >= Desc->First && Index <= Desc->Last) { + /* Use the already loaded table, but don't forget to swap bytes */ + return ByteSwapIfNeeded (Desc->Table [Index - Desc->First], Desc); + } else { + /* Load the value from the file */ + fseek (Desc->F, Desc->AreaCodeStart + Index * sizeof (u32), SEEK_SET); + return Load_u32 (Desc); + } +} + + + +static void LoadTable (AreaCodeDesc* Desc) +/* Load a part of the table into memory */ +{ + u32 SpaceNeeded = (Desc->Last - Desc->First + 1) * sizeof (u32); + Desc->Table = malloc (SpaceNeeded); + if (Desc->Table == 0) { + /* Out of memory. There is no problem with this now since we do + * not really need the table in core memory (it speeds things up, + * that's all). In addition to that, the memory requirement halves + * with each iteration, so maybe we have more luck next time. + */ + return; + } + + /* Seek to the correct position in the file */ + fseek (Desc->F, Desc->AreaCodeStart + Desc->First * sizeof (u32), SEEK_SET); + + /* Read the data */ + fread (Desc->Table, SpaceNeeded, 1, Desc->F); +} + + + +static unsigned CalcCodeLen (u32 Code) +/* Calculate the length of a given (encoded) area code in characters */ +{ + u32 Mask; + unsigned Len = 0; + for (Mask = 0xF0000000L; Mask; Mask >>= 4) { + if ((Code & Mask) != Mask) { + Len++; + } else { + break; + } + } + + return Len; +} + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +unsigned GetAreaCodeInfo (acInfo* AC, const char* PhoneNumber) +/* Return - if possible - an information for the area code of the given number. + * The function returns one of the error codes defined in areacode.h. If the + * returned value is acOk, the AC struct is filled with the data of the + * area code found. If we did not have an error, but there is no area code + * that corresponds to the given number, the function returns acOk, but the + * AC struct is filled with an empty Info field and a AreaCodeLen of zero. + */ +{ + u32 Phone; /* PhoneNumber encoded in BCD */ + long First, Last, Current; /* For binary search */ + u32 CurrentVal; /* The value at Table [Current] */ + unsigned AreaCodeLen; /* The length of the area code found */ + unsigned char InfoLen; /* Length of info string */ + unsigned RC = acOk; /* Result code of the function */ + u32 Mask; + AreaCodeDesc Desc; + + + /* Clear the fields of the AC struct. Write a zero to the last field of + * Info - this field is never written to by the rest of the code. So by + * setting this to zero, we will assure a terminated string in case some + * problem prevents the code below from executing correctly. + */ + AC->Info [0] = '\0'; + AC->Info [sizeof (AC->Info) - 1] = '\0'; + AC->AreaCodeLen = 0; + + /* If the number is empty, return immidiately */ + if (strlen (PhoneNumber) == 0) { + return acOk; + } + + /* Open the database file, check for errors */ + Desc.F = fopen (acFileName, "rb"); + if (Desc.F == 0) { + /* We had an error opening the file */ + return acFileError; + } + + /* Initialize descriptor data where needed */ + Desc.Table = 0; + + /* Read the header from the file */ + RC = LoadFileHeader (&Desc); + if (RC != acOk) { + /* Wrong file or file read error */ + goto ExitWithClose; + } + + /* Convert the phone number into the internal representation */ + Phone = EncodeNumber (PhoneNumber); + + /* Add dead code to work around gcc warnings */ + Current = 0; + CurrentVal = 0; + + /* Now do a binary search over the data */ + First = 0; + Last = (long) Desc.Count - 1; + while (First <= Last) { + + /* If we don't have read the table into memory, check if we can do + * so now. + */ + if (Desc.Table == 0) { + u32 NeedMemory = (Last - First + 1) * sizeof (u32); + if (NeedMemory <= acMaxMem) { + /* Ok, the current part of the table is now small enough to + * load it into memory. + */ + Desc.First = First; + Desc.Last = Last; + LoadTable (&Desc); + } + } + + /* Set current to mid of range */ + Current = (Last + First) / 2; + + /* Get the phone number from that place */ + CurrentVal = ReadPhone (&Desc, Current); + + /* Do a compare */ + if (Phone > CurrentVal) { + First = Current + 1; + } else { + Last = Current - 1; + if (Phone == CurrentVal) { + /* Set the condition to terminate the loop */ + First = Current; + } + } + } + + /* First is the index of the area code, we eventually found. Put the index + * into Current and the value into CurrentVal. + */ + if (Current != First) { + Current = First; + CurrentVal = ReadPhone (&Desc, Current); + } + + /* + * We may now delete an eventually allocated table space since it is + * not needed any more. + */ + free (Desc.Table); + Desc.Table = 0; + + /* If Current points behind Last, we did not find anything */ + if (Current >= (long) Desc.Count) { + /* Not found */ + goto ExitWithClose; + } + + /* Calculate the length of the area code */ + AreaCodeLen = CalcCodeLen (CurrentVal); + + /* Check if the Prefix is actually the first part of the phone number */ + Mask = 0xFFFFFFFFL << ((8 - AreaCodeLen) * 4); + if ((Phone & Mask) != (CurrentVal & Mask)) { + /* They are different */ + goto ExitWithClose; + } + + /* Ok, we have now definitely found the code. Set up the data structure, + * we return to the caller. + */ + AC->AreaCodeLen = AreaCodeLen; + + /* Current is the index of the area code. Seek to the corresponding + * position in the name index, get the name position from there and seek + * to that place. + */ + fseek (Desc.F, Desc.NameIndexStart + Current * sizeof (u32), SEEK_SET); + fseek (Desc.F, Desc.NameStart + Load_u32 (&Desc), SEEK_SET); + + /* Read the length of the name and add the trailing zero to the info + * field in the result struct. + */ + fread (&InfoLen, 1, 1, Desc.F); + AC->Info [InfoLen] = '\0'; + + /* Read the info into the result struct */ + fread (AC->Info, 1, InfoLen, Desc.F); + +#ifdef CHARSET_ISO + /* Translate the info to the ISO-8859-1 charset */ + { + unsigned I; + for (I = 0; I < InfoLen; I++) { + unsigned char C = (unsigned char) AC->Info [I]; + if (C >= 128) { + AC->Info [I] = ISOMap [C - 128]; + } + } + } +#endif + +ExitWithClose: + /* Close the data file */ + fclose (Desc.F); + + /* Done, return the result */ + return RC; +} + + + diff --git a/areacode/areacode.dat b/areacode/areacode.dat new file mode 100644 index 0000000000000000000000000000000000000000..fdffadab4718d4c2b736d0ecfcec8422211f2598 GIT binary patch literal 124607 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�*%fjUxG{7jG)}t8Tdtq*ux7VP5f+?P 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 + + + +1. Overview +----------- + +The areacode module together with its database serves as a helper for +finding names for area codes. It is freely available, subject to the +copyright notice below. + + + +2. Function +----------- + +The module exports a few data types and one function. The function resolves +a phone number (including the country code) to some text describing the area +code found in the phone number. Current descriptions are in german, the +database contains german, swiss and austrian area codes. + +Usage is easy, just have a look into the header file areacode.h. + + + +3. Supported systems and limitations +------------------------------------ + +The module should run on nearly all system that have the following +characteristics: + + * 8 bit bytes + + * An unsigned data type with 32 bits. The code makes some checks with the + values in limits.h to find such a datatype for itself, if all checks + fail, unsigned long is used. This may be overriden by #defining the + macro u32 to the datatype needed. + + * An ANSI compatible compiler supporting prototypes. The code should also + compile with a C++ compiler, the header file uses the #ifdef __cpluplus + checks. + + * Big or little endian architectures. For something more weird (old + Vaxes?) code has to be added. + + * Systems with CP437, CP850 or ISO-8859-1 character sets. The "native" + format is CP850/CP437, for ISO-8859-1, the #define CHARSET_ISO has to + be added when compiling the module. + +The code has been tested under + + * DOS (Watcom C/C++ 10.6) + + * Windows-NT (Watcom C/C++ 10.6) + + * OS/2 2.x (Watcom C/C++ 10.6) + + * i386-Linux (gcc 2.7.2) + +For these environments makefiles can be found in the make subdirectory. + +The package has some limits as stated below: + + * Current language is german. + + * The data file contains area codes for germany and switzerland. + + * The area code including the country code (but not including the + international prefix, often 00) may not exceed 8 digits. This may be + bumped up to 9 digits if needed with some disadvantages (more + complicated code). + + * An area code description must be shorter than 256 characters. + + + +4. How to get the source & data files +------------------------------------- + +You may get the source for the package itself, for the datafile builder and +for new datafiles from + + ftp://ftp.musoftware.com/areacode + +Note: Please do not distribute modified data files. The data files contain +a version stamp to make shure, users don't overwrite newer versions with +older ones. This scheme will no longer work if data files are distributed +by third parties. + +Note: The datafile builder needs spunk, a C++ class library to compile. +You may want to have a look in + + ftp://ftp.musoftwware.com/spunk + +for the current spunk version. + + + +5. Installing the package +------------------------- + +For all systems the location of the data file has to be known. The default +name (including the path) may be compiled into the module by #defining +DATA_FILENAME, or set at runtime (see areacode.h). +The Linux makefile will install the data file in a common place, so more +than one software package depending on areacode is able to use the data file. + +The data file contains a version stamp, to avoid overwriting a newer file +by an older one, when installing more than one software package. The +program acvers is used to determine the build version, it will output three +numbers, the last one is the data file build (the first two are format +version numbers that - hopefully - will not change). + + + +6. Copying +---------- + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. +3. This notice may not be removed or altered from any source + distribution. + + + +7. Credits +---------- + +Many thanks to all people that helped developing the module: + + + Andreas Kool (akool@kool.f.eunet.de), author of isdnlog, + for many suggestions and code testing. + + Norbert Staudt (VKRG.Staudt@t-online.de), + who sent me lots of sample programs resolving area codes. + + Andreas Gutzwiller (andy@hippo.proxyon.imp.com), + for the swiss area codes. + + Alois Schneider (Alois.Schneider@magnet.at), + for the austrian area codes. + + diff --git a/areacode/areacode.h b/areacode/areacode.h new file mode 100644 index 00000000..703bb4dc --- /dev/null +++ b/areacode/areacode.h @@ -0,0 +1,123 @@ +/*****************************************************************************/ +/* */ +/* AREACODE.H */ +/* */ +/* Portable library module to search for an area code in a database. */ +/* */ +/* */ +/* */ +/* (C) 1996,97 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.com */ +/* */ +/* */ +/* This software is provided 'as-is', without any express or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* + * The code assumes + * - 8 bit bytes + * - unsigned long is 32 bit. This may be changed by #defining u32 to + * a data type that is an 32 bit unsigned when compiling this module. + * - ascii character set + * + * The code does *not* assume + * - a specific byte order. Currently the code autoadjusts to big or + * little endian data. If you have something more weird than that, + * you have to add conversion code. + * + */ + + + +#ifndef _AREACODE_H +#define _AREACODE_H + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +/*****************************************************************************/ +/* Data, structs and constants */ +/*****************************************************************************/ + + + +/* The name of the areacode data file. The default is what is #defined as + * DATA_FILENAME. If this is not #defined, the default is "areacode.dat", + * which is probably not what you want. In the latter case set this to + * the correct filename *before* your first call to GetAreaCodeInfo. + */ +extern char* acFileName; + +/* How much dynamic memory is GetAreaCodeInfo allowed to consume? Having less + * memory means more disk access and vice versa. The function does even work + * if you set this value to zero. For maximum performance, the function needs + * 4 byte per area code stored in the data file. The default is 32KB. + */ +extern unsigned long acMaxMem; + +/* Result codes of GetAreaCodeInfo */ +#define acOk 0 /* Done */ +#define acFileError 1 /* Cannot open/read file */ +#define acInvalidFile 2 /* The file exists but is no area code data file */ +#define acWrongVersion 3 /* Wrong version of data file */ + +/* The result of an area code search */ +typedef struct { + unsigned AreaCodeLen; /* The length of the area code found */ + char Info [256]; /* An info string */ +} acInfo; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +unsigned GetAreaCodeInfo (acInfo* /*AC*/ , const char* /*PhoneNumber*/); +/* Return - if possible - an information for the area code of the given number. + * The function returns one of the error codes defined in areacode.h. If the + * returned value is acOk, the AC struct is filled with the data of the + * area code found. If we did not have an error, but there is no area code + * that corresponds to the given number, the function returns acOk, but the + * AC struct is filled with an empty Info field and a AreaCodeLen of zero. + */ + + + +#ifdef __cplusplus +} +#endif + + + +/* End of AREACODE.H */ + +#endif +