home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 24 / AACD 24.iso / AACD / System / ReqToolsLib / Source / reqtools / reqtoolsami_init.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-02  |  8.7 KB  |  331 lines

  1. /*
  2.     (C) 1999 - 2001 AROS - The Amiga Research OS
  3.     $Id: reqtoolsami_init.c,v 1.3 2001/06/29 16:40:11 stegerg Exp $
  4.  
  5.     Desc: AmigaOS specific ReqTools initialization code.
  6.     Lang: English.
  7. */
  8.  
  9. /****************************************************************************************/
  10.  
  11. #include <exec/libraries.h>
  12. #include <exec/resident.h>
  13. #include <exec/execbase.h>
  14. #include <exec/tasks.h>
  15. #include <exec/memory.h>
  16. #include <libraries/reqtools.h>
  17. #include <intuition/classes.h>
  18. #include <proto/exec.h>
  19.  
  20. #include "reqtools_intern.h"
  21. #include "general.h"
  22. #include "rtfuncs.h"
  23.  
  24. #define VERSION 39
  25. #define REVISION 0
  26.  
  27. #define NAME_STRING      "reqtools.library"
  28. #define VERSION_STRING   "$VER: reqtools 39.0 (29.06.2001)\r\n"
  29.  
  30. /****************************************************************************************/
  31.  
  32. extern const char name[];
  33. extern const char version[];
  34. extern const APTR inittable[4];
  35. extern void *const functable[];
  36. extern struct IntReqToolsBase *libinit();
  37. extern const char libend;
  38.  
  39. /****************************************************************************************/
  40.  
  41. int entry(void)
  42. {
  43.   return -1;
  44. }
  45.  
  46. /****************************************************************************************/
  47.  
  48. const struct Resident ROMTag =
  49. {
  50.   RTC_MATCHWORD,
  51.   (struct Resident *)&ROMTag,
  52.   (APTR)&libend,
  53.   RTF_AUTOINIT,
  54.   VERSION,
  55.   NT_LIBRARY,
  56.   0,
  57.   (char *)name,
  58.   (char *)&version[6],
  59.   (ULONG *)inittable
  60. };
  61.  
  62. /****************************************************************************************/
  63.  
  64. const char name[]    = NAME_STRING;
  65. const char version[] = VERSION_STRING;
  66.  
  67. const APTR inittable[4] =
  68. {
  69.     (APTR)sizeof(struct IntReqToolsBase),
  70.     (APTR)functable,
  71.     NULL,
  72.     (APTR)&libinit
  73. };
  74.  
  75. /****************************************************************************************/
  76.  
  77. #define extern
  78. #include "globalvars.h"
  79. #undef extern
  80.  
  81. /****************************************************************************************/
  82.  
  83. struct IntReqToolsBase * SAVEDS ASM libinit(REGPARAM(d0, struct IntReqToolsBase *, RTBase),
  84.                                             REGPARAM(a0, BPTR, segList))
  85. {
  86.     ReqToolsBase = (struct ReqToolsBase *)RTBase;
  87.     RTBase->rt_SysBase = SysBase = *(struct ExecBase **)4L;
  88.     
  89.     ReqToolsBase->LibNode.lib_Node.ln_Type  = NT_LIBRARY;
  90.     ReqToolsBase->LibNode.lib_Node.ln_Name  = (char *)name;
  91.     ReqToolsBase->LibNode.lib_Flags         = LIBF_SUMUSED|LIBF_CHANGED;
  92.     ReqToolsBase->LibNode.lib_Version       = VERSION;
  93.     ReqToolsBase->LibNode.lib_Revision      = REVISION;
  94.     ReqToolsBase->LibNode.lib_IdString      = (char *)&version[6];
  95.     
  96.     return (struct IntReqToolsBase *)RTFuncs_Init(&RTBase->rt, segList);
  97. }
  98.  
  99. /****************************************************************************************/
  100.  
  101. extern ULONG ASM SAVEDS GetString (REGPARAM(a1, UBYTE *, stringbuff),
  102.                    REGPARAM(d0, LONG, maxlen),
  103.                    REGPARAM(a2, char *, title),
  104.                    REGPARAM(d1, ULONG, checksum),
  105.                    REGPARAM(d2, ULONG *, value),
  106.                    REGPARAM(d3, LONG, mode),
  107.                    REGPARAM(d4, struct rtReqInfo *, reqinfo),
  108.                    REGPARAM(a0, struct TagItem *, taglist));
  109.  
  110.  
  111. /****************************************************************************************/
  112.  
  113. #ifdef USE_STACKSWAP
  114.  
  115. /****************************************************************************************/
  116.  
  117. #ifdef _AROS
  118. #error No StackSwap support for AROS yet
  119. #endif
  120.  
  121. #ifndef __GNUC__
  122. #error Only StackSwap support for GCC compiler for now
  123. #endif
  124.  
  125. /****************************************************************************************/
  126.  
  127. struct MyStackSwapStruct
  128. {
  129.     struct StackSwapStruct  sss;
  130.     UBYTE                   *stringbuff;
  131.     LONG                    maxlen;
  132.     char                    *title;
  133.     ULONG                   checksum;
  134.     ULONG                   *value;
  135.     LONG                    mode;
  136.     struct rtReqInfo         *reqinfo;
  137.     struct TagItem          *taglist;
  138. };
  139.  
  140. #ifndef MIN_STACK
  141. #define MIN_STACK 4096
  142. #endif
  143.  
  144. /****************************************************************************************/
  145.  
  146. static ULONG CheckStack_GetString(UBYTE *stringbuff,
  147.                                   LONG maxlen,
  148.                   char *title,
  149.                   ULONG checksum,
  150.                   ULONG *value,
  151.                   LONG mode,
  152.                   struct rtReqInfo *reqinfo,
  153.                   struct TagItem *taglist)
  154. {
  155. /* I could not manage to get correct code to be generated when
  156.    using asm("a7") or asm("sp") to access sp!? :-( */
  157.    
  158. #define sp ((IPTR)(&sss))
  159.  
  160.     struct MyStackSwapStruct     sss;
  161.     struct MyStackSwapStruct     *sssptr asm("a3") = &sss;
  162.     struct Task                 *me = FindTask(NULL);
  163.     ULONG                       retval asm("d5") = 0;
  164.     
  165.     if ((sp <= (IPTR)me->tc_SPLower) ||
  166.         (sp >= (IPTR)me->tc_SPUpper) ||
  167.     (sp - MIN_STACK < (IPTR)me->tc_SPLower))
  168.     {
  169.         sssptr->sss.stk_Lower = AllocVec(MIN_STACK, MEMF_PUBLIC);
  170.     if (sssptr->sss.stk_Lower)
  171.     {
  172.         sssptr->sss.stk_Upper = ((IPTR)sssptr->sss.stk_Lower) + MIN_STACK;
  173.         sssptr->sss.stk_Pointer = sssptr->sss.stk_Upper;
  174.         
  175.         sssptr->stringbuff  = stringbuff;
  176.         sssptr->maxlen      = maxlen;
  177.         sssptr->title       = title;
  178.         sssptr->checksum     = checksum;
  179.         sssptr->value       = value;
  180.         sssptr->mode        = mode;
  181.         sssptr->reqinfo     = reqinfo;
  182.         sssptr->taglist     = taglist;
  183.         
  184.         StackSwap(&sssptr->sss);
  185.         
  186.             retval = GetString(sssptr->stringbuff,
  187.                            sssptr->maxlen,
  188.                    sssptr->title,
  189.                    sssptr->checksum,
  190.                    sssptr->value,
  191.                    sssptr->mode,
  192.                    sssptr->reqinfo,
  193.                    sssptr->taglist);
  194.                            
  195.         StackSwap(&sssptr->sss);
  196.         
  197.         FreeVec(sssptr->sss.stk_Lower);
  198.     }
  199.     }
  200.     else
  201.     {
  202.         retval = GetString(stringbuff, maxlen, title, checksum, value, mode, reqinfo, taglist);
  203.     }
  204.     
  205.     return retval;
  206. }
  207.  
  208. /****************************************************************************************/
  209.  
  210. #define GETSTRING CheckStack_GetString
  211.  
  212. #else
  213.  
  214. #define GETSTRING GetString
  215.  
  216. /****************************************************************************************/
  217.  
  218. #endif /* USE_STACKSWAP */
  219.  
  220. /****************************************************************************************/
  221.  
  222. ULONG SAVEDS ASM librtEZRequestA(REGPARAM(a1, char *, bodyfmt),
  223.                                  REGPARAM(a2, char *, gadfmt),
  224.                      REGPARAM(a3, struct rtReqInfo *, reqinfo),
  225.                      REGPARAM(a4, APTR, argarray),
  226.                      REGPARAM(a0, struct TagItem *, taglist))
  227. {
  228.     return GETSTRING(bodyfmt,
  229.                  (LONG)argarray,
  230.              gadfmt,
  231.              0,
  232.              NULL,
  233.              IS_EZREQUEST,
  234.              reqinfo,
  235.              taglist);
  236. }
  237.  
  238. /****************************************************************************************/
  239.  
  240. ULONG SAVEDS ASM librtGetStringA(REGPARAM(a1, UBYTE *, buffer),
  241.                                  REGPARAM(d0, ULONG, maxchars),
  242.                  REGPARAM(a2, char *, title),
  243.                  REGPARAM(a3, struct rtReqInfo *, reqinfo),
  244.                  REGPARAM(a0, struct TagItem *, taglist))
  245. {
  246.     return GETSTRING(buffer,
  247.                  maxchars,
  248.              title,
  249.              0,
  250.              NULL,
  251.              ENTER_STRING,
  252.              reqinfo,
  253.              taglist);
  254. }
  255.  
  256. /****************************************************************************************/
  257.  
  258. ULONG SAVEDS ASM librtGetLongA(REGPARAM(a1, ULONG *, longptr),
  259.                                REGPARAM(a2, char *, title),
  260.                    REGPARAM(a3, struct rtReqInfo *, reqinfo),
  261.                    REGPARAM(a0, struct TagItem *, taglist))
  262. {
  263.     return GETSTRING(NULL,
  264.                  0,
  265.              title,
  266.              0,
  267.              longptr,
  268.              ENTER_NUMBER,
  269.              reqinfo,
  270.              taglist);
  271. }
  272.  
  273. /****************************************************************************************/
  274.  
  275. extern void libopen(void);
  276. extern void libclose(void);
  277. extern void libexpunge(void);
  278. extern void libnull(void);
  279.  
  280. extern void AllocRequestA(void);
  281. extern void FreeRequest(void);
  282. extern void FreeReqBuffer(void);
  283. extern void ChangeReqAttrA(void);
  284. extern void FileRequestA(void);
  285. extern void FreeFileList(void);
  286. extern void PaletteRequestA(void);
  287. extern void GetVScreenSize(void);
  288.  
  289. /****************************************************************************************/
  290.  
  291. void *const functable[]=
  292. {
  293.     RTFuncs_Open,
  294.     RTFuncs_Close,
  295.     RTFuncs_Expunge,
  296.     RTFuncs_Null,
  297.     AllocRequestA,
  298.     FreeRequest,
  299.     FreeReqBuffer,
  300.     ChangeReqAttrA,
  301.     FileRequestA,
  302.     FreeFileList,
  303.     librtEZRequestA,
  304.     librtGetStringA,
  305.     librtGetLongA,
  306.     NULL,
  307.     NULL,
  308.     FileRequestA,
  309.     PaletteRequestA,
  310.     RTFuncs_rtReqHandlerA,
  311.     RTFuncs_rtSetWaitPointer,
  312.     GetVScreenSize,
  313.     RTFuncs_rtSetReqPosition,
  314.     RTFuncs_rtSpread,
  315.     RTFuncs_ScreenToFrontSafely,
  316.     FileRequestA,
  317.     RTFuncs_CloseWindowSafely,
  318.     RTFuncs_rtLockWindow,
  319.     RTFuncs_rtUnlockWindow,
  320.     RTFuncs_LockPrefs,
  321.     RTFuncs_UnlockPrefs,
  322.     (void *)-1L
  323. };
  324.  
  325. /****************************************************************************************/
  326.  
  327. const char libend = 0;
  328.  
  329. /****************************************************************************************/
  330.  
  331.