|
mxLib.c |
/* mxLib.c */
void bcopy(const void *s, void *d, unsigned long n)
/* byte-weises Kopieren, vom Compiler zur Optimierung benutzt */
{
const char *chars = s;
char *chard = d;
if (chars > chard)
while (n--) {
*chard++ = *chars++;
}
else
{
chars += n;
chard += n;
while (n--)
*--chard = *--chars;
}
}
void *memcpy(void *t, const void *f, unsigned long n)
/* Ersatz fuer libc-memcpy (nicht 100% POSIX oder ANSI) */
{
char *p = t;
bcopy(f, t, n);
return (p);
} /* memcpy */
void *memset (void *s, int c, unsigned long n)
/* Ersatz fuer libc-memset (nicht 100% POSIX oder ANSI) */
{
char *p = s;
while (n--) *p++ = (char)c;
return s;
}
char *strcpy(char *d, const char *s)
/* einen String kopieren */
{
char *rval = d;
while((*d++ = *s++));
return(rval);
} /* strcpy */
char *strncpy(char *d, const char *s, int len)
/* genau n Zeichen kopieren, ggf. Nullen auffüllen */
{
char *rval = d;
while(len-- > 0 && (*d++ = *s++));
while(len-- > 0) *d++ = 0;
return(rval);
} /* strcpy */
int strcmp(const char *dest, const char *src)
/* zwei Strings vergleichen */
{
while (*dest && (*dest == *src)) {
dest++;
src++;
}
return(*dest - *src);
} /* strcpy */
int strncmp(const char *dest, const char *src, int n)
/* zwei Strings vergleichen, max. n Bytes oder bis '\0' */
{
while (--n > 0 && *dest && (*dest == *src)) {
dest++;
src++;
}
return(*dest - *src);
} /* strncmp */
int strlen(const char *s)
/* Laenge eines Strings bestimmen */
{
register int n;
for(n = 0; *s++; n++);
return(n);
}
int atoi(const char *s)
/* Dezimalzahl in int wandeln */
{
unsigned val = 0;
int neg = 0;
while (*s == ' ' || *s == '\t') s++;
if (*s == '-') s++, neg = 1;
while (*s >= '0' && *s <= '9') val = 10 * val + (*s++ - '0');
return neg? -(int)val : (int)val;
}
static int unsigned_to_str(char *s, int maxlen, unsigned value, int base)
/*
* unsigned_to_str - konvertiere den unsigned-Wert `value' mit der Basis
* `base' in einen String, der mit maximal `maxlen' Zeichen in
* dem array abgelegt wird, auf das `s' zeigt. Der String, auf den
* `s' zeigt, wird nicht null-terminiert.
* Rueckgabewert ist die Anzahl der Zeichen, die in `s'
* gespeichert wurden.
*/
{
char field[32]; /* Zwischenspeicher */
char *orig_s = s; /* zur Berechnung der konvertierten Zeichen */
char *limit = s + maxlen; /* zeigt hinter das letzte benutzbare Zeichen */
char *f = field + sizeof(field); /* zeigt hinter das Ende von `field' */
char c;
if (value == 0) /* bei Wert == 0 ist die Konvertierung simpel */
{
if (maxlen > 0)
{
*s = '0';
return 1;
}
else
return 0;
}
else
{
while (value > 0) /* die konvertierten Zeichen werden vom Ende */
{ /* her in `field' geschrieben */
c = value % base;
value /= base;
if (c <= 9)
*--f = c + '0';
else
*--f = c - 10 + 'a';
}
while (f < field + sizeof(field) && s < limit) /* nun werden die Zeichen an den Anfang von `s' */
*s++ = *f++; /* kopiert */
return s - orig_s; /* Anzahl der Zeichen zurueckgeben */
}
}
static void pad_string(char **dest, char *last, int count, int filler)
/*
* pad_string - schreibt `count'-mal das Zeichen `filler' in den
* String, auf den `*dest' zeigt und erhoeht `*dest' um den
* entsprechenden Betrag. Maximal werden aber soviele Zeichen
* geschrieben, dass `*dest' nicht hinter `last' zeigt.
*/
{
char *s = *dest;
while (count > 0 && s < last)
{
*s++ = filler;
count--;
}
*dest = s;
}
int vsnprintf(char *dest, int maxlen, char *format, int *argp)
/*
* vsnprintf - Dies ist das Arbeitstier der printf-Familie.
* `dest' ist der String, in den die formatierte Ausgabe
* geschrieben wird, dabei werden maximal `maxlen' Zeichen
* geschrieben, einschliesslich eines abschliessenden Nullbytes.
* `format' ist der Formatstring und `argp' zeigt auf das erste
* Argument der variablen Parameterliste hinter dem Formatstring.
* Rueckgabewert ist die Anzahl der insgesamt geschriebenen
* Zeichen, einschliesslich des Nullbytes am Ende. Der
* Ergebnisstring ist immer Null-terminiert.
*/
{
char field[32]; /* zum Formatieren der Zahlen */
char *orig_dest = dest; /* zur Berechnug der Zeichenanzahl */
char *last = dest + (maxlen - 1); /* letzte benutzbare Speicherstelle */
char c; /* zum Speichern eines char-Parameters */
char *s; /* Laufvariable */
int len; /* temp. Variable */
int width; /* Breite der Ausgabe */
int d; /* zum Speichern eines int-Parameters */
int u; /* zum Speichern eines unsigned-Parameters */
int left_justify; /* linksbuendige Ausgabe */
int filler; /* Zeichen zur buendigen Ausgabe */
int alternate; /* Alternative Darstellung (man -s 3s printf) */
int use_sign; /* immer Vorzeichen drucken */
while (*format)
{
switch (*format)
{
case '%':
format++; /* Formatanweisung ueberspringen */
if (*format == '#') /* alternative Darstellungsform */
{
alternate = 1;
format++;
}
else
alternate = 0;
if (!*format) /* Abruch der Schleife */
continue;
if (*format == '-') /* linksbuendige Ausgabe */
{
left_justify = 1;
format++;
}
else
left_justify = 0;
if (!*format) /* Abruch der Schleife */
continue;
if (*format == '+') /* immer Vorzeichen ausgeben */
{
use_sign = 1;
format++;
}
else
use_sign = 0;
if (!*format) /* Abruch der Schleife */
continue;
if (*format == '0') /* fuehrende Nullen fuer's padding */
{
filler = '0';
format++;
}
else
filler = ' ';
if (!*format) /* Abruch der Schleife */
continue;
if (*format >= '0' && *format <= '9') /* Breite der Ausgabe */
{
width = *format - '0';
format++;
while (*format >= '0' && *format <= '9')
{
width = width * 10 + (*format - '0');
format++;
}
}
else
width = 0;
if (!*format) /* Abbruch der Schleife */
continue;
switch (*format)
{
case 'c': /* character */
c = (char) *argp;
argp++;
width--;
if (!left_justify)
pad_string(&dest, last, width, ' ');
if (dest < last)
*dest++ = c;
if (left_justify)
pad_string(&dest, last, width, ' ');
break;
case 's': /* string */
s = (char *) *argp;
argp++;
len = strlen(s);
width -= len;
if (!left_justify)
pad_string(&dest, last, width, ' ');
while (*s && dest < last)
*dest++ = *s++;
if (left_justify)
pad_string(&dest, last, width, ' ');
break;
case 'd': /* signed integer */
case 'i':
d = (int) *argp;
argp++;
if (dest < last)
{
if (d < 0)
{
*dest++ = '-';
d = -d;
width--;
}
else if (use_sign)
{
*dest++ = '+';
width--;
}
len = unsigned_to_str(field, sizeof(field) - 1, d, 10);
field[len] = '\0';
width -= len;
if (!left_justify)
pad_string(&dest, last, width, filler);
s = field;
while (*s && dest < last)
*dest++ = *s++;
if (left_justify)
pad_string(&dest, last, width, filler);
}
break;
case 'u': /* unsigned integer */
u = (unsigned int) *argp;
argp++;
len = unsigned_to_str(field, sizeof(field) - 1, u, 10);
field[len] = '\0';
width -= len;
if (!left_justify)
pad_string(&dest, last, width, filler);
s = field;
while (*s && dest < last)
*dest++ = *s++;
if (left_justify)
pad_string(&dest, last, width, filler);
break;
case 'o': /* integer, Oktaldarstellung */
u = (int) *argp;
argp++;
len = unsigned_to_str(field, sizeof(field) - 1, u, 8);
field[len] = '\0';
width -= len;
if (alternate)
width--;
if (!left_justify)
pad_string(&dest, last, width, filler);
if (alternate)
if (dest < last)
*dest++ = '0';
s = field;
while (*s && dest < last)
*dest++ = *s++;
if (left_justify)
pad_string(&dest, last, width, filler);
break;
case 'p': /* pointer */
filler = '0';
width = 10;
alternate = 1; /* FALLTHRU!!! */
case 'x': /* integer, Hexdarstellung */
d = (int) *argp;
argp++;
len = unsigned_to_str(field, sizeof(field) - 1, d, 16);
field[len] = '\0';
width -= len;
if (alternate)
{
width -= 2;
if (dest < last)
*dest++ = '0';
if (dest < last)
*dest++ = 'x';
}
if (!left_justify)
pad_string(&dest, last, width, filler);
s = field;
while (*s && dest < last)
*dest++ = *s++;
if (left_justify)
pad_string(&dest, last, width, filler);
break;
default: /* alle anderen Formatangaben einfach kopieren, */
if (dest < last) /* z.B. bei `%%' */
*dest++ = *format;
break;
}
break;
default: /* Zeichen ohne `%' normal kopieren */
if (dest < last)
*dest++ = *format;
break;
}
format++;
}
*dest++ = '\0'; /* String terminieren */
return dest - orig_dest; /* Anzahl der konvertierten Zeichen zurueck */
}
int sprintf(char *dest, char *format, ...)
/*
* sprintf - formatiert den Formatstring `format' und die Argumente
* in der variablen Parameterliste in den String `dest'.
* ACHTUNG: sprintf() ist nicht sicher, es kann leicht zu
* buffer overflows kommen. Besser snprintf() (s.u.)
* benutzen
*/
{
return vsnprintf(dest, 1024 * 4, format, ((int *) &format) + 1);
}
int snprintf(char *dest, int maxlen, char *format, ...)
/*
* sprintf - formatiert den Formatstring `format' und die Argumente
* in der variablen Parameterliste in den String `dest', wobei
* maximal `maxlen' Zeichen in `dest' belegt werden.
*/
{
return vsnprintf(dest, maxlen, format, ((int *) &format) + 1);
}
int atexit(void (*function)(void))
{
(*function)(); /* Ruft die Destruktorenfunktion der libgcc auf */
return 0;
}
Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung