home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / CLISP-1.LHA / CLISP960530-sr.lha / src / amiga.d < prev    next >
Encoding:
Text File  |  1996-07-21  |  14.8 KB  |  389 lines

  1. # Include-File für AMIGA-Version von CLISP
  2. # Bruno Haible, Jörg Höhle 19.12.1994
  3.  
  4.  
  5. # Konstanten für Steuerzeichen:
  6.  
  7. #define BEL  7              # Ton ausgeben
  8. #define CSI  (0x9B)         # Control-Sequence-Introducer (Meta-Escape)
  9. #define RUBOUT 127          # Rubout = Delete
  10. #define CRLFstring  "\n"    # C-String, der BS-Newline enthält
  11.  
  12.  
  13. # Macros, um Longword-aligned Strukturen (z.B. im Stack) zu erzeugen:
  14. # Statt
  15. #   { var struct FileInfoBlock fib;
  16. #     var struct FileInfoBlock * fibptr = &fib;
  17. #     ...
  18. #   }
  19. # schreibe
  20. #   { var LONGALIGNTYPE(struct FileInfoBlock) fib;
  21. #     var struct FileInfoBlock * fibptr = LONGALIGN(&fib);
  22. #     ...
  23. #   }
  24.   #define LONGALIGNTYPE(type)  struct { type dummy1; uintW dummy2; }
  25.   #define LONGALIGN(addr)      ((void*)(floor(((uintL)(addr)+2),4)*4))
  26. # wird verwendet von PATHNAME, STREAM
  27.  
  28.  
  29. #include <exec/types.h>
  30. #include <exec/memory.h>         # für Allocate()-Deklaration, MEMF_24BITDMA
  31. #include <exec/execbase.h>       # für SysBase, AFF_680x0
  32. #include <libraries/dos.h>
  33. #include <libraries/dosextens.h>
  34.  
  35. #ifdef ANSI
  36.   #include <stdlib.h>
  37. #endif
  38.  
  39. #ifdef GNU
  40.   # Expandiere alle Betriebssystem-Aufrufe inline, mit Kamil Iskra inlines.h
  41.   #define GNU_INLINES
  42. #endif
  43.  
  44. #define Class  OS_Class          # Shadowing intuition/classes.h
  45.  
  46. # das sind die Compiler-spezifischen Prototypen:
  47. # Bei GCC werden dabei inline/...h gelesen, das sind Macros
  48. #define ASTRING  UBYTE*
  49. #include <proto/exec.h>
  50. #include <proto/dos.h>
  51.  
  52. #undef Class
  53.  
  54. # BCPL-Pointer (hier BCPL* genannt, Typ BPTR) sind durch 4 teilbare Adressen,
  55. # die durch 4 dividiert wurden.
  56.   #define BPTR_NULL  ((BPTR)0)     # das ist ein spezieller, aber gültiger BPTR
  57.   #define BPTR_NONE  ((BPTR)(-1))  # das ist ein ungültiger BPTR, Erkennungszeichen
  58.  
  59.  
  60. # Typ eines Handle:
  61.   #define Handle  BPTR
  62.   #define Handle_NULL  BPTR_NULL
  63.   #define FOREIGN_HANDLE  # verpacke die Handles sicherheitshalber
  64. # wird verwendet von PATHNAME, SPVW
  65.  
  66.  
  67. # Für asciz_out() und *terminal-io*, initialisiert von SPVW:
  68.   extern Handle Input_handle;     # low-level stdin Eingabekanal
  69.   extern Handle Output_handle;    # low-level stdout Ausgabekanal
  70.  
  71.  
  72. # Information über die eigene Task.
  73.   extern struct ExecBase * const SysBase;
  74. # wird verwendet von SPVW
  75.  
  76.  
  77. # Versionsabfragen:
  78.   extern struct DosLibrary * const DOSBase;
  79. # wird verwendet von STREAM
  80.  
  81.  
  82. # Deklaration von Typen von Ein-/Ausgabe-Parametern von Betriebssystemfunktionen
  83.   #define CONST
  84.  
  85.  
  86. # Programm verlassen und beenden.
  87. # exit(returncode);
  88. # > LONG returncode: Rückgabewert an den Aufrufer des Programms
  89. #                    (z.B. RETURN_OK, RETURN_WARN, RETURN_ERROR, RETURN_FAIL)
  90.   nonreturning_function(extern, exit, (int returncode));
  91. # wird verwendet von SPVW
  92.  
  93.  
  94. # Die Inlines sind jetzt Macros, also können Funktionen nicht mehr deklariert werden
  95. #if !defined(GNU_INLINES)
  96.  
  97. # Holt das aktuelle Datum und die aktuelle Uhrzeit.
  98. # DateStamp(&datestamp);
  99. # < struct DateStamp datestamp: aktuelle Zeit
  100. #     LONG datestamp.ds_Days   : Anzahl Tage seit 1.1.1978
  101. #     LONG datestamp.ds_Minute : Anzahl Minuten seit Tagesanfang
  102. #     LONG datestamp.ds_Tick   : Anzahl Ticks (1/50 sec) seit Minutenanfang
  103.   extern struct DateStamp * DateStamp (struct DateStamp * datestamp); # siehe dos.library/DateStamp
  104. # wird verwendet von SPVW
  105.  
  106. # Wartet eine bestimmte Zeit.
  107. # Delay(ticks);
  108. # > ULONG ticks: Anzahl (>0) von Ticks (1/50 sec), die zu warten ist
  109.   extern void Delay (long ticks); # siehe dos.library/Delay
  110. # wird verwendet von MISC
  111.  
  112.  
  113. # Holt die letzte Fehlernummer.
  114. # errno = IoErr();
  115.   extern LONG IoErr (void);
  116. # wird verwendet von ERROR, PATHNAME
  117.  
  118. # Setzt die nächste Fehlernummer.
  119. # olderrno = SetIoErr(errno);
  120.   extern LONG SetIoErr (LONG);
  121. # wird verwendet von ERROR
  122.  
  123.  
  124. # Öffnet eine Datei.
  125. # handle = Open(filename,mode)
  126. # > filename: Name eines Files oder Device (ASCIZ-String)
  127. # > mode: Zugriffsmodus, z.B. MODE_OLDFILE oder MODE_NEWFILE oder MODE_READWRITE
  128. # < handle: Handle oder NULL bei Fehler.
  129.   extern Handle Open (CONST ASTRING filename, long mode); # siehe dos.library/Open
  130.   #define Open(filename,mode)  (Open)((CONST ASTRING)(filename),mode)
  131. # wird verwendet von SPVW, PATHNAME, STREAM
  132.  
  133. # Schließt eine Datei.
  134. # ergebnis = Close(handle)
  135. # > handle: Handle eines offenen Files
  136. # < ergebnis: NULL bei Fehler.
  137.   extern LONG Close (Handle handle); # siehe dos.library/Close
  138.   # define CLOSE(handle)  (Close(handle),0)
  139. # wird verwendet von SPVW, PATHNAME, STREAM
  140.  
  141. # Liest von einer Datei.
  142. # ergebnis = Read(handle,bufferaddr,bufferlen);
  143. # > handle: Handle eines offenen Files
  144. # > bufferaddr: Adresse eines Buffers mit bufferlen Bytes
  145. # < ergebnis: Anzahl der gelesenen Bytes (0 bei EOF) oder -1 bei Fehler.
  146.   extern LONG Read (Handle handle, APTR bufferaddr, long bufferlen); # siehe dos.library/Read
  147. # wird verwendet von SPVW, STREAM
  148.  
  149. # Schreibt auf eine Datei.
  150. # ergebnis = Write(handle,bufferaddr,bufferlen);
  151. # > handle: Handle eines offenen Files
  152. # > bufferaddr: Adresse eines Buffers mit bufferlen Bytes
  153. # < ergebnis: Anzahl der geschriebenen Bytes oder -1 bei Fehler.
  154.   extern LONG Write (Handle handle, CONST APTR bufferaddr, long bufferlen); # siehe dos.library/Write
  155. # wird verwendet von SPVW, STREAM
  156.  
  157. # Dateizeiger positionieren.
  158. # Seek(handle,pos,mode)
  159. # > Handle handle : Handle eines (offenen) Files.
  160. # > LONG pos : Position in Bytes (muß >=0 bei Modus OFFSET_BEGINNING
  161. #                                 bzw. <=0 bei Modus OFFSET_END sein)
  162. # > LONG mode : Modus (OFFSET_BEGINNING = ab Fileanfang,
  163. #                      OFFSET_CURRENT = ab momentan, OFFSET_END = ab Fileende)
  164. # < LONG ergebnis : alte(!) Position ab Fileanfang oder -1 bei Fehler.
  165.   extern LONG Seek (Handle handle, long pos, long mode); # siehe dos.library/Seek
  166. # wird verwendet von STREAM
  167.  
  168.  
  169. # Holt den Eingabe-Handle
  170. # Input()
  171. # < ergebnis: Eingabe-Handle, NULL bei WorkBench-Aufruf des Programms
  172.   extern Handle Input (void); # siehe dos.library/Input
  173. # verwendet von SPVW
  174.  
  175. # Holt den Ausgabe-Handle
  176. # Output()
  177. # < ergebnis: Ausgabe-Handle, NULL bei WorkBench-Aufruf des Programms
  178.   extern Handle Output (void); # siehe dos.library/Output
  179. # verwendet von SPVW
  180.  
  181.  
  182. # Legt den Finger auf eine Datei oder ein Directory.
  183. # lock = Lock(name,mode);
  184. # > name: Name der Datei bzw. des Directory (ASCIZ-String)
  185. # > mode: Zugriffsmodus, z.B. ACCESS_READ (= SHARED_LOCK) oder ACCESS_WRITE (= EXCLUSIVE_LOCK)
  186. # < struct FileLock BCPL* lock: Lock oder NULL bei Fehler.
  187.   extern BPTR Lock (CONST ASTRING name, long mode); # siehe dos.library/Lock
  188.   #define Lock(name,mode)  (Lock)((CONST ASTRING)(name),mode)
  189. # wird verwendet von PATHNAME
  190.  
  191. # Läßt eine Datei oder ein Directory wieder los.
  192. # UnLock(lock);
  193. # > struct FileLock BCPL* lock: Lock oder NULL.
  194.   extern void UnLock (BPTR lock); # siehe dos.library/UnLock
  195. # wird verwendet von PATHNAME
  196.  
  197. # Holt Informationen zu einer Datei oder einem Directory.
  198. # ergebnis = Examine(lock,&fib);
  199. # > struct FileLock BCPL* lock: Lock.
  200. # > struct FileInfoBlock fib: Platz für die Informationen, LONGALIGNED,
  201. #     LONG fib.fib_DirEntryType     : >0 bei Directory, <0 bei normaler Datei
  202. #     char fib.fib_Filename []      : Filename, ein ASCIZ-String
  203. #     LONG fib.fib_Size             : Größe des Files in Bytes
  204. #     struct DateStamp fib.fib_Date : Datum der letzten Modifikation
  205. #     char fib.fib_Comment []       : Kommentar
  206. # < ergebnis: NULL bei Fehler
  207.   extern LONG Examine (BPTR lock, struct FileInfoBlock * fib); # siehe dos.library/Examine
  208. # wird verwendet von PATHNAME
  209.  
  210. # Holt Informationen zu einem Directory-Eintrag.
  211. # ergebnis = ExNext(lock,&fib);
  212. # > struct FileLock BCPL* lock: Lock auf ein Directory.
  213. # > struct FileInfoBlock fib: Platz für die Informationen, wie bei Examine()
  214. # < ergebnis: NULL bei Fehler, und IoErr()=ERROR_NO_MORE_ENTRIES am Schluß.
  215.   extern LONG ExNext (BPTR lock, struct FileInfoBlock * fib); # siehe dos.library/ExNext
  216. # wird verwendet von PATHNAME
  217.  
  218. # Durchsuchen von Directories nach Dateien:
  219. # 1. Lock fürs Directory besorgen: Lock().
  220. # 2. Examine() dieses Lock in einen FIB.
  221. # 3. ExNext() dieses Lock und denselben FIB solange bis ERROR_NO_MORE_ENTRIES.
  222. # 4. Lock zurückgeben: UnLock().
  223.  
  224. # Besorgt das Parent Directory zu einem Lock auf ein Directory.
  225. # parentlock = ParentDir(lock);
  226. # > struct FileLock BCPL* lock: Lock auf ein Directory
  227. # < struct FileLock BCPL* parentlock: Lock aufs Parent Directory davon,
  228. #     oder NULL bei Fehler oder bei Versuch, Parent vom Root Dir zu nehmen.
  229.   extern BPTR ParentDir (BPTR lock); # siehe dos.library/ParentDir
  230. # wird verwendet von PATHNAME
  231.  
  232.  
  233. # Datei löschen.
  234. # DeleteFile(filename)
  235. # > filename : Filename, ein ASCIZ-String
  236. # < ergebnis : NULL bei Fehler.
  237.   extern LONG DeleteFile (CONST ASTRING filename); # siehe dos.library/DeleteFile
  238.   #define DeleteFile(filename)  (DeleteFile)((CONST ASTRING)(filename))
  239. # wird verwendet von PATHNAME
  240.  
  241. # Datei umbenennen.
  242. # Rename(oldname,newname)
  243. # > oldname : alter Filename, ein ASCIZ-String
  244. # > newname : neuer Filename, ein ASCIZ-String
  245. # < ergebnis : NULL bei Fehler.
  246.   extern LONG Rename (CONST ASTRING oldname, CONST ASTRING newname); # siehe dos.library/Rename
  247.   #define Rename(oldname,newname)  (Rename)((CONST ASTRING)(oldname),(CONST ASTRING)(newname))
  248. # wird verwendet von PATHNAME
  249.  
  250. # Neues Subdirectory anlegen.
  251. # lock = CreateDir(name);
  252. # > name: Pfadname, ein ASCIZ-String
  253. # < struct FileLock BCPL* lock: Lock auf das neue Subdirectory, NULL bei Fehler.
  254.   extern BPTR CreateDir (CONST ASTRING name); # siehe dos.library/CreateDir
  255.   #define CreateDir(name)  (CreateDir)((CONST ASTRING)(name))
  256. # wird verwendet von PATHNAME
  257.  
  258. # Subdirectory löschen.
  259. # DeleteFile(name)
  260. # > name : Pfadname, ein ASCIZ-String
  261. # < ergebnis : NULL bei Fehler.
  262.   # extern LONG DeleteFile (CONST ASTRING filename); # siehe dos.library/DeleteFile, s.o.
  263. # wird verwendet von PATHNAME
  264.  
  265. # Current Directory (des Prozesses) neu setzen.
  266. # CurrentDir(lock)
  267. # > FileLock BCPL* lock: Lock auf ein Directory, wird zum neuen current directory
  268. # < FileLock BCPL* ergebnis: Lock aufs alte current directory
  269. # Beim Programmende muß das Current Directory Lock wieder dasselbe wie beim
  270. # Programmstart sein. Alle anderen Locks sind freizugeben.
  271.   extern BPTR CurrentDir (BPTR lock); # siehe dos.library/CurrentDir
  272. # wird verwendet von PATHNAME, SPVW
  273.  
  274.  
  275. # Stellt fest, ob ein File interaktiv (ein Terminal o.ä.) ist.
  276. # IsInteractive(handle)
  277. # > handle: Handle eines (offenen) Files
  278. # < ergebnis: gibt an, ob das File interaktiv ist
  279.   extern LONG IsInteractive (Handle handle); # siehe dos.library/IsInteractive
  280. # wird verwendet von STREAM, SPVW
  281.  
  282. # Stellt fest, ob innerhalb einer gewissen Zeit ein Zeichen anliegt.
  283. # WaitForChar(handle,timeout)
  284. # > handle: Handle eines (offenen) interaktiven Files
  285. # > timeout: maximale Wartezeit (>=0), in Mikrosekunden
  286. # < ergebnis: gibt an, ob bis zum Ende der Wartezeit ein Zeichen lesbar ist.
  287.   extern LONG WaitForChar (Handle handle, long timeout);
  288. # wird verwendet von STREAM
  289.  
  290. # Umschalten CON/RAW (line/single-character mode).
  291. # SetMode(handle,mode)
  292. # > handle: Handle eines (offenen) interaktiven Files
  293. # > mode: 1 für RAW, 0 für CON
  294. # < ergebnis: 0 falls nicht erfolgreich (Modus ließ sich nicht umsetzen)
  295.   extern LONG SetMode (BPTR handle, long mode); # siehe dos.library/SetMode
  296. # wird verwendet von STREAM
  297.  
  298.  
  299. # Fordert ein Stück Speicher beim Betriebssystem an.
  300. # AllocMem(size,preference)
  301. # > size: angeforderte Größe in Bytes
  302. # > preference: MEMF_ANY oder MEMF_24BITDMA
  303. # < ergebnis: Anfangsadresse des allozierten Bereichs, oder NULL
  304.   extern APTR AllocMem (unsigned long size, unsigned long flags); # siehe exec.library/AllocMem
  305. # wird verwendet von SPVW
  306.  
  307. # Gibt dem Betriebssystem ein Stück Speicher zurück.
  308. # FreeMem(address,size);
  309. # > address: Anfangsadresse des allozierten Bereichs
  310. # > size: Größe dieses Bereichs in Bytes
  311.   extern void FreeMem (APTR address, unsigned long size); # siehe exec.library/FreeMem
  312. # wird verwendet von SPVW
  313.  
  314.  
  315. # Liefert einen Pointer auf die eigene Task.
  316. # FindTask(NULL)
  317. # < ergebnis: Pointer auf den Deskriptor der eigenen Task
  318.   extern struct Task * FindTask (CONST UBYTE* taskname); # siehe exec.library/FindTask
  319. # wird verwendet von ERROR, LISPARIT
  320.  
  321. # Fragt die aktuelle Signal-Maske ab und modifiziert sie.
  322. # (Die Signal-Maske gibt an, welche Signale bei der eigenen Task angekommen
  323. # sind, aber noch nicht verarbeitet wurden. Wird vom Betriebssystem
  324. # asynchron verändert.)
  325. # SetSignal(signals_to_set,signals_to_change)
  326. # < ergebnis: ehemalige Signal-Maske signals
  327. # < neue Signal-Maske
  328. #     signals := (signals & ~signals_to_change) | (signals_to_set & signals_to_change)
  329. #              = signals ^ ((signals ^ signals_to_set) & signals_to_change)
  330.   extern ULONG SetSignal (unsigned long signals_to_set, unsigned long signals_to_change); # siehe exec.library/SetSignal
  331. # wird verwendet von Macro interruptp
  332.  
  333. # Wartet auf ein oder mehrere Signal(e).
  334. # Wait(signals)
  335. # > signals: Signale, auf die gewartet werden soll
  336. # < ergebnis: Signale, die eingetreten sind
  337.   extern ULONG Wait (unsigned long signals); # siehe exec.library/Wait
  338. # wird verwendet von REXX, Macro abort
  339.  
  340.  
  341. # Programme aufrufen.
  342. # Execute(command,ihandle,ohandle)
  343. # > command: Kommandozeile, wie man sie im Kommandozeilen-Interpreter eintippt
  344. # > ihandle: Handle für weitere Kommandos, nachdem command abgearbeitet ist,
  345. #            bei ihandle = 0 werden keine weiteren Kommandos ausgeführt.
  346. # > ohandle: Handle für Ausgaben der Kommandos,
  347. #            bei ohandle = 0 gehen Ausgaben ins aktuelle Fenster.
  348. # < ergebnis: Flag, ob erfolgreich aufgerufen.
  349.   extern LONG Execute (CONST ASTRING command, BPTR ihandle, BPTR ohandle); # siehe dos.library/Execute
  350.   #define Execute(command,ihandle,ohandle)  (Execute)((CONST ASTRING)(command),ihandle,ohandle)
  351. # wird verwendet von PATHNAME
  352.  
  353.  
  354. # Springt in den Debugger.
  355. # Debug(0);
  356.   extern void Debug (unsigned long flags); # siehe exec.library/Debug
  357. # wird verwendet von DEBUG
  358.  
  359. #endif # GNU_INLINES
  360.  
  361. # ignoriere Ergebnis, was sollen wir tun können?
  362.   #define CLOSE(handle)  (Close(handle),0)
  363.  
  364. # Sofortiger Programmabbruch, Sprung in den Debugger
  365.   #if defined(GNU) && 0 # Jörg mag das nicht so sehr bis überhaupt nicht
  366.     #define abort()  __asm__ __volatile__ (" .word 0x4AFC ") # illegaler Befehl
  367.   #elif 1
  368.     # Je préfère Wait(0L) car ainsi le programme se met en attente infinie
  369.     # et on peut essayer de savoir pourquoi en analysant la mémoire. Je ne
  370.     # considère pas qu'une sortie de programme soit sûre puisque la mémoire
  371.     # peut se trouver dans un mauvais état, il peut y avoir des fichiers
  372.     # non fermés, des «Lock» alloués, etc.                       Jörg 7.1.1993
  373.     #define abort()  \
  374.       { asciz_out(CRLFstring "CLISP panic! (halting)" CRLFstring); \
  375.         Wait(0L);                                                  \
  376.       }
  377.   #else
  378.     #define abort()  # ich mach mal ein wenig auf Unix...
  379.       { asciz_out(CRLFstring "Signal SIGABRT: Abort (core dumped)" CRLFstring); \
  380.         quit_sofort(1);                                                         \
  381.       }
  382.   #endif
  383. # wird verwendet von EVAL, IO
  384.  
  385.  
  386. # STREAM.D : Terminal-Stream, finish_output_file, Pipe-Streams?
  387. # PATHNAME.D : Wildcards mit regular expressions
  388.  
  389.