home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / misc / advice.lha / Advice / src / advice.c
Encoding:
C/C++ Source or Header  |  1995-01-12  |  6.7 KB  |  276 lines

  1.  
  2. #include <dos/dos.h>
  3. #include <dos/rdargs.h>
  4. #include <clib/dos_protos.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <exec/lists.h>
  9.  
  10. #include <libraries/reqtools.h>
  11.  
  12. #include <functions.h>
  13.  
  14. static char version_string[] = "$VER: Advice 2.4 (11.1.95)";
  15.  
  16. char MyExtHelp[] =
  17. "\n"
  18. "Usage : Advice\n"
  19. "\n"
  20. " TITLE/A,BODY/A,BUTTONTEXT=BUTTON,DEFAULT/N/K,CENTERTEXT/S,NORETURNKEY/S,\n"
  21. " POSITION=POS/K,TOPOFFSET=TOP/N/K,LEFTOFFSET=LEFT/N/K,PUBSCREEN/K\n"
  22. "\n"
  23. "Arguments:\n"
  24. "\n"
  25. "  TITLE      <text> - Title text for requester window.\n"
  26. "  BODY       <file> - Body text for requester window.\n"
  27. "  BUTTONTEXT <text> - Button text for requester window. (default \"Ok|Cancel\")\n"
  28. "  or BUTTON\n"
  29. "  DEFAULT     <num> - Default response if [RETURN] key pressed w/o selection.\n"
  30. "  CENTERTEXT        - Center body text in requester window.\n"
  31. " >or CENTER\n"
  32. "  NORETURNKEY       - Turn off [RETURN] key as positive response.\n"
  33. "  POSITION    <pos> - Open requester window at <pos>.  Permissible values are:\n"
  34. " >or POS              CENTERSCR, TOPLEFTSCR, CENTERWIN, TOPLEFTWIN, POINTER.\n"
  35. "  TOPOFFSET   <num> - Offset position relative to above.\n"
  36. " >or TOP\n"
  37. "  LEFFTOFFSET <num> - Offset position relative to above.\n"
  38. " >or LEFT\n"
  39. "  PUBSCREEN <screen>- Public screen name.\n";
  40.  
  41. #define TEMPLATE "TITLE/A,BODY/A,BUTTONTEXT=BUTTON,DEFAULT/N/K,CENTERTEXT=CENTER/S,NORETURNKEY/S,POSITION=POS/K,TOPOFFSET=TOP/N/K,LEFTOFFSET=LEFT/N/K,PUBSCREEN/K"
  42.  
  43. #define OPT_TITLE  0
  44. #define OPT_BODY   1
  45. #define OPT_BUTTONTEXT 2
  46. #define OPT_DEFAULT 3
  47. #define OPT_CENTERTEXT 4
  48. #define OPT_NORETURNKEY 5
  49. #define OPT_POSITION 6
  50. #define OPT_TOPOFFSET 7
  51. #define OPT_LEFTOFFSET 8
  52. #define OPT_PUBSCREEN 9
  53.  
  54. #define OPT_COUNT 10
  55.  
  56. struct Library *ReqToolsBase;
  57.  
  58.  
  59. int
  60. main (int argc, char **argv)
  61. {
  62.   int retval = 0;
  63.  
  64.   if (argc)
  65.     {
  66.       if ((argc == 2) && (stricmp (argv[1], "HELP") == 0))
  67.     {
  68.       fprintf (stdout, "%s", MyExtHelp);
  69.     }
  70.       else
  71.     {
  72.       /* My custom RDArgs */
  73.       struct RDArgs *myrda;
  74.  
  75.       /* Need to ask DOS for a RDArgs structure */
  76.       if (myrda = (struct RDArgs *) AllocDosObject (DOS_RDARGS, NULL))
  77.         {
  78.           /* The array of LONGs where ReadArgs() will store the data from
  79.            * the command line arguments.  C guarantees that all the array
  80.            * entries will be set to zero.
  81.            */
  82.           LONG *result[OPT_COUNT] =
  83.           {NULL};
  84.  
  85.           /* parse my command line */
  86.           if (ReadArgs (TEMPLATE, result, myrda))
  87.         {
  88.           if (ReqToolsBase = (struct Library *) OpenLibrary ("reqtools.library", LIBRARY_MINIMUM))
  89.             {
  90.               struct rtReqInfo *requester;
  91.  
  92.               if (requester = (struct rtReqInfo *) rtAllocRequest (RT_REQINFO, NULL))
  93.             {
  94.  
  95.               char *body_text;
  96.  
  97.               requester->ReqTitle = (result[OPT_TITLE])
  98.                 ? (char *) result[OPT_TITLE] : "Request";
  99.  
  100.               if (result[OPT_BODY])
  101.                 {
  102.                   ULONG needed_buf_size = 0;
  103.  
  104.                   FILE *fd;
  105.  
  106.                   if (fd = fopen (result[OPT_BODY], "r"))
  107.                 {
  108.                   char c;
  109.  
  110.                   while ((c = fgetc (fd)) != EOF)
  111.                     {
  112.                       if (c = '\n')
  113.                     needed_buf_size += 2;
  114.                       else
  115.                     needed_buf_size += 1;
  116.                     }
  117.  
  118.                   needed_buf_size += 1;
  119.  
  120.                   fclose (fd);
  121.                 }
  122.                   else
  123.                 {
  124.                   /* unable to open body text file */
  125.  
  126.                   fprintf (stderr, "Advice: unable to open input file - %s\n", result[OPT_BODY]);
  127.                   retval = 21;
  128.                 }
  129.  
  130.  
  131.                   if ((retval == 0) && (needed_buf_size) && (body_text = malloc (needed_buf_size + 1)))
  132.                 {
  133.                   char *buf_ptr = body_text;
  134.  
  135.                   {
  136.                     FILE *fd;
  137.  
  138.                     if (fd = fopen (result[OPT_BODY], "r"))
  139.                       {
  140.                     char c;
  141.  
  142.                     while ((c = fgetc (fd)) != EOF)
  143.                       {
  144.                           {
  145.                         *buf_ptr++ = c;
  146.                           }
  147.                       }
  148.  
  149.                     fclose (fd);
  150.                       }
  151.                     else
  152.                       {
  153.                     /* unable to open body text file */
  154.                     retval = 21;
  155.                       }
  156.                   }
  157.  
  158.                   *buf_ptr = '\0';    /* terminate body_text buffer */
  159.                 }
  160.                 }
  161.  
  162.  
  163.               /*
  164.                * Take care of requester positioning
  165.                */
  166.               if (stricmp (result[OPT_POSITION], "POINTER") == 0)
  167.                 requester->ReqPos = REQPOS_POINTER;
  168.               if (stricmp (result[OPT_POSITION], "CENTERSCR") == 0)
  169.                 requester->ReqPos = REQPOS_CENTERSCR;
  170.               else if (stricmp (result[OPT_POSITION], "TOPLEFTSCR") == 0)
  171.                 requester->ReqPos = REQPOS_TOPLEFTSCR;
  172.               else if (stricmp (result[OPT_POSITION], "CENTERWIN") == 0)
  173.                 requester->ReqPos = REQPOS_CENTERWIN;
  174.               else if (stricmp (result[OPT_POSITION], "TOPLEFTWIN") == 0)
  175.                 requester->ReqPos = REQPOS_TOPLEFTWIN;
  176.               else
  177.                 requester->ReqPos = REQPOS_CENTERSCR;
  178.  
  179.  
  180.               requester->Flags =
  181.                 ((result[OPT_CENTERTEXT]) ? EZREQF_CENTERTEXT : NULL) |
  182.                 ((result[OPT_NORETURNKEY]) ? EZREQF_NORETURNKEY : NULL);
  183.  
  184.  
  185.  
  186.               if (retval == 0)
  187.               {
  188.                 struct Process *process = (struct Process *) FindTask (NULL);
  189.                 APTR windowptr = process->pr_WindowPtr;
  190.  
  191.                 /*
  192.                  * Tags will be used to take care ofattributes not directly
  193.                  * settable in the rtReqInfo structure
  194.                  */
  195.  
  196.                 retval = rtEZRequestTags ((body_text) ? (char *) body_text : (char *) NULL,
  197.                             (result[OPT_BUTTONTEXT])
  198.                 ? (char *) result[OPT_BUTTONTEXT] : "_Continue",
  199.                               requester, NULL,
  200.                               (result[OPT_DEFAULT]) ? RTEZ_DefaultResponse : TAG_IGNORE,
  201.                               *result[OPT_DEFAULT],
  202.  
  203.                 /*
  204.                  * Finally,
  205.                  * set some more general tags shared by most requesters
  206.                  */
  207.                               RT_Underscore, '_',
  208.                               (result[OPT_TOPOFFSET]) ? RT_TopOffset : TAG_IGNORE,
  209.                               *result[OPT_TOPOFFSET],
  210.                               (result[OPT_LEFTOFFSET]) ? RT_LeftOffset : TAG_IGNORE,
  211.                             *result[OPT_LEFTOFFSET],
  212.                        (windowptr) ? RT_Window : TAG_IGNORE,
  213.                               windowptr,
  214.                               (result[OPT_PUBSCREEN]) ? RT_PubScrName : TAG_IGNORE,
  215.                               result[OPT_PUBSCREEN],
  216.                               TAG_END);
  217.  
  218.               }
  219.  
  220.               if (body_text)
  221.                 free (body_text);
  222.  
  223.               rtFreeRequest (requester);
  224.             }
  225.               else
  226.             {
  227.               /* Unable to allocate request structure */
  228.               retval = 21;
  229.             }
  230.               CloseLibrary (ReqToolsBase);
  231.             }
  232.           else
  233.             {
  234.               /* Unable to open reqtools.library */
  235.               fprintf (stderr, "\nAdvice: Unable to open reqtools.library.\n");
  236.  
  237.               retval = 21;
  238.             }
  239.           FreeArgs (myrda);
  240.         }
  241.           else
  242.         {
  243.           /*
  244.            * Something went wrong in the parse
  245.            */
  246.  
  247.           if ((result[OPT_TITLE] == NULL) || (result[OPT_BODY] == NULL))
  248.             {
  249.               fprintf (stderr, "\nAdvice: Required argument missing.\n\n");
  250.             }
  251.           else
  252.             {
  253.               fprintf (stderr, "\nAdvice: Command syntax error.\n\n");
  254.             }
  255.  
  256.           fprintf (stderr, "Try - Advice help.\n");
  257.  
  258.           retval = 21;
  259.         }
  260.           FreeDosObject (DOS_RDARGS, myrda);
  261.         }
  262.       else
  263.         {
  264.           retval = 21;
  265.         }
  266.     }
  267.     }
  268.   else
  269.     {
  270.       /* we got launched from WB */
  271.       retval = 21;
  272.     }
  273.  
  274.   return (retval);
  275. }
  276.