-----------------------------------------------------------
DLibs -> XDlibs
nderungen von Holger Weets, Christian Wempe & Frank Specht
Anmerkung: an dieser Datei wird nur gelegentlich, und wenn,
           dann in aller Eile geaendert, es koennen somit
           einander widersprechedne Teile enthalten sein
-----------------------------------------------------------
- Die Funktion 'crystal' wurde entfernt, da sie bei Verwendung der GEMFAST-
  Bibliothek nicht notwendig ist.
- einige weniger oft verwendete Funktionen aus den XDLibs wurden in eine
  neue Bibliothek verschoben, so dass die XDLibs jetzt kuerzer sind
  (besonders fuer Ramdisk-Benutzer interessant) und das Linken schneller
  ist (der Linker hat weniger Symboltabellen zu untersuchen)
  Es sind dies u.a.:
   system, exec, die *fork* Funktionen, die Sortier-Funktionen, entab,
   detab, ostrap, die Profiling-Sachen, der Online-Debugger etc.
  Diese neue Bibliothek trgt den Namen 'EXTENDED.LIB'


Einige Funktionen wurden in Assembler neu implementiert:
--------------------------------------------------------
   STRSTR   STRLEN   STRCPY   STRNCPY  STRNCAT  STRUPR   STRCMP
   STRNCMP  STRPOS   STRRPOS  STRRCHR  MEMMOVE  STRCAT   STRLWR
   ATOI     ATOL     STRNICMP STRICMP  BZERO    STRDUP   CTLCNV
   STRADJ   MEMCHR   MEMCMP   MEMICMP  MEMSET   STRSET   STRNSET
   STRPCPY  MEMCCPY  LMEMMOVE SUBSTR   SUBNSTR  STRTOK   STRTRIM
   ITOA     LTOA     ULTOA    STRSPN   STRISTR  FPRINTF  VFPRINTF
   PRINTF   VPRINTF  STRRPL   STRIRPL  QSORT    HSORT    SWAB
   LMEMCPY  STRREV   STRRPBRK STRPBRK  STRCSPN

Autoren: Christian Wempe, Amiga & Holger Weets, Atari;

Anmerkungen: - Fr qsort() wird KEIN Buffer mehr bentigt, da Anlegen der
               globalen Variablen '_qbuf' entfllt somit.
             - lmemcpy & memcpy   sind eine Funktion mit 2 Einstiegspunkten
             - lmemmove & memmove                  -"-
             - strstr & stristr                    -"-
             - strrpl & strirpl                    -"-
             - read & lread                        -"-
             - write & lwrite                      -"-
             - die Funktion chdir() ist ein Direkt-Aufruf der entsprechenden
               GEMDOS-Funktion, und kann somit auch nicht mehr als diese.
               Sie wurde aus Kompatibilitts-Grnden nicht verbessert.

             - Die Funktion calloc() wurde aus der Datei MALLOC.C entfernt
               und in eine eigene Datei verschoben. Bei Nicht-Verwendung von
               calloc() wurde diese bisher trotzdem gelinkt, dies ist jetzt
               nicht mehr der Fall.

             - bisher befanden sich die Funktionen open() und close() in der
               selben Datei. Da close() von fclose() aufgerufen wird, und
               diese Funktion wiederum von _main() (wird auer bei ACC's
               immer gelinkt), wurde auch open() immer gelinkt, auch wenn
               sie nicht verwendet wurde. Von dieser Funktion wiederum wurden
               access(), lseek() und creat() gelinkt (IMMER!) ...

             - die in den XDLibs enthaltene Funktion initargs liest die
               Kommandozeile jetzt nur noch nach dem Standard-Verfahren.
               Wer den ursprnglichen Funktions-Umfang wnscht (liest auch
               nach XARG-Verfahren, welches jedoch meines Wissens von
               niemandem verwendet wird), der verwende stattdessen die bei-
               liegende Datei INITXARG.O (einfach vor den XDLibs dazulinken)

             - bei Verwendung von cprintf() reicht jetzt (wie bei printf()
               auch) ein einfaches '\n' fr ein Newline, da diese Funktion
               jetzt per cputc (siehe unten) ausgibt. Das lstige "\r\n"
               entfllt somit.
               Gleiches gilt fr die Funktion cputs().

             - fr den neuen Optimizer (V2.00x*) wurden die Funktionen
                  strcmp()    strcpy()    strcat()    strlen()
                  strchr()    strrchr()   stricmp()   strlwr()
                  strupr()    strrev()    strpos()
               so umgeschrieben, da sie schneller (und teilweise lnger)
               sind als vorher, und ihre Parameter in Registern anstatt
               auf dem Stack erhalten.
             - die Funktion Ftell() befand sich nicht im Archiv, obwohl der
               Quelltext vorhanden war -- ergnzt
             - es sollte sich jetzt kein Modul mehr in den XDLibs befinden,
               welches eines der Symbole 'gemdos', 'bios' oder 'xbios'
               referenziert. Falls doch, zustzlich die 'extended.lib'
               linken (nach den XDLIBS) und schon tut's wieder

