home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / c / sozobon / sozbin14.zoo / sozdistr / doc / binary.doc / hcc.chg < prev    next >
Encoding:
Text File  |  1995-09-08  |  35.9 KB  |  848 lines

  1. hcc 2.00 eXtended Version
  2. known bugs not fixed:
  3. ----------------------------------
  4.  
  5.     char chr;
  6.     ...
  7.     test(chr = 1)
  8. compiles to:
  9.     (move.w #1, <chr>)
  10. what maybe will overwrite another variable or cause an exception:
  11.    address error (if <chr> is not even)
  12.  
  13. ----------------------------------
  14.  
  15.  
  16.    assignment from pointer to integer value produces error
  17.      "pointer not allowed". Shouldn'd it work? Example:
  18.      char *p, *fun();
  19.      int i;
  20.      i = p;        /* "error: pointer not allowed" */
  21.      i = fun();        /* "error: pointer not allowed" */
  22.  
  23. ----------------------------------
  24. last modifications - by Volker Seebode - 
  25. version/patchlevel x34
  26. Tue Aug 29 1995
  27.  
  28.     - "volatile" and "const" weren't parsed inside struct/enum - fixed
  29.     - "volatile" and "const" weren't parsed inside casts - fixed
  30.     - var or parm decl like "char * const * p" weren't parsed - fixed
  31.     WARNING: "volatile" and "const" are parsed only without any effekt
  32.     - bus error occured after message
  33.  "arg N: passing int from pointer lacks a cast (loosing significant bits) for"
  34.        (pointer arg passed by integer with size < 4) - fixed
  35.      - passing int for proto short caused a bus error using long ints
  36.        ("hcc -L" or "cc -mlong" respectively) - fixed
  37.      - __STDC__ was not internally defined, now it is
  38.      - the "#pragma" option "PTY" didn't work - fixed
  39.      - include file names aren't made lowercase any more
  40.      - switch labels with long switch vars got overwriten by an sprintf() - fixed
  41.      - error messages reflecting prototypes now include
  42.        file and line of prototype declaration
  43.      - prototype/arg checking now works on structures too     
  44.      - new flag "-F[no]-size-t-long" setting the type returned by the sizeof
  45.        operator to "unsigned long" (default: unsigned int).
  46.        WARNING: you need TOP pl>24 and a special lib (called libct.a)
  47.        to use this option!
  48.      - int default parms not explicit declared ( fun(intparm){ ... } )
  49.        got storage class extern -> fixed
  50.      - bug in general code generation function `_addcode()' fixed
  51.      - '#' statements inside the false branch of an '#if'-statement were processed
  52.        anywhere on a line, even inside comments -> fixed
  53.      - added warning for static function definition following non static decl
  54.     
  55. last modifications - by Volker Seebode - 
  56. version/patchlevel x33
  57. Wed Aug 1 1995
  58.  
  59.     function prototypes implemented.
  60.     New options:
  61.      -F[no-]proto: [don't] use prototypes for type checking, also
  62.       accessible via `#pragma PTY'.
  63.       default: use prototypes.
  64.      -WNPR: complain call of functions w/o prototype, also accessible via
  65.       `#pragma NPR'. If prototyping is disabled, -WNPR is set to false.
  66.       default: don't warn if call to function w/o prototype is detected.
  67.     `__STDC__' is internally defined with value 0 if prototype checking is ON
  68.     variables are distinguished from macros with same name, for example:
  69.         #define key(a)    ((a)*4)
  70.         int key;
  71.       works. `key' is handled as macro only if there are argument(s) following, else
  72.       it references the var `key'.
  73.  
  74. version/patchlevel x32
  75. Sat Jun 24 1995
  76.  
  77.     const expressions were not unfolded completely. That's why complex macros
  78.         couldn't be calculated during expansion and produced the error
  79.         message "bad INIT expression". Fixed
  80.     code for auto struct/union/array initialization was missing, added
  81.     bitfield initialization was broken, fixed
  82.     bug in assignment from signed bitfields fixed
  83.     casted pointers with postinc/postdec are accepted now and handled correctly
  84.     the `?' Operator didn't work on pointers and double vars, fixed
  85.     test of double vars (e.g. "if (double_var)") was broken, fixed
  86.     assignement in function parameter passing didn't work with double vars, fixed
  87.     ' inside comments and excluded lines was processed for character constants
  88.         (error "char-const overflow"), fixed
  89.     /* inside comment is complained if nested comments are disabled
  90.     changed -f option to -F
  91.  
  92. last modification - by jerry geiger - 
  93. version/patchlevel x31
  94. APR 26 1995
  95.  
  96.     bug in out-file-name generation fixed
  97.     bug with func decls in structures fixed
  98.     new cml/pragma option -IFD (implicit decl fun)
  99.  
  100. PL 30
  101.     func decls without IDs should work now everywhere
  102. PL 29
  103.     function pointers are handled like function names now always
  104.         and in every context like: v = x->y.z(args);
  105.     no more limits to define '-D' options in commandline
  106.     warnings if undefining an undefined macro
  107.  
  108. version/patchlevel x28
  109. MAR 26 1995
  110.     - debug symbols changed (generated with -X option)
  111.     - less memory when including header files
  112.  
  113. last modifications - by Volker Seebode - 
  114. version/patchlevel x27
  115. Sun Jan 15 1995
  116.     - the flags '-fdouble-reg-vars', '-ffloat-args' and
  117.       '-fframe-relative' were handled inverted -> fixed.
  118.     - detection of alloca() was buggy: any function name beginning with
  119.       'alloca' triggered A6-relative restoring of regs.
  120.  
  121. version/patchlevel x26
  122. Sat Dec 24 1994
  123.     changed code generation for switch tables (compiled with -DLABELDIFF):
  124.     '.dc.w Lxxx' -> '.dc.w Lxxx-Lyyy'.
  125.     
  126.     WARNING: you need TOP Patchlevel >= #21 and JAS Patchlevel >= #10
  127.              for this version of HCC!
  128.     
  129. version/patchlevel x25
  130. Mon Nov 07 1994
  131.  
  132.     floating point:
  133.     - fixed inherit()/rinherit() to copy double val
  134.     - new options:
  135.     -fdouble-reg-vars: put register double vars into regs if possible
  136.                         (default: ON)
  137.     -ffloat-args:    pass float args as floats (default: OFF)
  138.     -fframe-relative:restore regs A6 relative (default: OFF)
  139.         Specifying this option works for all inputfiles.
  140.         It is also activated for the next (or current) function,
  141.         if a call to alloca() is detected or
  142.         by the #pragma-statement "FRL".
  143.     
  144.     These flags may be inverted by inserting "no-",
  145.             WARNING: you need TOP Patchlevel >= #22 to use this option!
  146.     e.g. -fno-double-reg-vars.
  147.  
  148. version/patchlevel x24
  149. Mon Oct 03 1994
  150.  
  151.     floating point:
  152.     - implemented IEEE double precision with 64 bit
  153.  
  154.     - added exit code for functions changing the stack pointer
  155.       (by calling alloca()...) to make register variables possible.
  156.  
  157.     WARNING: you must have TOP Patchlevel >= #19 to use these features!
  158.  
  159. version/patchlevel x23
  160. Sun Sep 25 1994
  161.  
  162.     bitfields:
  163.     - changed code generation
  164.     - long bitfields implemented ( unsigned long foo : 25; )
  165.     - default order reversed (first bit = MSB)
  166.  
  167.  
  168. last modifications - by jerry g geiger - 
  169.  
  170. version/patchlevel x22
  171. Thu Sep 22 1994
  172.  
  173.     adding something to a void * pointer will generate an error message
  174.     now - better than causing an exception during runtime ;-)
  175.  
  176.     comparing an unsigned to a signed value will cause a warning
  177.         unless switched off by -W-CUS
  178.  
  179.     adding something to a void * pointer will cause a warning, cause
  180.         actually nothing is added (void has length 0!)
  181.  
  182.  
  183. version/patchlevel x21
  184. Sep 15 1994
  185.  
  186.     bug with mixing up 'lsr' and 'asr' instructions and unsigned
  187.     shorts and shorts fixed.
  188.  
  189. version/patchlevel x20
  190. Sep 09 1994
  191.     longs in switch/case should be handled correctly now.
  192.     $ACE environment variable forces hcc to use handle -1 for stderr
  193.         (cause ACE can't handle such things)
  194.     __GDATE__ and __SDATE__ macros fixed.
  195.     a bug occuring with pointer addition/sub sometimes fixed
  196.          (resulting in a 'asr.w' instruction instead of 'asr.l') 
  197.  
  198. version x19
  199. Jul 29 1994
  200.     especially for Holger :
  201.     you can switch off the bad return value/type warnings now
  202.     -W-BRV / #pragma -BRV
  203.  
  204.     the commandline syntax changed a little bit
  205.     (see man file or 'hcc -h')
  206.  
  207. version x17
  208. Jul 04 1994
  209.     bug fixed:
  210.        auto cast of negative short constants to long
  211.  
  212. Jun 13 1994
  213.     the meaning of $INCLUDEDIR changed a little bit:
  214.         it replaces now the built in pathes with
  215.         '${INCLUDEDIR}\sozobonx' and $INCLUDEDIR
  216.     &array is allowed for type checking now
  217.     calling a function via pointer (*func)() should work with
  218.      func(); now, too
  219.     buildin macros changed according to standard
  220.     accepts '/' in include pathes
  221.     ipc'ed files' timestamps are tested now, the newer one is included
  222.     diagnostic output is always written to stderr now
  223.     a man file exists now
  224.     some minor bugs fixed
  225.     $SOZOBONCNF isn't recognized/supported any longer
  226.  
  227. version x15
  228. Apr 19 1994
  229.     #pragma option 'echo' built in:
  230.     '#pragma echo ...' will echo the rest of the line to stderr
  231.     
  232. bug fixes:
  233.     local enum declarations work now (no more bus errors)
  234.     missing #endif's are errors for TRUE #if's now, too
  235.     comparing to 0 should work under all circumstances now
  236.     (there was an error in cast routines)
  237.  
  238.     
  239. version x14
  240. Mar 15 1994    file date: March 23 1994
  241. integer constants:
  242.     should now handled as provided by ANSI:
  243.     Constants are never negativ (except ones prefixed by a '-')
  244.     Hex and octal constants are always unsigned.
  245.     Constants are of the smallest type they fit in.
  246.     
  247.  
  248. version x13
  249. Mon Mar 7 1994
  250.  
  251. integer constants:
  252.     cause stil some problems; a hexadecimal one with leading '0's as
  253.     '0x0000FFFF' is of type long now.
  254.     The handling of constants is still not as provided by ANSI standard.
  255.     Hex and octal constants are not unsigned by default.
  256.     Any constants may become negative, if they don't have a suffix 'U'!
  257.     This is an error, of course. I'll try to fix it.
  258.  
  259. new #pragma option:
  260.     #pragma [+|-]PMR
  261.     switch on/off warning 'probably missing return' 
  262.  
  263. changed macro:
  264.     SOZOBON 
  265.     It has the value of 0x200, as the originals' version number;
  266. new macros: 
  267.     __SOZOBONX__ 
  268.     Is defined for our eXtended version of Sozobon C compiler, it
  269.     will keep the version number of eXtended SOZOBON version as:
  270.     0x200 + our revision number (0x213 for current version).
  271.     __MSHORT__
  272.     Is TRUE if int is a 16 Bit value. (Undefined with -L option).
  273.  
  274. version x12
  275. Mon Feb 28 1994
  276. integer constants:
  277.     hex and octal constants tend to be unsigned now, a hexadecimal one,
  278.     with leading '0's as '0x0000FFFF' is of type long now.
  279.     There is still an error in handling of constants - sorry - comparing
  280.     of two constants can produce wrong code.
  281.  
  282. Arrays larger than 32K should be handled correctly now.
  283.  
  284. Environment:
  285.     SOZOBONCNF=
  286.     "standard": DATE in __DATE__ macro will be of format MM/DD/YY
  287.         else it it will be DD.MM.YY
  288.     "devconout": diagnostic output will not be written to STDERR/Gemdos
  289.         console handle but to BIOS console device
  290.  
  291. function handling:
  292.     A non void declarated function now will cause a warning, if there is
  293.     no return value specified; this works of course the other way round,
  294.     too. 
  295.     A warning will be generated, if hcc cannot decide wether the
  296.     specified return statements will return always some correct value.
  297.  
  298. Bugs fixed:
  299. A 'switch' without a case-block now won't force hcc to an exception
  300. any more. I hope so.
  301.  
  302.  
  303. version x11
  304. Sun Dec 19 1993
  305. Environment:
  306.     SOZOBONCNF=
  307.     List of comma seperated strings:
  308.     "standard" diagnostic output will not go to BIOS console device
  309.         handle but to STDERR/Gemdos console
  310.  
  311.     STDERR=
  312.     If this variable exists diaginstic output will go to Gemdos handle 2
  313.         and not to Gemdos console handle.
  314.  
  315. Macros:
  316.     new macro __CDATE__ implemented; it represents a date-string of the
  317.     format "Mon DD YYYY"
  318.  
  319. commandline Options:
  320.     -v: be verbose
  321.     -V: print complete Version info
  322.  
  323. Bugs fixed:
  324. The error when reading a function declaration like 
  325. 'int main( int argc, char *argv[])' is fixed. (The error was mixing up
  326. the type of array with the pointer's type.)
  327.  
  328. Bugs kept:
  329. A 'const' statement may still cause some trouble, so better '#undef const'
  330. in your source code.
  331.  
  332. ----
  333. Änderungen an HCC V2.0, modifizierte Version 2.00x10
  334. von Holger Weets (Atari(/Amiga)), Christian Wempe (Amiga(/Atari))
  335. und Detlef Wuerkner (Amiga(/Atari))
  336. Stand: 20.04.93
  337.  
  338.  
  339. Erstmal die schlechten Nachrichten:
  340.  
  341. An der Original Version 2.0 des Compilers hat sich praktisch kaum etwas ver-
  342. ändert, somit sind wir verantwortlich für alle Fehler, die mit der neuen
  343. Version auftreten, und mit der alten nicht. Natürlich können wir dafür aber
  344. nicht haftbar gemacht werden, die Benutzung erfolgt auf eigene Gefahr.
  345. Jeder Benutzer erkennt dies mit dem ersten Starten des Programmes an.
  346.  
  347. Folgende Fehler sind aktuell bekannt:
  348. -------------------------------------
  349. - funktion(char_variable = integer_konstante)
  350.         führt zu einer Zuweisung an <char_variable> auf Wortbreite (!),
  351.         was entweder in einem Adress-Fehler endet (3 Bomben) oder zu
  352.         einem (teilweisen) Überschreiben der nächsten Variablen
  353.  
  354. Und jetzt all die guten Nachrichten:
  355.  
  356.  
  357. Updates:
  358.    - x1 -> x2:
  359.       Option '-Q' eingebaut. Bewirkt, daß der Compiler schnelleren Code
  360.       erzeugt, auch wenn dieser das Programm länger macht.
  361.       Code-Erzeugung bei Struktur-Zuweisungen geändert:
  362.          - bei '-Q' erzeugt XCC max. 15 move's, ohne max. 3
  363.          - Erzeugung von move-Listen bei Strukturen, deren Länge nicht durch
  364.            4 teilbar ist, verbessert. Code ist hier jetzt schneller UND kürzer.
  365.  
  366.    - x2 -> x3:
  367.       Erzeugung von 'switches' wesentlich verbessert; der erzeugte Code ist
  368.       jetzt i.A. sowohl schneller als auch kürzer.
  369.  
  370.    - x3 -> x4:
  371.       - der Compiler teilt dem TOP jetzt mit, dass er die erweiterte Version
  372.         ist, und somit laeuft TOP jetzt auch mit anderen (alten) Versionen
  373.         des Compilers anstandslos zusammen
  374.       - neues 'pragma' Argument 'FST' schaltet die '-q' Option ein/aus
  375.       - neues 'pragma' Argument 'TOP' schaltet den TOP Funktionenweise ein/aus
  376.       - neues 'pragma' Argument 'OPT' uebergibt den nachfolgenden String an
  377.          TOP als neue Optionen
  378.       - Pointer-Vergleiche, bei denen ein 'viod *' beteiligt ist, liefern
  379.         jetzt keine Warnung des Compilers mehr
  380.       - Fehler beim scannen der CPP-Tokens behoben
  381.       - trap's werden nur noch generiert, wenn die Option '-L' nicht angegeben
  382.         wurde
  383.  
  384.    - x4 -> x5:
  385.       - es werden jetzt spezielle Sprungtabellen erzeugt, die nur halb so
  386.         lang sind, wie die alten; allerdings lassen sich so erzeugte
  387.         Assemblerfiles auch nur noch mit dem von mir modifizierten JAS V2.00x1
  388.         uebersetzen...
  389.  
  390.    - x5 -> x6:
  391.       - Float-Fehler aus V2.00x5 wieder ausgebaut...
  392.       - noch weiter optimiert
  393.       - mit der neusten Version des TOP übersetzt
  394.       - die includierten Files werden jetzt mit ausgegeben
  395.       - das String-Merging funktioniert jetzt auch im Zusammenhang mit
  396.         CPP-Konstanten, ist somit jetzt endlich vollständig implementiert
  397.       - C++ - Kommentarzeichen implementiert ('//', Kommentar bis Zeilen-
  398.         ende)
  399.       - wieder in HCC umbenannt, weil die veränderte Versionsnummer und
  400.         die Info-Zeile bereits eindeutig zeigt, daß es sich um eine
  401.         modifizierte Version des Compilers handelt (schliesslich haben wir
  402.         den Optimizer ja auch nicht umbenannt, obwohl wir den quasi neu-
  403.         geschrieben haben)
  404.  
  405.    - x6 -> x7:
  406.       - Option '-X' für Debugging implementiert (s.u.)
  407.       - aeusserst aergerlichen Fehler entfernt, der falsche movem - Anweisungen
  408.         bewirkte; solange mit TOP uebersetzt wurde, machte er sich nicht
  409.         bemerkbar, und auch ansonsten trat er nur in einem Spezialfall auf,
  410.         aber dann....
  411.       - hcc kann jetzt auch float's und double's wieder in Registern halten;
  412.         V1.21 konnte dies bereits, aber aus V2.00 scheint es ausgebaut
  413.         worden zu sein, ohne das es hierfuer einen Grund gibt...
  414.  
  415.    - x7 -> x8:
  416.       - optimiert
  417.       - es werden jetzt auch short's registert...
  418.       - "__TOS__" ist jetzt WIRKLICH vordefiniert
  419.       - bessere TOP-Unterstützung
  420.       - Fehler-Erholung bei CPP-Errors verbessert
  421.       - ST-Version: Stack groesser gemacht; fuer 'normale' Quelltexte
  422.         reichte der alte auch (ich habe damit noch nie Probleme gehabt),
  423.         aber es scheint auch Texte zu geben, die den hcc zu sehr tiefer
  424.         Rekursion zwingen und bei solchen ist er schon mal abgestuerzt.
  425.       - ST-Version: falls die Fehlermeldungen des Compilers auf den
  426.         Bildschirm ausgegeben werden, erscheinen sie jetzt auch wieder
  427.         untereinander (vorher wurde nur ein NL ausgegeben, was für
  428.         Dateien und C-Desk's Console Fenster auch reicht)
  429.       - es gibt ein neues Programm fuer das SOZOBON-System, den IPC
  430.         (Includefile PreCompiler), geschrieben von mir (Holger) und
  431.         portiert auf den Amiga von Christian (wem sonst ?) und mir
  432.         Dieses Programm wird von hcc jetzt unterstützt, d.h. beim
  433.         Laden von Includefiles wird zunächst das precompilierte gesucht,
  434.         und erst wenn dieses nicht gefunden wird, das "normale" File
  435.         gelesen. Der Vorteil dieser Methode ist natürlich, daß das
  436.         uebersetzen schneller geht, da precompilierte Dateien wesentlich
  437.         kuerzer sind und ausserdem "vorgekaut". Fuer Details siehe Datei
  438.         "IPC.TXT"
  439.       - beim Übersetzen der MiNT-Sources bemerkt: hcc brachte bei
  440.            "test(&main);"
  441.         eine Fehlermeldung. Das '&' vor dem Funktionsnamen ist völlig
  442.         überflüssig, aber nicht verboten. Jetzt kommt nur noch die
  443.         Warnung "& ignored".
  444.  
  445.    - x8 -> x9:
  446.       - der Compiler hat nicht bemerkt, wenn 'break' oder 'continue' an
  447.         illegalen Stellen verwendet wurden, stattdessen wurde dafür
  448.         'bra L-1' erzeugt, was weder top noch jas sehr witzig fanden
  449.       (06.11.92)
  450.       - die Anzahl der Fehler wird jetzt nur noch auf dem Bildschirm
  451.         ausgegeben, wenn -V angegeben wurde
  452.       - wenn die Fehlermeldungen in eine Datei geschrieben werden, und
  453.         -V angegeben wurde, dann werden sie zusätzlich auch noch auf den
  454.         Bildschirm ausgegeben; dies wurde vor allem deshalb implementiert,
  455.         weil sonst bei Erzeugung einer Fehlerdatei die Warnungen des
  456.         Compilers verlorengehen, da dieser richtigerweise nur dann einen
  457.         Exitcode != 0 liefert, wenn Fehler aufgetreten sind; wenn nur
  458.         Warnungen kamen, war/ist der Exitcode == 0 und niemand merkte
  459.         etwas vom Inhalt der Fehlerdatei
  460.       (19.03.93)
  461.       - falls -V nicht angegeben war und der hcc Fehler gefunden hat, so
  462.         wurde trotzdem 0 als ExitCode zurückgegeben, was natürlich nicht
  463.         im Sinne des Erfinders war.
  464.  
  465.    - x9 -> x10:
  466.       - Fehlermeldungen '? member ID' & 'select non struct' so um-
  467.         konstruiert, daß der nicht gefundene Identifier ausgegeben wird
  468.       - hcc kann jetzt ANSI-Funktionsköpfe lesen, d.h.
  469.             extern char *malloc(int size);
  470.         ist erlaubt, und
  471.             void main(int argc, char **argv, char *envp)
  472.             {
  473.             ...
  474.             }
  475.         auch (!!!).
  476.         Natürlich ist die K&R Schreibweise auch weiterhin erlaubt und wird
  477.         nicht (wie bei anderen Compilern) mit einer Warnung oder gar
  478.         Fehlermeldung bedacht.
  479.         Ebenfalls implementiert wurde der spezielle Bezeichner '...' als
  480.         (letzter) Funktionsparameter. Bedeutung: "hier können wahlweise
  481.         noch mehr Parameter kommen, müssen aber nicht, und eine Typüber-
  482.         prüfung soll ab hier auch nicht mehr stattfinden". Benutzt wird
  483.         soetwas etwa bei "fprintf(FILE *fp, char *fmt, ...)", also dort,
  484.         wo variabel viele Parameter kommen können.
  485.       - Schlüsselworte 'signed', 'cdecl', 'volatile', 'const' und 'pascal'
  486.         implementiert (wegen ANSI-Kompatibilität)
  487.             signed:     Speicherklasse; da alle Typen defaultmäßig signed
  488.                         sind, ist dieses Schlüsselwort nur für Casting
  489.                         und für den zukünftigen Typechecker interessant,
  490.                         ansonsten ist er mit 'int' gleichbedeutend.
  491.             cdecl:      Speicherklasse für Funktionen; Soll bedeuten, daß
  492.                         die Parameter auf dem Stack übergeben werden, und
  493.                         nicht in Registern (oder sonstwie); der hcc kann
  494.                         Parameter nur auf dem Stack übergeben, deshalb hat
  495.                         dieses Schlüsselwort aktuell keinen anderen Zweck,
  496.                         als die Übersetzbarkeit von ANSI-Sourcen zu gewähr-
  497.                         leisten.
  498.             pascal:     Speicherklasse für Funktionen; Soll bedeuten, daß
  499.                         die Parameter "falsch herum" auf dem Stack liegen
  500.                         und das diese Funktion den Stack selber aufräumt;
  501.                         Beides geschieht aktuell nicht, das noch kein
  502.                         Prototyping implementiert wurde. Aktuell hat dieses
  503.                         Schlüsselwort nur den Zweck, die Übersetzbakeit von
  504.                         ANSI-Sources zu gewährleisten.
  505.             volatile:   Speicherklasse für lokale Variablen;
  506.                         Soll bedeuten, daß diese Variable nicht in ein
  507.                         Register gelegt werden darf;
  508.                         der hcc legt nur Variablen in Register, die auch
  509.                         mit "register" gekennzeichnet sind, dieses
  510.                         Schlüsselwort hat also aktuell keinen anderen
  511.                         Zweck, als die Übersetzbarkeit von ANSI-Sourcen
  512.                         zu gewährleisten.
  513.             const:      Speicherklasse für Variablen; bedeutet, das die
  514.                         so gekennzeichneten Variablen nur gelesen, jedoch
  515.                         niemals überschrieben werden;
  516.                         wird ignoriert, bis ich die unübersichtliche NODE
  517.                         Struktur vollständig verstanden habe und sie auch
  518.                         ganz überblicken kann, dieses Schlüsselwort hat
  519.                         also aktuell keinen anderen Zweck, als die Über-
  520.                         setzbarkeit von ANSI-Sourcen zu gewährleisten.
  521.  
  522.         ACHTUNG: weil sich hierdurch die Menge der Schlüsselwörter geändert
  523.                  hat, ist es notwendig, daß alle precompilierten Header-
  524.                  Files mit der neuen Version des IPC übersetzt werden!
  525.  
  526.  
  527. Geschwindigkeits-Vergleich:
  528. ---------------------------
  529. Compiler    Computer             Dhrystones (V1.1/REGS)  Prg.-Länge
  530. ====================================================================
  531. DR-C        Mega-ST, TOS 1.04    862                     12905 Bytes  (*)
  532. SOZOBON-C   Amiga    AMIGADOS    1428                    5200  Bytes  (##)
  533. TC (2.0)    Mega-ST, TOS 1.04    1562                    10648 Bytes  (**)
  534. PC          Mega-ST, TOS 1.04    1562                    12332 Bytes  (x)
  535. SOZOBON-C   Mega-ST, TOS 1.04    1612                    4121  Bytes  (#)
  536. PC          Mega-ST, TOS 1.04    1724                    12234 Bytes  (**)
  537. (#)  : es wurden XCC V2.00x6 & TOP V2.00x6 & XDLibs verwendet
  538. (##) : gleicher Compiler & Optimizer, bloß auf dem Amiga (Länge ungefähr)
  539. (*)  : lag als ausführbare Datei dem Quelltext bei, ist also nicht nachprüfbar
  540.        (wir haben den Compiler nicht)
  541. (**) : von einem Bekannten (Carsten) gemacht (-> Ergebnis sicher)
  542. (x)  : mit 'cdecl' gemacht, also "wirklicher" Code-Erzeugungs-Vergleich...
  543.  
  544. Der Dhrystone-Quelltext kann bei uns bezogen werden (lief auch schon
  545. auf 'ner Cray...).
  546.  
  547. Diese Werte sind nur dazu gedacht, um daß weitverbreitete Vorurteil abzubauen,
  548. daß PD-Compiler langsam und schlecht sind, und außerdem viel zu langen Code
  549. erzeugen (man beachte die Programm-Längen...)
  550.  
  551. Noch ein Beispiel dazu:
  552. Der Frank hat kürzlich (mal wieder) ein Apfelmännchen-Programm geschrieben,
  553. natürlich mit SOZOBON-C. Die getestete Version brauchte 2 min. 14 sec für
  554. die komplette Grafik und war 23 KB lang. Bei einem Bekannten (Carsten)
  555. ließen wir das gleiche Programm unter TC compilieren. Das Ergebnis war, daß
  556. die Version 7 KB länger wurde, und trotz Mathe-Coprozessor 3 min 34 sec für
  557. die gleiche Berechnung benötigte, also über eine Minute länger rechnete ...
  558.  
  559. Da die Leute von SOZOBON endlich mit der Version 2.0 des Compilers heraus-
  560. gekommen sind, mußten wir unsere Erweiterungen/Fehlerbereinigungen natürlich
  561. sofort in diese Version einbauen.
  562. Anscheinend ist der Support für den Amiga inzwischen besser, als der für den
  563. Atari, denn obwohl SOZOBON-C für den ST geschrieben ist, haben wir diese
  564. Version vom Amiga bekommen und auf den ST zurück-angepasst, weil anscheinend
  565. keiner was von einer ATARI-Version 2.00 weiß ...
  566.  
  567. (falls Herr Würkner (alias TETISOFT) jetzt diese Zeilen liest:
  568. ^!$%§%#??
  569. ... und beim nächsten Mal benutzen wir dann '#ifdef FOR_AMIGA' an ALLEN
  570. Stellen, die nur für den Amiga geändert wurden!...)
  571.  
  572. Die von uns modifizierte Version des Compilers trägt den Namen XCC
  573. (eXtended C-Compiler) und die Versions-Nummer 2.00x6 (nur 'x6' hinzugefügt)
  574.  
  575.  
  576. DIVERSES:
  577. ---------
  578. - Es wurde einiges optimiert, ent-rekursioniert und entwanzt
  579.  
  580. - Wenn das Datei-Ende innerhalb eines Kommentars lag, so endete dies in einer
  581.   Endlosschleife des Compilers - behoben
  582.  
  583. - Wenn das Datei-Ende innerhalb eines #if/#ifdef/#ifndef lag, so führte
  584.   dies ebenfalls zu einer Endlosschleife, falls die Bedingung falsch war
  585.   bzw. der #else - Zweig erreicht war. Dies wird jetzt mit einer Fehler-
  586.   meldung quittiert.
  587.  
  588. - die Meldung 'lost X nodes' kommt jetzt seltener (gar nicht mehr ?)
  589.  
  590. - Die Hex-Notation in String-Konstanten funktioniert jetzt auch richtig...
  591.  
  592. - so etwas wie 'printf("Umlaut-Test: äöüÖÄÜß\n")' funktioniert jetzt endlich
  593.   Umlaute im Quelltext werden jedoch auch weiterhin als White-Space
  594.   interpretiert.
  595.  
  596. - der Compiler stürzt nicht mehr ab, wenn jemand lokale Arrays bei der
  597.   Deklaration gleich initialisieren wollte.
  598.  
  599. - wenn der Compiler auf ein Statement der Form 'if ()' (also ohne was in den
  600.   Klammern) traf, dann stuerzte er ab -- behoben
  601.  
  602. - wenn die geschweifte Klammerung bei 'do {....} while();' fehlerhaft ist,
  603.   dann stuerzte der Compiler manchmal ab -- behoben
  604.  
  605. - bisher pasierte es manchmal, daß HCC/XCC falscherweise die Fehlermeldung
  606.   'struct redefined ...' ausgab. Dies lag daran, daß bei unbenannten
  607.   Strukturen/Union's intern eigene Namen vergeben werden, und diese
  608.   auffrund eines Denkfehlers nicht immer eindeutig waren, der Compiler
  609.   also den selben Namen an zwei Strukturen vergeben hat. Dieser Fehler
  610.   wurde behoben.
  611.  
  612. - Zusammenarbeit mit TOP verbessert:
  613.   1. XCC generiert Zeilen der Form ';loop Lx', mithilfe derer der TOP dann
  614.      (endlich) Loop-rotations machen kann.
  615.   2. XCC generiert Zeilen der Form ';ret [a|d]0', welche dem TOP dazu dienen,
  616.      mehr Optimierungen zu machen.
  617.   3. XCC generiert Zeilen der Form ';sstart' & ';send', welche dem TOP
  618.      anzeigen, daß hier Code für 'switches' steht, welcher umsortiert werden
  619.      soll
  620.   4. XCC generiert ';longs', wenn die '-L' Option angegeben wurde, dies ist
  621.      wichtig fuer die Register Parameter
  622.   5. XCC generiert ';notop' fuer alle Funktionen, die zwischen einem
  623.          '#pragma -TOP' und '#pragma +TOP'
  624.      stehen; das bedeutet, das TOP diese Funktionen nicht optimieren soll
  625.      (praktisch zum debuggen)
  626.   6. XCC generiert ';opt "<optionen-string>"', wenn eine Zeile
  627.          '#pragma OPT "<optionen-string>"
  628.      gefunden wird. Dies dient (aktuell nur) dazu, die Optionen fuer TOP
  629.      funktionenweise veraendern zu koennen
  630.   7. XCC generiert ';xhcc', um dem TOP anzuzeigen, das mit dem erweiterten
  631.      Compiler gearbeitet wird. TOP verwendet dies fuer die Behandlung der
  632.      ';ret' Direktive, um auch mit alten Versionendes Compilers lauffaehig
  633.      zu sein
  634.  
  635.  
  636. PREPROZESSOR:
  637. -------------
  638. - Das Macro __DATE__ wurde neu implementiert.
  639.  
  640. - Das Macro __TIME__ wurde neu implementiert.
  641.  
  642. - Dem Macro TOS wurde das Macro __TOS__ ergänzt, weil es anscheinend keine
  643.   einheitliche Schreibweise gibt, und ich dieses auch schon irgendwo gesehen
  644.   habe
  645.  
  646. - Es wurde ein Macro Namens __BASE_FILE__ implementiert, welches dem Benutzer
  647.   auch innerhalb von Include-Files die Möglichkeit gibt, auf den Namen der
  648.   Haupt-Datei zuzugreifen
  649.  
  650. - Das CPP-Kommando '#assert' wurde implementiert.
  651.   Syntax : #assert <ausdruck>
  652.   Wirkung: Falls <ausdruck> FALSE ist, erfolgt eine Fehlermeldung seitens des
  653.            Compilers und die Compilierung wird abgebrochen
  654.  
  655. - Das CPP-Kommando '#pragma' wurde implementiert.
  656.   Syntax : #pragma [+|-<NAME> ...] [irgendwas]
  657.       oder #pragma OPT "<string>"
  658.   Wirkung: dient zum Umschalten einiger Optionen;
  659.       #pragma +<name> schaltet die Option ein, durch '-<name>' wird sie
  660.       ausgeschaltet. Folgende Namen sind implementiert:
  661.       - PRO: Profiling                    ein/aus
  662.       - PTR: 'pointer types mismatch'     ein/aus
  663.       - CMP: 'cmp of diff ptrs'           ein/aus
  664.       - DIF: 'diff ptrs'                  ein/aus
  665.       - RDF: 'redefined: SYM'             ein/aus
  666.       - STR: String-Optimierung           ein/aus
  667.       - FST: Quick-Flag (Option '-q')     ein/aus
  668.       - TOP: Optimizer (funktionsweise)   ein/aus
  669.              (wird nur einmal pro Funktion ausgegeben)
  670.  
  671.       #pragma OPT "<string>" schreibt <string> in die Ausgabe-Datei.
  672.          Dies kann zum umschalten der Optionen des Optimizers je nach
  673.          zu optimierender Funktion verwendet werden.
  674.          Der String wird max. einmal pro Funktion ausgegeben!
  675.   Bisher gab es eine Fehlermeldung bei #pragma, was nicht Standard-Gemäß ist
  676.  
  677. - Das CPP-Kommando '#error' wurde implementiert.
  678.   Syntax : #error ["Meldung"]
  679.   Wirkung: Falls "Meldung" angegeben wird, so erfolgt die Ausgabe dieses
  680.            Strings als Fehlermeldung, ansonsten gibt es eine Standard-
  681.            Meldung und die Compilierung wird abgebrochen
  682.   Praktisch z.B., um auf Portierungs-Probleme hinzuweisen...
  683.  
  684. - Das CPP-Kommando #asm wird implementiert (noch in Arbeit...).
  685.   Syntax : #asm assembler-code
  686.   Wirkung: Funktioniert wie asm(), ist aber weniger Schreibkrams...
  687.            Funktioniert bedingt auch außerhalb von Funktionen.
  688.   Dieses ist zum gegenwärtigen Zeitpunkt nicht errreichbar, da die Implemen-
  689.   tierung noch nicht ganz abgeschlossen ist.
  690.  
  691.  
  692. OPTIONEN:
  693. ---------
  694. - Die neue Option '-Oname' bewirkt, daß die Assembler-Ausgaben in die Datei
  695.   <name> geschrieben wird, was insbesondere die Möglichkeit zur Laufwerks-
  696.   übergreifenden Compilierung bietet
  697.  
  698. - Die neue Option '-Ename' bewirkt, daß alle Meldungen des Compilers nicht
  699.   auf dem Bildschirm, sondern in die Datei <name> geschrieben werden
  700.  
  701. - Die neue Option -N bewirkt, daß Kommentare geschachtelt werden dürfen
  702.  
  703. - Die neue Option -Mzahl bewirkt, daß die Compilierung nach maximal <zahl>
  704.   Meldungen (errors, warnings) abgebrochen wird.
  705.  
  706. - Die neue Option -S bewirkt, daß mehrfach vorhandene Strings nicht mehr
  707.   zu einem zusammengefasst werden.
  708.  
  709. - Mit der neuen Option -T kann die Generierung der TRAP-Befehle abgeschaltet
  710.   werden (falls sich jemand eigene Funktionen gemdos(), bios() oder xbios()
  711.   schreiben will...). Siehe unten
  712.  
  713. - Die neue, von Detlev Würkner implementierte, und von uns korrigierte
  714.   Option -L bewirkt, daß alle als 'int' deklarierten Variablen 32Bits
  715.   groß sind (also int = long). Diese Option ist nur sehr wenig getestet,
  716.   also mit Vorsicht zu geniessen. Um sie nutzen zu können, müßten alle
  717.   Bibliotheken ebenfalls mit dieser Option neu übersetzt werden, wozu
  718.   ich natürlich keine Lust habe. Außerdem wird es Probleme mit den
  719.   direkten traps geben, da das Betriebs-System natürlich nach wie
  720.   vor auf 16Bit-Werten besteht.
  721.  
  722. - Mit der Option -X kann er Debug-Modus eingeschaltet werden. In diesem
  723.   Fall generiert der Compiler zusätzlichen Code, und im Falle eines Absturzes
  724.   meldet das Programm die Zeile und die Datei, in der der Fehler auftrat.
  725.   Dazu muß das Programm allerdings mit dem Startup-Code 'DEBUG_S.O' gelinkt
  726.   werden.
  727.   Die Syntax ist -X[N][function], wobei
  728.       N        den Debug-Level angibt, und
  729.       function den Namen einer Benutzer-Definierten Debug-Funktion
  730.   Aktuell sind die Levels 1 und 2 implementiert, bei Level 1 werden
  731.   die Zeilennummern generiert, sowie Aufrufe der angegebenen Funktion
  732.   am Anfang, am Ende und in jeder Schleife einer Funktion. In Level 2
  733.   wird pro Sourcecode-Zeile ein Aufruf der angegebenen Funktion generiert,
  734.   so daß im Prinzip ein Source-Level-Debugging moeglich ist. Eine dafür
  735.   geeignete Funktion liegt in einer ersten, unvollstaendigen Version bereits
  736.   bei: Sie heisst "_debug" und liegt in den Dateien DEBUG_A.O und DEBUG_C.O
  737.   vor, diese Dateien muessen beim Linken VOR den XDLibs angegeben werden.
  738.   Beim selberschreiben einer solchen Funktion ist auf jeden Fall zu beachten,
  739.   daß alle Register gerettet werden müssen, da dies beim Aufruf (natuerlich)
  740.   nicht geschieht.
  741.   Wenn die Angabe einer Debug-Funktion fehlt, sind Level 1 und 2 identisch.
  742.  
  743. - Die Kommandozeile hat somit folgendes Aussehen:
  744.   hcc [-DUIPNVMSLT] [-X[N][function]] [-OSFILE1] [-EERRFILE1] CFILE1 [...]
  745.   d.h. für jede Datei koennen eine eigene Fehlerdateien und (natürlich)
  746.   Ausgabedateien angegeben werden
  747.  
  748.  
  749.  
  750. SONSTIGE ERWEITERUNGEN:
  751. -----------------------
  752. - Variablen vom Typ 'void *' sind jetzt zu allen anderen Zeigern kompatibel,
  753.   d.h. bei Zuweisungen erfolgt keine Warnung mehr vom Compiler
  754.  
  755. - Bei Meldungen des Compilers, die sich auf ein Include-File beziehen, wird
  756.   jetzt der Zugriffs-Pfad mit ausgegeben
  757.  
  758. - In String-Konstanten können jetzt alle Umlaute und sonstigen Sonderzeichen
  759.   direkt angegeben werden. Bisher konnten diese Zeichen nur über die
  760.   Oktal-Notation '\XXX' ausgegeben werden.
  761.  
  762. - Die Multi-Byte-Characters wurden implementiert. Bisher wurden sie zwar ge-
  763.   duldet, d.h. nicht angemeckert, aber NICHT behandelt. Folgendes funktioniert
  764.   jetzt:
  765.       int  i = 'ab';
  766.       long j = 'abc';
  767.       long k = 'abcd';
  768.   Folgendes hingegen funktioniert (logischerweise) nicht:
  769.       short i = 'abc';
  770.   führt jedoch auch zu keiner Meldung vom Compiler ...
  771.  
  772. - Die String-Konkatenation wurde implementiert. Beispiel:
  773.    printf("Hello "   /* hier KEIN Komma */
  774.           "world");
  775.   führt zu keinem Fehler, sondern zur gewünschten Ausgabe "Hello world".
  776.   Diese Erweiterung kommt insbesondere der Lesbarkeit des Quelltextes
  777.   zugute, wenn lange Strings ausgegeben werden sollen. Außerdem spart sie
  778.   Arbeit beim portieren von ANSI-Quelltexten...
  779.  
  780. - Die Funktion asm() wurde dahingehend erweitert, daß jetzt ein einfacher
  781.   Zugriff auf alle Variablen möglich ist.
  782.   Beispiel: asm(" move.l   #1, <i>");
  783.       wird zu:    move.l   #1, REGISTER   falls i register-Variable ist
  784.       oder   :    move.l   #1, OFFSET(a6) falls i lokale Var oder Parameter ist
  785.       oder   :    move.l   #1, _i         falls i externe & globale Var ist
  786.       oder   :    move.l   #1, Lnummer    falls i statisch ist
  787.       oder   :    move.l   #1, <i>        falls i unbekannt ist
  788.  
  789. - Das Profiling wurde (endlich) implementiert, es tut sich jetzt also wirklich
  790.   etwas, wenn die Option '-P' in der Kommando-Zeile angegeben wird.
  791.   Am Anfang jeder Funktion wird der Aufruf einer Funktion Namens '_prolog'
  792.   eingefügt, welche in C folgendes Aussehen hat:
  793.       void _prolog(char *name)
  794.   <name> ist hierbei ein Zeiger auf den Namen der gerade ausgeführten Funktion
  795.   (z.B. "main")
  796.   Am Ende jeder Funktion wird der Aufruf einer Funktion Namens '_epilog'
  797.   eingefügt, welche in C folgendes Aussehen hat:
  798.       void _epilog(char *name)
  799.   wobei <name> wieder ein Zeiger auf den Namen der aktuellen Funktion ist.
  800.   Der Parameter wurde absichtlich über den Stack übergeben, damit auch alle
  801.   nicht-Assembler-Programmierer sich ihre eigenen Profiling-Funktionen
  802.   schreiben können. Damit die so erzeugte Tabelle auch ausgegeben wird, muß
  803.   beim Linken ein spezieller Startup-Code verwendet werden: 'prof_s.o'. Dieser
  804.   ruft direkt vor der Terminierung des Programmes eine Funktion Namens
  805.   '_saveprof' auf (in C: void _saveprof() ), welche die Tabelle in formatierter
  806.   Form in eine ASCII-Datei Namens 'prof.out' im aktuellen Verzeichnis schreibt.
  807.   Das ganze funktioniert somit natürlich nicht 100%ig, wenn in verschiedenen
  808.   Dateien statische Funktionen gleichen Namens verwendet werden...
  809.   Die zugehörigen Standard-Funktionen finden sich in der von uns modifizierten
  810.   Version der DLibs (sollte beiliegen, kann ansonsten bei uns bezogen werden).
  811.   Sollte das mit profiling übersetzte Programm abstürzen, dann nochmal über-
  812.   setzen, und zwar OHNE Optimizer...
  813.  
  814. - alle Aufrufe von gemdos(), bios() und xbios() werden jetzt direkt als
  815.   trap - Befehl erzeugt; aus einem 'jsr _gemdos' wird z.B. 'trap #1';
  816.   Die Vorteile:
  817.   - der trap - Befehl ist 2 Bytes lang, jsr dagegen 6
  818.   - der jsr-Befehl benötigt 20 Taktzyklen,
  819.     der rts-Befehl          16
  820.     der trap-Befehl         34
  821.                             --
  822.                             70 Taktzyklen plus dem, was da noch gemacht
  823.                                wird (Stack-Test, Rücksprung-Adresse vom
  824.                                und auf den Stack)
  825.    -> der direkte trap-Befehl ist somit mehr als doppelt so schnell in
  826.       der Ausführung und auch noch kürzer
  827.       (C-Desk ist z.B. mehr als 300 Bytes kürzer geworden)
  828.    Der Nachteil:
  829.    - kein Stack-overflow-Test mehr (tritt sowieso nie auf, es sei denn
  830.      durch einen Programmier-Fehler)
  831.    Abschaltbar durch '-T'.
  832.  
  833. - die Code-Erzeugung für 'switch' wurde wesentlich verbessert. Bisher konnte
  834.   es z.B. passieren, daß bei unglücklicher Wahl der 'case' - Werte aus einem
  835.   'switch' 4 gemacht wurden, was natürlich langsameren und längeren Code er-
  836.   zeugt, als ein 'switch'
  837.  
  838.  
  839. Sonstiges
  840. ---------
  841. - Erweiterungen/Änderungen gegenüber der Version 1.21 sind den übrigen Texten
  842.   zu entnehmen
  843. - alle von TETISOFT vogenommenen Änderungen sind ebenfalls in einem anderen
  844.   Text aufgeführt, jedoch größtenteils in der vorliegenden Version nicht oder
  845.   in modifizierter From enthalten.
  846.  
  847.  
  848.