home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / batch / dosreqtools / dosextensions / requestersrc / rtgetlong.c < prev    next >
C/C++ Source or Header  |  1994-11-16  |  8KB  |  285 lines

  1.  
  2. #include <dos/dos.h>
  3. #include <dos/rdargs.h>
  4. #include <clib/dos_protos.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <limits.h>
  8.  
  9. #include <libraries/reqtools.h>
  10.  
  11. #include <functions.h>
  12.  
  13. static char version_string[] = "$VER: rtGetLong 2.3 (16.11.94)";
  14.  
  15. char MyExtHelp[] =
  16. "\n"
  17. "Usage : rtGetLong\n"   
  18. "\n"
  19. " TITLE/A,BODY/A,BUTTONTEXT=BUTTON,DEFAULT/K,MIN/N/K,MAX/N/K,INVISIBLE/S,\n"
  20. " ALLOWEMPTY/S,CENTERTEXT=CENTER/S,HIGHLIGHTTEXT=HIGHLIGHT/S,BACKFILL/S,\n"
  21. " WIDTH/N/K,POSITION=POS/K,TOPOFFSET=TOP/N/K,LEFTOFFSET=LEFT/N/K,TO/K,PUBSCREEN/K\n"
  22. "\n"                    
  23. "Arguments:\n"
  24. "\n"
  25. "  TITLE     <text> - Title text for requester window.\n"
  26. "  BODY      <text> - Body text for requester window.\n"
  27. "  BUTTONTEXT <text> - Button text for requester window.\n"
  28. "  or BUTTON\n"
  29. "  DEFAULT    <text> - Initial value.\n"
  30. "  MIN        <num>  - Minimum allowed value.\n"
  31. "  MAX        <num>  - Maximum allowed value.\n"
  32. "  INVISIBLE         - Do not echo keypresses (useful for passwords etc.).\n"
  33. "  ALLOWEMPTY        - Empty string returns TRUE.\n"
  34. "  CENTERTEXT        - Center body text in requester window.\n"
  35. " >or CENTER\n"
  36. "  HIGHLIGHTTEXT     - Highlight body text in requester window.\n"
  37. " >or HIGHLIGHT\n"
  38. "  BACKFILL          - Turn on backfill.\n"
  39. "  WIDTH       <num> - Width of requester window. (ignored)\n"
  40. "  POSITION    <pos> - Open requester window at <pos>.  Permissible values are:\n"
  41. " >or POS              CENTERSCR, TOPLEFTSCR, CENTERWIN, TOPLEFTWIN, POINTER.\n"
  42. "  TOPOFFSET   <num> - Offset position relative to above.\n"
  43. " >or TOP\n"
  44. "  LEFFTOFFSET <num> - Offset position relative to above.\n"
  45. " >or LEFT\n"
  46. "  TO          <file>- Send result (string) to <file>.\n"
  47. "  PUBSCREEN <screen>- Public screen name.\n";
  48.  
  49.  
  50. #define TEMPLATE "TITLE/A,BODY/A,BUTTONTEXT=BUTTON,DEFAULT/N/K,MIN/N/K,MAX/N/K,INVISIBLE/S,CENTERTEXT=CENTER/S,HIGHLIGHTTEXT=HIGHLIGHT/S,BACKFILL/S,WIDTH/N/K,POSITION=POS/K,TOPOFFSET=TOP/N/K,LEFTOFFSET=LEFT/N/K,TO/K,PUBSCREEN/K"
  51.  
  52. #define OPT_TITLE  0
  53. #define OPT_BODY   1
  54. #define OPT_BUTTONTEXT 2
  55. #define OPT_DEFAULT 3
  56. #define OPT_MIN 4
  57. #define OPT_MAX 5
  58. #define OPT_INVISIBLE 6
  59. #define OPT_CENTERTEXT  7
  60. #define OPT_HIGHLIGHTTEXT 8
  61. #define OPT_BACKFILL 9
  62. #define OPT_WIDTH 10
  63. #define OPT_POSITION 11
  64. #define OPT_TOPOFFSET 12
  65. #define OPT_LEFTOFFSET 13
  66. #define OPT_TO 14
  67. #define OPT_PUBSCREEN 15
  68. #define OPT_COUNT 16
  69.  
  70. struct Library *ReqToolsBase;
  71.  
  72.  
  73. BOOL
  74. adjust (char *dest, char *src)
  75. {
  76.   char *s, *t;
  77.  
  78.   s = dest;
  79.  
  80.   if (src == NULL)        /* bypass */
  81.     return FALSE;
  82.  
  83.   while ((t = strchr (src, '\\')) && (*(t + 1) == 'n'))
  84.     {
  85.       while (src < t)
  86.     *s++ = *src++;
  87.  
  88.       *s++ = '\n';
  89.  
  90.       src++, src++;        /* bump source ptr .... twice */
  91.     }
  92.  
  93.   while (src[0])            /*** copy remainder of src ***/
  94.     *s++ = *src++;
  95.  
  96.   *s = '\0';
  97.  
  98.   return TRUE;
  99. }
  100.  
  101. int
  102. main (int argc, char **argv)
  103. {
  104.   int retval = 0;
  105.  
  106.   if (argc)
  107.     {
  108.       if ((argc == 2) && (stricmp (argv[1], "HELP") == 0))
  109.     {
  110.       fprintf (stdout, "%s", MyExtHelp);
  111.     }
  112.       else
  113.     {
  114.       /* My custom RDArgs */
  115.       struct RDArgs *myrda;
  116.  
  117.       /* Need to ask DOS for a RDArgs structure */
  118.       if (myrda = (struct RDArgs *) AllocDosObject (DOS_RDARGS, NULL))
  119.         {
  120.           /* The array of LONGs where ReadArgs() will store the data from
  121.              * the command line arguments.  C guarantees that all the array
  122.              * entries will be set to zero.
  123.            */
  124.           LONG *result[OPT_COUNT] =
  125.           {NULL};
  126.  
  127.           /* parse my command line */
  128.           if (ReadArgs (TEMPLATE, result, myrda))
  129.         {
  130.           if (ReqToolsBase = (struct Library *) OpenLibrary ("reqtools.library", LIBRARY_MINIMUM))
  131.             {
  132.               struct rtReqInfo *requester;
  133.  
  134.               if (requester = (struct rtReqInfo *) rtAllocRequest (RT_REQINFO, NULL))
  135.             {
  136.               LONG val;
  137.  
  138.               val = (result[OPT_DEFAULT]) ? *result[OPT_DEFAULT] : 0;
  139.  
  140.               /*
  141.                  * Take care of requester positioning -
  142.                  * These flags common to most rt requesters
  143.                */
  144.               if (stricmp (result[OPT_POSITION], "CENTERSCR") == 0)
  145.                 requester->ReqPos = REQPOS_CENTERSCR;
  146.               else if (stricmp (result[OPT_POSITION], "TOPLEFTSCR") == 0)
  147.                 requester->ReqPos = REQPOS_TOPLEFTSCR;
  148.               else if (stricmp (result[OPT_POSITION], "CENTERWIN") == 0)
  149.                 requester->ReqPos = REQPOS_CENTERWIN;
  150.               else if (stricmp (result[OPT_POSITION], "TOPLEFTWIN") == 0)
  151.                 requester->ReqPos = REQPOS_TOPLEFTWIN;
  152.               else
  153.                 requester->ReqPos = REQPOS_POINTER;
  154.  
  155.               /*
  156.                  * take care of some rtGetLong () requester specific flags
  157.                */
  158.               requester->Flags =
  159.                 ((result[OPT_HIGHLIGHTTEXT]) ? GLREQF_HIGHLIGHTTEXT : NULL) |
  160.                 ((result[OPT_CENTERTEXT]) ? GLREQF_CENTERTEXT : NULL);
  161.  
  162.               /*
  163.                  * Fix body text - Map *n to '\n'
  164.                */
  165.               adjust (result[OPT_BODY], result[OPT_BODY]);
  166.  
  167.               {
  168.                 struct Process *process = (struct Process *) FindTask (NULL);
  169.                 APTR windowptr = process->pr_WindowPtr;
  170.  
  171.                 /*
  172.                    * Tags will be used to take care of attributes not directly
  173.                    * settable in the rtReqInfo structure
  174.                  */
  175.  
  176.                 retval = rtGetLong (&val, (char *) result[OPT_TITLE], requester,
  177.  
  178.                 /*
  179.                    * set some rtGetLong() requrster specific tags
  180.                  */
  181.                         (result[OPT_BODY]) ? RTGL_TextFmt : TAG_IGNORE,
  182.                         result[OPT_BODY],
  183.                         (result[OPT_BUTTONTEXT]) ? RTGL_GadFmt : TAG_IGNORE,
  184.                         result[OPT_BUTTONTEXT],
  185.                   (result[OPT_MIN]) ? RTGL_Min : TAG_IGNORE,
  186.                         *result[OPT_MIN],
  187.                   (result[OPT_MAX]) ? RTGL_Max : TAG_IGNORE,
  188.                         *result[OPT_MAX],
  189.                         (result[OPT_INVISIBLE]) ? RTGL_Invisible : TAG_IGNORE,
  190.                         TRUE,
  191.                   (result[OPT_WIDTH]) ? RTGL_Width : TAG_IGNORE,
  192.                         *result[OPT_WIDTH],
  193.  
  194.                         RTGL_BackFill, (result[OPT_BACKFILL]) ? TRUE : FALSE,
  195.  
  196.                 /*
  197.                    * Finally,
  198.                    * set some more general tags shared by most requesters
  199.                  */
  200.                         RT_Underscore, '_',
  201.                         (result[OPT_TOPOFFSET]) ? RT_TopOffset : TAG_IGNORE,
  202.                         *result[OPT_TOPOFFSET],
  203.                         (result[OPT_LEFTOFFSET]) ? RT_LeftOffset : TAG_IGNORE,
  204.                         *result[OPT_LEFTOFFSET],
  205.                         (windowptr) ? RT_Window : TAG_IGNORE,
  206.                         windowptr,                
  207.                         (result[OPT_PUBSCREEN]) ? RT_PubScrName : TAG_IGNORE,
  208.                         result[OPT_PUBSCREEN],
  209.                         TAG_END);
  210.  
  211.                 if (result[OPT_TO])
  212.                   {
  213.                 FILE *file;
  214.  
  215.                 if (file = fopen (result[OPT_TO], "w"))
  216.                   {
  217.                     fprintf (file, "%ld\000", val);
  218.                     fclose (file);
  219.                   }
  220.                 else
  221.                   {
  222.                     /* something wrong here */
  223.                     fprintf (stderr, "rtGetLong: FALAL ERROR: Unable to open output file.\n");
  224.                     retval = 20;
  225.                   }
  226.                   }
  227.                 else
  228.                   {
  229.                 fprintf (stdout, "%ld\n", val);
  230.                   }
  231.               }
  232.  
  233.               rtFreeRequest (requester);
  234.             }
  235.               else
  236.             {
  237.               /* Unable to allocate request structure */
  238.               retval = 20;
  239.             }
  240.               CloseLibrary (ReqToolsBase);
  241.             }
  242.           else
  243.             {
  244.               /* Unable to open reqtools.library */
  245.               fprintf (stderr, "rtGetLong: Unable to open reqtools.library.\n");
  246.               retval = 20;
  247.             }
  248.           FreeArgs (myrda);
  249.         }
  250.           else
  251.         {
  252.           /*
  253.              * Something went wrong in the parse
  254.            */
  255.  
  256.           if ((result[OPT_TITLE] == NULL) || (result[OPT_BODY] == NULL))
  257.             {
  258.               fprintf (stderr, "rtGetLong: Required argument missing.\n");
  259.             }
  260.           else
  261.             {
  262.               /* something else is wrong */
  263.               fprintf (stderr, "rtGetLong: Command syntax error.\n");
  264.             }
  265.  
  266.           fprintf (stderr, "Try - rtGetLong help.\n");
  267.  
  268.           retval = 20;
  269.         }
  270.           FreeDosObject (DOS_RDARGS, myrda);
  271.         }
  272.       else
  273.         {
  274.           /* Unable to alloc readargs structure */
  275.           retval = 20;
  276.         }
  277.     }
  278.     }
  279.   else
  280.     {
  281.       /* We were started from workbench */
  282.     }
  283.   return (retval);
  284. }
  285.