Les protos et les pragmas
Dans les includes, vous avez certainement remarqué les répertoires proto, pragma et inline
Ils servent de raccourcis pour appeler des bibliothèques non standard, ou extensions de bibliothèques sans utiliser de laborieux .lib ou fichiers glue pour les éditeurs de liens.
De cette manière le code généré est beaucoup plus compact et plus rapide.
Malheureusement, la fabrication de ces fichiers est laborieuse, mais si on possède le fichier .fd qui décrit les points d'entrées de la bibliothèque et le clib/xxx_protos.h qui décrit
les appels de ces points d'entrées en C, la chose est presque facile avec l'outil fd2pragma.
Bien sûr chaque compilateur a ses spécificités
Pour le compilateur SAS-C
1) Création du fichier pragma:
fd2pragma fd/xxxx_lib.fd CLIB clib/xxxx_protos.h TO pragma SPECIAL 6
2) Création du fichier proto:
fd2pragma fd/xxxx_lib.fd CLIB clib/xxxx_protos.h TO proto SPECIAL 35
Pour le compilateur GCC
1) Création du fichier inline:
fd2pragma fd/xxxx_lib.fd CLIB clib/xxxx_protos.h TO inline SPECIAL 40
2) Création du fichier proto:
fd2pragma fd/xxxx_lib.fd CLIB clib/xxxx_protos.h TO proto SPECIAL 35
libcall et tagcall
SAS/C
#pragma libcall GfxBase ObtainBestPenA 348 9321805
#if defined(__SASC_60)
#pragma tagcall GfxBase ObtainBestPen 348 9321805
#endif /* __SASC_60 */
GCC
#define ObtainBestPenA(cm, r, g, b, tags) \
LP5(0x348, LONG, ObtainBestPenA, struct ColorMap *, cm, a0, unsigned long, r, d1, unsigned long, g, d2, unsigned long, b, d3, struct TagItem *, tags, a1, \
, GRAPHICS_BASE_NAME)
#ifndef NO_INLINE_STDARG
#define ObtainBestPen(a0, a1, a2, a3, tags...) \
({ULONG _tags[] = { tags }; ObtainBestPenA((a0), (a1), (a2), (a3), (struct TagItem *)_tags);})
#endif /* !NO_INLINE_STDARG */