This is utils.c in view mode; [Download] [Up]
/* $Id: utils.c,v 2.7 1993/06/04 14:46:52 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 <malloc.h>
#include <string.h>
#include "batch.h"
#include "message.h"
#include "utils.h"
/*
* strreplace
*/
static char *strreplace (char *s, int from, int length, char *replacement)
{
char *r = malloc (strlen (s) + 1 + strlen (replacement) + 1);
if (r == (char *) 0)
return r;
strncpy (r, s, from);
r[from] = '\0';
strcat (r, replacement);
strcat (r, s + from + length);
return r;
}
/*
* AbkuerzungenExpandieren
*/
char *AbkuerzungenExpandieren (char *strasse, Shortcut *abk)
{
Boolean done = False;
char *p;
char *s = strdup (strasse);
char *sn;
Shortcut *a;
if (s == (char *) 0)
return s;
while (!done)
{
done = True;
for (a = abk; a->str_short != (char *) 0 && a->str_long != (char *) 0;
a++)
{
p = strstr (s, a->str_short);
if (p != (char *) 0)
{
done = False;
sn = strreplace (s, p - s, strlen (a->str_short), a->str_long);
free (s);
s = sn;
}
}
}
return s;
}
/*
* ColumnReplace
*/
char *ColumnReplace (char* record, int column, char separator,
char*replacement)
{
int numFields;
int i;
char *s;
char *result = (char *) malloc (strlen (record) + strlen (replacement) + 1);
if (result == (char *) 0)
return result;
for (numFields = 1, s = record; *s; s++)
if (*s == separator)
numFields++;
result[0] = '\0';
for (i = 1; i <= numFields; i++)
{
if (i != column)
{
s = ReadSeparatedField (record, i, separator);
strcat (result, s);
free (s);
}
else
strcat (result, replacement);
if (i < numFields)
sprintf (result, "%s%c", result, separator);
}
return result;
}
/*
* "CStringToFixed" konvertiert einen C-String in einen Satz fester Länge. Der
* Ergebnisstring sollte nach Gebrauch mittels "free" wieder freigegeben
* werden.
*/
char *CStringToFixed (char *s, int length)
{
char *result = (char *) malloc (length + 1);
char *r = result;
if (result == (char *) 0)
{
OutOfMemory ("CStringToFixed");
return (char *) 0;
}
for (; *s && length > 0; length--)
*r++ = *s++;
for (; length > 0; length--)
*r++ = ' ';
*r = '\0';
return result;
}
void FputsCharSet (char *s, FILE *stream, int cs)
{
char *record;
char *r;
Boolean doFree = False;
switch (cs)
{
case OutputISO:
{
record = s;
break;
}
case OutputIBM:
{
record = IsoToIbm (s);
doFree = True;
break;
}
case OutputAtari:
{
record = IsoToAtari (s);
doFree = True;
break;
}
}
fputs (record, stream);
for (r = record; *r; r++)
;
if (*(--r) != '\n')
fputc ('\n', stream);
fflush (stream);
if (doFree)
free (record);
}
#if defined (HANDLE_BROKEN_DATAFILES)
/*
* "IbmAndBrokenToIso" konvertiert einen C-String mit IBM-Umlauten (und solchen
* vom Atari ST) nach ISO-8859-1. Die Funktion akzeptiert auch die
* "verkrüppelte 7-Bit-Darstellung der Umlaute. Der Ergebnisstring sollte nach
* Gebrauch mittels "free" wieder freigegeben werden.
*/
char *IbmAndBrokenToIso (char *s)
{
static char ibm[] =
{IBM_Ae, IBM_Oe, IBM_Ue, IBM_ae, IBM_oe, IBM_ue, IBM_ss, ATARI_ss,
BROKEN_Ae, BROKEN_Oe, BROKEN_Ue, BROKEN_ae, BROKEN_oe, BROKEN_ue,
BROKEN_ss};
static char iso[] =
{ISO_Ae, ISO_Oe, ISO_Ue, ISO_ae, ISO_oe, ISO_ue, ISO_ss, ISO_ss,
ISO_Ae, ISO_Oe, ISO_Ue, ISO_ae, ISO_oe, ISO_ue, ISO_ss};
char *result = (char *) malloc (strlen (s) + 1);
char *r = result;
char c;
int i;
if (result == (char *) 0)
{
OutOfMemory ("IbmToIso");
return (char *) 0;
}
while (*s)
{
c = *s++;
for (i = 0; i < sizeof (ibm) / sizeof (ibm[1]); i++)
if (c == ibm[i])
c = iso[i];
*r++ = c;
}
*r = '\0';
return result;
}
#endif
/*
* "IbmToIso" konvertiert einen C-String mit IBM-Umlauten (und solchen vom
* Atari ST) nach ISO-8859-1. Der Ergebnisstring sollte nach Gebrauch mittels
* "free" wieder freigegeben werden.
*/
char *IbmToIso (char *s)
{
static char ibm[] =
{IBM_Ae, IBM_Oe, IBM_Ue, IBM_ae, IBM_oe, IBM_ue, IBM_ss, ATARI_ss};
static char iso[] =
{ISO_Ae, ISO_Oe, ISO_Ue, ISO_ae, ISO_oe, ISO_ue, ISO_ss, ISO_ss};
char *result = (char *) malloc (strlen (s) + 1);
char *r = result;
char c;
int i;
if (result == (char *) 0)
{
OutOfMemory ("IbmToIso");
return (char *) 0;
}
while (*s)
{
c = *s++;
for (i = 0; i < sizeof (ibm) / sizeof (ibm[1]); i++)
if (c == ibm[i])
c = iso[i];
*r++ = c;
}
*r = '\0';
return result;
}
/*
* IsoToAtari
*/
char *IsoToAtari (char *s)
{
static char atari[] =
{IBM_Ae, IBM_Oe, IBM_Ue, IBM_ae, IBM_oe, IBM_ue, ATARI_ss};
static char iso[] =
{ISO_Ae, ISO_Oe, ISO_Ue, ISO_ae, ISO_oe, ISO_ue, ISO_ss};
char *result = (char *) malloc (strlen (s) + 1);
char *r = result;
char c;
int i;
if (result == (char *) 0)
return result;
while (*s)
{
c = *s++;
for (i = 0; i < sizeof (iso) / sizeof (iso[1]); i++)
if (c == iso[i])
c = atari[i];
*r++ = c;
}
*r = '\0';
return result;
}
/*
* "IsoToCapitals" konvertiert einen C-String in einen solchen mit
* Großbuchstaben. Deutsche Sonderzeichen gemäß ISO-8859-1 werden durch "AE",
* "OE", "UE" und "SS" ersetzt. Der Ergebnisstring sollte nach Gebrauch mittels
* "free" wieder freigegeben werden.
*/
char *IsoToCapitals (char *string)
{
unsigned char *s = (unsigned char *) string;
char *result = (char *) malloc (strlen ((char *) s) * 2 + 1);
char *r = result;
if (result == (char *) 0)
{
OutOfMemory ("IsoToCapitals");
return (char *) 0;
}
while (*s)
{
if (isascii (*s))
{
if (islower (*s))
*r++ = toupper (*s++);
else if (isspace (*s) || ispunct (*s))
s++;
else
*r++ = *s++;
}
else
{
switch (*s)
{
case ISO_Ae:
case ISO_ae:
{
*r++ = 'A';
*r++ = 'E';
break;
}
case ISO_Oe:
case ISO_oe:
{
*r++ = 'O';
*r++ = 'E';
break;
}
case ISO_Ue:
case ISO_ue:
{
*r++ = 'U';
*r++ = 'E';
break;
}
case ISO_ss:
{
*r++ = 'S';
*r++ = 'S';
break;
}
default:
{
char help[300];
sprintf (help, "Interner Fehler: ISO-8859-Zeichen \"%c\" kann nicht konvertiert werden.\n", *s);
Message (help);
break;
}
}
s++;
}
}
*r++ = '\0';
return result;
}
/*
* IsoToIbm
*/
char *IsoToIbm (char *s)
{
static char ibm[] =
{IBM_Ae, IBM_Oe, IBM_Ue, IBM_ae, IBM_oe, IBM_ue, IBM_ss};
static char iso[] =
{ISO_Ae, ISO_Oe, ISO_Ue, ISO_ae, ISO_oe, ISO_ue, ISO_ss};
char *result = (char *) malloc (strlen (s) + 1);
char *r = result;
char c;
int i;
if (result == (char *) 0)
return result;
while (*s)
{
c = *s++;
for (i = 0; i < sizeof (iso) / sizeof (iso[1]); i++)
if (c == iso[i])
c = ibm[i];
*r++ = c;
}
*r = '\0';
return result;
}
/*
* "OldPlz" liefert die alte Postleitzahl in einem einheitlichen
* Format "XNNNN" als C-String.
* Der Ergebnisstring muß sofort in einen eigenen Bereich kopiert werden.
*/
char *OldPlz (char *s, char verkehrsgebiet)
{
static char oldPlz[6];
int i;
if (*s == 'W' || *s == 'w')
oldPlz[0] = 'W';
else if (*s == 'O' || *s == 'o')
oldPlz[0] = 'O';
else
{
oldPlz[0] = verkehrsgebiet;
s--;
}
if (*++s == '-')
s++;
for (i = 1; *s && i < 5; i++)
oldPlz[i] = *s++;
for (; i < 5; i++)
oldPlz[i] = '0';
return oldPlz;
}
/*
* ReadSeparatedField
*/
char *ReadSeparatedField (char *string, int pos, char separator)
{
char *s1, *s2;
char *r;
int length;
int field = 0;
s1 = s2 = string - 1;
while (field < pos)
{
s1 = s2;
for (s2 = s1 + 1; *s2 && *s2 != separator; s2++)
;
field++;
}
length = s2 - s1 - 1;
r = (char *) malloc (length + 1);
if (r == (char *) 0)
OutOfMemory ("ReadField");
else
{
strncpy (r, s1 + 1, length);
r[length] = '\0';
}
return r;
}
/*
* "StripBlanks" entfernt hinten stehende Blanks aus einem C-String. Die
* Funktion arbeitet direkt auf dem String.
*/
void StripBlanks (char *string)
{
char *s = string;
while (*s)
s++;
do
s--;
while (s >= string && *s == ' ');
s++;
*s = '\0';
}
int strntoi (char *s, int length)
{
char buffer[100];
strncpy (buffer, s, length);
buffer[length] = '\0';
return atoi (buffer);
}
int IbmIsoCStringCompare (char *s1, char *s2)
{
char *h, *h1, *h2;
int r;
h = IbmToIso (s1);
h1 = IsoToCapitals (h);
free (h);
h = IbmToIso (s2);
h2 = IsoToCapitals (h);
free (h);
r = strcmp (h1, h2);
free (h1);
free (h2);
return r;
}
/*
* Setzt die Bausteine Postleitzahl, Ort, Zustellamt und Ortsteil zu einem
* String zusammen. Alle Elemente sind optional.
*/
char *OrtString (char *plz, char *ort, char *zustellamt, char *ortsteil)
{
static char string[200];
strcpy (string, plz);
if (*ort)
{
if (*string)
strcat (string, " ");
strcat (string, ort);
}
if (*zustellamt)
{
if (*string)
strcat (string, " ");
strcat (string, zustellamt);
}
if (*ortsteil)
{
if (*string)
strcat (string, " ");
strcat (string, "(");
strcat (string, ortsteil);
strcat (string, ")");
}
return string;
}
/*
* Setzt die Bausteine Straße und Hausnummer oder Postfach zu einem String
* zusammen. Alle Elemente sind optional.
*/
char *StrasseString (char *strasse, char *hausnummer, char *postfach)
{
static char string[200];
*string = '\0';
if (*strasse)
{
strcpy (string, strasse);
if (*hausnummer)
{
if (*string)
strcat (string, " ");
strcat (string, hausnummer);
}
}
else if (*postfach)
{
strcpy (string, "Postfach ");
strcat (string, postfach);
}
return string;
}
/*
* UpdateString
*/
Boolean UpdateString (char **old, char *new)
{
if (*old != (char *) 0)
{
if (strcmp (*old, new) == 0)
return False;
free (*old);
}
*old = (char *) malloc (strlen (new) + 1);
strcpy (*old, new);
return True;
}
/*
* strdup
*/
#ifdef NEED_STRDUP
char *strdup (char *s)
{
static char *n = '\0';
if ((n = (char *) malloc (strlen (s) + 1)) != NULL)
strcpy (n, s);
return (n)
}
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.