.ds RF \f3LIBRARY \f1 .ds RH \f3GUTIL \f1 .ds CH - % - .ds LH Anwendung .ds LF ING_DB 6.3/0 .bp .NH 2 .ft B Bibliotheksfunktionen ** .ft R .LP .sp 10 .NH 3 .ft B Vorbemerkung ** .ft R .LP Zwangsl\o'a"'ufig werden bei einem so umfangreichen Programmkomplex wie ING_DB eine Reihe von Bibliotheken verwendet. Dieser Abschnitt soll keine Erl\o'a"'uterungen zum Inhalt und zur Leistung der einzelnen Prozeduren und Funktionen bringen, es soll nur auf einige Besonderheiten hingewiesen werden. Mit dem \o'U"'bergang von UNIX Version 6 zu Version 7 wurden die Konvertierungsfunktionen .ft B atoX .ft R in ihrer Parameter\o'u"'bergabe bzw. -\o'u"'bernahme nicht den Bedingungen der V7-Bibliothek .ft B libc.a .ft R angepasst. Es ist deshalb sinnvoll in AMX-Programmen grunds\o'a"'tzlich die V6-Variante zu verwenden, um die Namensgleichheit zu \o'u"'berbr\o'u"'cken. .LP Dar\o'u"'berhinaus kennt die Bibliothek .ft B gutil .ft R eine Reihe von Funktionen, deren Anwendung durchaus Erleichterungen bei der Programmierung in C bringen kann, ohne das Gesamtkonzept zu st\o'o"'ren. Allerdings wird nachfolgend nur ein sehr bescheidener Teil der Prozeduren beschrieben. .NH 3 .ft B Funktionen ** .ft R .LP ------------------------------------------------------------ .sp 2 .DS C \f3APPEND \f1 .DE .ft B NAME .IP append - Block-Verkettung .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L append (b1, l1, b2, l2, b3) int l1, l2; char *b1, *b2, *b3; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Bl\o'o"'cke b1 und b2, jeweils mit der L\o'a"'nge l1 und l2, werden zum Block b3 verkettet. "return" erfolgt mit der Adresse des ersten Bytes nach b3. .RE .sp 1 .ft B FEHLER .ft R .IP Es wird nicht gepr\o'u"'ft, ob die Bl\o'o"'cke in unzul\o'a"'ssiger Weise \o'u"'berlappen. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3ATOF \f1 .DE .ft B NAME .ft R .IP atof - konvertiert eine Zeichenkette in eine Float-Zahl .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L atof (str, val) char *str; double *val; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP atof konvertiert eine durch str adressierte Zeichenkette in eine float-Zahl. Das Ergebnis steht auf der durch val adressierten Variablen. .br .RS .IP return: 8 -1 Syntaxfehler .br 0 keine Fehler .br 1 \o'U"'berlauf .RE .sp 1 Syntax: .IP {}[+|-]{}{}[. ]{}[] .sp wobei "sp" ein Leerzeichen, exp=[e|E] der Exponent und int eine Integer Zahl im Sinne der Konvertierungsfunktion atoi ist. .RE .sp 1 .ft B SIEHE-AUCH .ft R .IP atoi() .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3ATOI \f1 .DE .ft B NAME .ft R .IP atoi - konvertiert eine Zeichenkette in eine Integerzahl .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L atoi (str, val) char *str; int *val; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP atoi konvertiert eine durch str adressierte Zeichenkette in eine 16-Bit Integer-Zahl. Das Ergebnis steht auf der durch val adressierten Variablen. .br .RS .IP return: 8 -1 Syntaxfehler .br 0 keine Fehler .br 1 \o'U"'berlauf .RE .sp 1 Syntax: .IP {}[+|-]{}{Ziffer}{} .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3ATOL \f1 .DE .ft B NAME .ft R .IP atol - konvertiert eine Zeichenkette in eine Long-Zahl .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L atol (str, val) char *str; int *val; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP atol konvertiert eine durch str adressierte Zeichenkette in eine 32-Bit Integer-Zahl. Das Ergebnis steht auf der durch val adressierten Variablen. .RS .IP return: 8 -1 Syntaxfehler .br 0 keine Fehler .br 1 \o'U"'berlauf .RE .sp 1 Syntax: .IP {}[+|-]{}{Ziffer}{} .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3BEQUAL \f1 .DE .ft B NAME .ft R .IP bequal - Test auf Blockgleichheit .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L bequal (a, b, l) char *a, *b; int l; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP .ft B bequal .ft R testet zwei Bl\o'o"'cke a und b, beide in der L\o'a"'nge l, auf Gleichheit. .RS .IP return: 8 1 bei Gleichheit .br 0 bei Ungleichheit .RE .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3BITPOS \f1 .DE .ft B NAME .ft R .IP bitpos - h\o'o"'chstwertige Bitposition ermitteln .RE .sp 1 .ft B SYNOPSIS .ft R .IP bitpos (w) .br int w; .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP bitpos ermittelt die Stellung des h\o'o"'chstwertigen Bits der 16-Bit Integer-Zahl w. Die Bits werden von rechts nach links, beginnend mit Null, aufsteigend numeriert. .RS .IP return: 8 0, . . . , 15 entsprechend der Bitposition, .br -1 wenn kein Bit gesetzt ist. .RE .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3BMOVE \f1 .DE .ft B NAME .ft R .IP bmove - Block Transport .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L char *bmove (a, b, l) char *a, *b; int l; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP bmove transportiert l Bytes von a nach b. Die Sinnf\o'a"'lligkeit von l und ein "\o'U"'berlauf" von b werden nicht gepr\o'u"'ft. .IP "return" erfolgt mit der Adresse des l+1. Elementes von b. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3CONCAT \f1 .DE .ft B NAME .ft R .IP concat - Zeichenketten Verkettung .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L char *concat (s1, s2, s3) char *s1, *s2, *s3; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Zeichenketten s1 und s2 werden zur Zeichenkette s3 verkettet. Dabei d\o'u"'rfen s1 und s3 \o'u"'berlappen. "return" erfolgt mit der Adresse des letzten Bytes (Null-Byte) von s3. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3FTOA \f1 .DE .ft B NAME .ft R .IP ftoa - konvertiert eine Gleitkommazahl in eine Zeichenkette .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L ftoa (val, str, l, prec, form) .br double val; .br char *str, form; .br int l, prec; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP ftoa konvertiert eine doppeltgenaue Gleitkommazahl val in eine entsprechende Zeichenkette str. Die Zeichenkette str muss mindestens in der L\o'a"'nge l+1 vereinbart sein. Die Genauigkeit prec gibt die Anzahl der Stellen nach dem Dezimalpunkt an. Mit "form" wird das Ausgabeformat festgelegt. Es kann die Werte e, E, f, F, g, G, n<, N annehmen. E steht f\o'u"'r die exponentielle- und F f\o'u"'r die Gleitkommadarstellung. G und N sind analog zu F; passt die konvertierte Zahl aber nicht in die Ausgabebreite, wird auf die exponentielle Form umgeschaltet. G garantiert die Ausrichtung des Dezimalpunktes, N nicht. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3GETSTR \f1 .DE .ft B NAME .ft R .IP getstr - liesst eine Zeichenkette von der Standard-Eingabe .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L getstr (str, d, n) char *str, d; int n; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Es werden Zeichen von der Standard-Eingabe nach str \o'u"'bertragen und zwar solange, bis der Begrenzer .ft B d .ft R erkannt wird. Dabei werden h\o'o"'chstens n Zeichen \o'u"'bertragen. Wenn der Begrenzer nach n Zeichen noch nicht erkannt wurde, werden alle weiteren Zeichen bis zur Erkennung des Begrenzers \o'u"'bergangen. An Stelle des Begrenzers wird in jedem Falle das Null-Byte \o'u"'betragen, sodass das Feld str mindestens von der L\o'a"'nge n+1 sein muss. "return" erfolgt mit dem Wert 1. Sollte vor der Erkennung des Begrenzers das file-Ende erkannt werden, wird die Zeichenkette ebenfalls mit dem Null-Byte abgeschlossen. "return" erfolgt dann mit dem Wert 0. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3IOCV \f1 .DE .ft B NAME .ft R .IP iocv - konvertiert eine Integer-Zahl in eine Zeichenkette .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L iocv (i) int i; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Integer-Zahl i wird mittels der Funktion itoa in eine Zeichenkette konvertiert. Das Ergebniss wird in einem internen statischen Bereich gespeichert, dessen Adresse durch "return" zur\o'u"'ckgegeben wird. .RE .sp 1 .ft B SIEHE AUCH .ft R .IP itoa () .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3ITOA \f1 .DE .ft B NAME .ft R .IP itoa - konvertiert 16-Bit Integerzahl in Zeichenkette .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L itoa (i, str) int i; char *str; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Integer-Zahl i wird in eine 7 Byte lange Zeichenkette konvertiert und in dem durch str adressierten Feld gespeichert. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3LENGTH \f1 .DE .LP .ft B NAME .ft R .IP length - ermittelt die L\o'a"'nge einer Zeichenkette .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L length (str) char *str; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Es wird die Anzahl der Bytes einer Zeichenkette, mit Ausnahme des die Kette abschliessenden Null-Bytes, ermittelt und durch "return" zur\o'u"'ckgegeben. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3OATOI \f1 .DE .ft B NAME .ft R .IP oatoi - konvertiert eine Zeichenkette, die eine Oktalzahl darstellt, in eine Integer-Zahl .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L oatoi (str) char *str; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP oatoi konvertiert die Zeichenkette str, die nur oktale Ziffern und kein Vorzeichen enthalten darf, in eine 16-Bit Integer-Zahl. Die Konvertierung wird beendet, sobald ein Zeichen ungleich einer Oktalziffer erkannt wird. Der konvertierte Wert wird durch "return" zur\o'u"'ckgegeben. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3PAD \f1 .DE .ft B NAME .ft R .IP pad - f\o'u"'llt eine Zeichenkette mit Leerzeichen auf .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L pad (str, l) char *str; int l; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP pad f\o'u"'llt die Zeichenkette str vom Null-Byte an bis zum Erreichen der l-ten Position mit Leerzeichen, vorausgesetzt, l ist gr\o'o"'sser als die L\o'a"'nge der Zeichenkette. Erf\o'u"'llt l diese Bedingung nicht, wird die Kette nicht ver\o'a"'ndert. pad wird durch den Aufruf von pmove (str, str, l, ' ') realisiert. .RE .sp 1 .ft B SIEHE AUCH .ft R .IP pmove () .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3PMOVE \f1 .DE .ft B NAME .ft R .IP pmove - transportiert eine Zeichenkette und f\o'u"'llt auf .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L char *pmove (str, b, l, c) char *str, *b, c; int l; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP pmove transportiert die Zeichenkette str in den Speicherbereich b. Dabei werden genau l Bytes \o'u"'bertragen. Ist die Zeichenkette l\o'a"'nger, wird abgeschnitten, ist sie k\o'u"'rzer, wird ab Nullbyte mit dem Zeichen c aufgef\o'u"'llt. .RE .lP ------------------------------------------------------------ .sp 2 .DS C \f3PRARGS \f1 .DE .ft B NAME .ft R .IP prargs - protokolliert die Argumente einer Kommandozeile .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L prargs (pc, pv) int pc; char **pv; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP prargs protokolliert \o'u"'ber Standardausgabe die Argumente einer Kommandozeile (main(argc, argv)). Dabei werden Sonderzeichen (Zeichen, deren oktaler Code zwischen 040 und 0177 liegt) als Oktalzahl protokolliert. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3SCOMPARE \f1 .DE .ft B NAME .ft R .IP scompare - vergleicht zwei Zeichenketten .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L scompare (stra, la, strb, lb) char *stra, *strb; int la, lb; .DE .RE .sp 1 .ft B BESCHREIBUNG .tf R .IP Zwei Zeichenketten stra und strb werden auf der Basis ihres ascii-Codes verglichen. Die Anzahl der zu vergleichenden Zeichen wird durch la bzw. lb definiert. Die Zeichenkettenl\o'a"'ngen sollten mindestens so gross, wie die angegebenen Vergleichsl\o'a"'ngen la und lb sein, andernfalls wird als Vergleichswert das Nullbyte benutzt. Werden die L\o'a"'ngen la und lb mit dem Wert Null angegeben, so wird daf\o'u"'r automatisch ein Maximalwert (32767) benutzt. Ebenso wird, falls la und lb ungleich sind f\o'u"'r die Kette mit der kleineren Vergleichsl\o'a"'nge das Nullbyte zum Vergleich benutzt. Leerzeichen werden \o'u"'bergangen. IP return: 8 -1 stra < strb .br 0 stra = strb .br 1 stra > strb .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3SEQUAL \f1 .DE .ft B NAME .ft R .IP sequal - testet zwei Zeichenketten auf Gleichheit .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L sequal (stra, strb) .br char *stra, *strb; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Zwei Zeichenketten stra und strb werden auf absolute Gleichheit getestet. "return" erfolgt mit 1 bei Gleichheit, sonst mit 0. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3SMOVE \f1 .DE .ft B NAME .ft R .IP smove - Zeichenkette transportieren .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L smove (str, b) .br char *str, *b; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Zeichenkette str wird zum Block b transportiert. "return" erfolgt mit der L\o'a"'nge der transportierten Zeichenkette. .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3SYSERR \f1 .DE .ft B NAME .ft R .IP syserr - Systemfehlermitteilung und Abbruch .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L syserr (ptr) char *ptr; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP syserr liefert eine Fehlermitteilung \o'u"'ber Standardausgabe und bricht im Normalfall durch Aufruf der Funktion exit ab. Argumente f\o'u"'r syserr sind in der gleichen Form wie bei printf anzugeben. Sie sind allerdings in ihrer Anzahl auf 5 beschr\o'a"'nkt. syserr unterscheidet zwei Aufrufarten: .RS .IP 1. der erste Parameter ist Null (die folgenden Parameter wie bei printf), dann wird genau die printf Funktion realisiert. .IP 2. Der erste Parameter ist nicht Null (also alle Parameter wie bei printf), dann wird mit Hilfe der externen Variablen char *Proc_name und int erron, Acceerror eine erweiterte Fehlerprotokollierung realisiert (UNIX error, ACCESS METHOD error, mit Angabe einer Fehlernummer und eventuell vorangestelltem Programmnamen). .RE .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3XPUTCHAR \f1 .DE .ft B NAME .ft R .IP xputchar - Zeichenausgabe \o'u"'ber Standard-output .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L xputchar (c) .br char c; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP xputchar \o'u"'bertr\o'a"'gt alle Zeichen mit Ausnahme derer, deren oktaler Code gr\o'o"'sser als 040 und kleiner als 0200 ist (Sonderzeichen) mittels der Funktion putchar zur Standardausgabe. Sonderzeichen werden mittels printf als Oktalzahl zur Standardausgabe geleitet. Diesen wird das Zeichen "\\" vorangestellt. .RE .sp 1 .ft B SIEHE AUCH .ft R .IP printf (), putchar() .RE .LP ------------------------------------------------------------ .sp 2 .DS C \f3ZTACK \f1 .DE .ft B NAME .ft R .IP ztack - Zeichenkettenverkn\o'u"'pfung in einem Puffer .RE .sp 1 .ft B SYNOPSIS .ft R .IP .DS L char *ztack (stra, strb() .br char *stra; char *strb; .DE .RE .sp 1 .ft B BESCHREIBUNG .ft R .IP Die Zeichenketten stra und strb werden in einem statischen Pufferbereich zu einer Zeichenkette verbunden. "return" erfolgt mit der Anfangsadresse des Puffers. Bei Puffer\o'u"'berlauf wird mittels Funktion syserr der Fehlersachverhalt "ztack overflow" nebst Pufferinhalt mitgeteilt. Der Puffer fasst maximal 100 Zeichen, wobei das Programm so angelegt ist, das erst nach dem Umspeichern der Zeichenkette in den Puffer auf \o'U"'berlauf getestet wird. Ein rekursiver Aufruf von ztack ist m\o'o"'glich (ztack(ztack(x, y), z)). .RE .sp 1 .ft B SIEHE AUCH .ft R .IP syserr () .RE