Ebenfalls neu geschrieben wurden:
----------------------------
   STRTOL   STRTOUL  TOUPPER        TOLOWER     MKDIR    RMDIR    REMOVE
   CHDIR    CLOCK    START_TIMER    TIME_SINCE  CHMOD    WRITE    LWRITE
   READ     LREAD    GETW           GETL        PUTW     PUTL     ACCESS
   FSIZE    STAT
von Holger Weets.

Die Funktionen gemdos(), bios() und xbios() wurden aus den Startup's ent-
fernt und unter dem Namen 'ostrap.o' in die XDlibs aufgenommen. Der Grund
hierfr ist, da der Compiler (HCC) jetzt keine Aufrufe dieser Funktionen
mehr erzeugt, sondern direkt die 'trap' - Instruktionen generiert, was sowohl
krzer als auch mehr als doppelt so schnell ist.

Nach und nach werde ich immer mehr der sonstigen XDLibs - Funktionen neu
bersetzen, damit sie
   a) krzer werden wegen
      - neuer HCC (traps)
      - neuer TOP (mehr Optimierung)
   b) an den neuen Symbol-Tabellen-Standard (V2.0*) angepasst werden
      (beliebig lange Namen)


Neu in die DLibs aufgenommen wurden die Funktionen:
---------------------------------------------------
void (*_userexit)()
   Dieser Zeiger auf eine Funktion kann vom Programm jederzeit mit
   einem Wert belegt werden. Die Funktion exit() prft diesen Wert
   und falls er nicht 0 ist, wird die Funktion aufgerufen, auf die
   <_userexit> zeigt. Praktisch, um z.B. Dateien noch zu schliessen,
   temporre Dateien zu lschen oder Vektoren wieder gerade zu biegen.
   exit() wird von main() brigens automatisch aufgerufen.

void ChkAbort()
   Testet, ob Ctrl-C gedrckt wurde und ruft ggfls. exit() auf. Auerdem
   wird die Zeichenkette "^C" auf den Bildschirm ausgegeben.

int cputc(char c)
   Das Zeichen <c> wird auf die Console ausgegeben (per Bconout(2, c)).
   Falls das Zeichen '\n' ist, so wird auerdem ein '\r' ausgegeben.
   Diese Funktion wird von cprintf() und cputs() verwendet.

char *detab(char *string, int tabsize)
   Alle Tabs in string werden durch Spaces ersetzt, wobei als Tabulator-
   weite tabsize angenommen wird.

char *entab(char *string, int tabsize)
   Alle Spaces in string werden durch Tabs ersetzt, wobei als Tabulator-
   weite tabsize angenommen wird.

void memswap(char *p1, char *p2, int len)
   Die Speicher-Bereiche ab p1/p2 werden vertauscht, und zwar len Bytes.

int strwrap(char *dest, char *src, int len)
   Der String src wird auf eine max. Lnge von len gebracht, wobei bei
   Blanks getrennt wird. Dieser Bereich wird nach dest kopiert und aus src
   gelscht.
   Zurckgegeben wird die neue Lnge von src.

int strcstrp(char *string, char ch)
   Alle aufeinanderfolgenden Vorkommen von ch in string werden entfernt.
   Beispiel: strcstrp("Hallo       Welt", ' ') wird zu "Hallo Welt".
   Zurckgegeben wird die neue Lnge von string.

