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