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