char *strdcat(char *str1, char *str2)
   Alloziiert per malloc() soviel Speicher, wie fr die Aufnahme beider
   Strings notwendig ist, und schreibt sie hintereinander in diesen.

char *strvcat(anz, dest, src1, src2, ..., srcN)
   Die Strings src1 - scrN werden nacheinander in dest kopiert.
   Beispiel: strvcat(5, p, "Dies ", "ist ", "ein ", "Test"); in <p> stehe
             bereits: "Ausgabe: ";
   ergibt "Ausgabe: Dies ist ein Test"
   Der Parameter anz gibt dabei die Anzahl ALLER noch folgenden Parameter an.

char *strvcpy(anz, dest, scr1, scr2, ..., scrN)
   Die Strings src1 - scrN werden nacheinander in dest kopiert.
   Beispiel: strvcat(5, p, "Dies ", "ist ", "ein ", "Test"); in <p> stehe
             bereits: "Ausgabe: ";
   ergibt "Dies ist ein Test" (OHNE "Ausgabe: ", weil berschrieben wird!!!)
   Der Parameter anz gibt dabei die Anzahl ALLER noch folgenden Parameter an.

int strblk(char *str, int len)
   Formatiert <str> auf Blocksatz mit Lnge <len>.
   Zurckgeliefert wird ein Wert <>0, falls alles geklappt hat

char *basename(char *path)
   Liefert einen Zeiger auf das dem letzten Backslash folgende Zeichen.
   Falls <path> also einen Dateinamen enthlt, so liefert basename() einen
   Zeiger auf diesen. Falls <path> berhaupt keinen Backslash enthlt, so
   liefert die Funktion einen Zeiger auf das erste Zeichen von <path>, also
   wieder einen Zeiger auf den Dateinamen. Falls <path> mit einem Backslash
   endet, wird ein Zeiger auf des Stringende zurckgegeben.

char *suffix(char *path)
   Liefert einen Zeiger auf die Endung (Extension, Suffix) des uebergebenen
   Argumentes (Dateiname mit/ohne Pfad). Der Zeiger steht AUF dem '.'
   Falls die Datei keine Endung enthlt, steht der Zeiger auf dem String-
   Ende, also dem 0-Zeichen.

void cwd(char *path)
   Liefert in <path> den aktuellen Zugriffspfad zurck. Das Ergebnis ist das
   gleiche, wie von getcwd(), blo
   - ist cwd() krzer
   - liefert cwd() den Pfad in Grobuchstaben, und nicht, wie getcwd(), in
     Kleinbuchstaben.

int index(char *str, char c)
   Wie strpos, aus Kompatibilits-Grnden.

int rindex(xhr *str, char c)
   Wie strrpos, aus Kompatibilits-Grnden.

prof.o; Funktionen fr das im Compiler eingebaute Profiling; enthlt:
   void _prolog(char *name)
      wird am Anfang jeder Funktion aufgerufen, <name> ist der Name der
      Funktion
   void _epilog(char *name)
      wird am Ende jeder Funktion aufgerufen, <name> ist der Name der
      Funktion
   void _savepro()
      wird direkt vor Programm-Ende (von __exit()) aufgerufen und speichert
      die Profiling-Tabelle in einer Datei Namens 'PROF.OUT'. Funktioniert
      nur dann automatisch, wenn der zugehrige Startup-Code verwendet wird
      (prof_s.o).

Als Zugabe gibt's dann noch die Datei 'initarg.o'. Diese Datei ist fr all
diejenigen gedacht, die Programme mit Parameter-bergabe schreiben (also
argv[] und argc in main() benutzen) und trotzdem auf die Behandlung des
XARG-Standards verzichten knnen (benutzt den berhaupt jemand ???) Als
Belohnung fr den Verzicht gibt's dann auch Programme, die ber 500 Bytes
krzer sind, als vorher(!) Einfach wie gewohnt mit STD_S.O als Startup linken
und zustzlich VOR den DLibs die Datei INITARG.O linken (damit nicht die
Version aus den DLibs verwendet wird).
(nur Atari)

Amiga-Version von Christian Wempe
ST-Version von Holger Weets

