home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / comm / xprzmodem-3.1.lha / XprZmodem / Utils.c < prev    next >
C/C++ Source or Header  |  1993-12-21  |  38KB  |  1,311 lines

  1.  /**********************************************************************
  2.   * Utils.c: Miscellaneous support routines for xprzmodem.library;
  3.   * Version 2.10, 12 February 1991, by Rick Huebner.
  4.   * Released to the Public Domain; do as you like with this code.
  5.   *
  6.   * Version 2.50, 15 November 1991, by William M. Perkins.  Added code
  7.   * to update_rate() function in utils.c to avoid the Guru # 80000005
  8.   * you would have gotten if you had decided to adjust the system clock
  9.   * back during an upload or download.
  10.   *
  11.   * Mysprintf() function to replace sprintf() and proto code to use
  12.   * libinit.o and linent.o library code was supplied by Jim Cooper of SAS.
  13.   *
  14.   * Version 2.61, 3 July 1993 Mysprintf changed to xprsprintf(), written
  15.   * in Assembler, because under SAS/C the old code running not correctly.
  16.   *
  17.   * Version 2.62, 27 July 1993 build in variable Blocksize.
  18.   *
  19.   * Version 2.63, 30 July 1993 build in locale, by Rainer Hess
  20.   *
  21.   * Version 2.64,  3 Aug 1993 global vaiable Blocksize, now in
  22.   *                 struct Vars, by Rainer Hess
  23.   *
  24.   *                4 Aug 1993 changes in update_rate() function because
  25.   * it always GURU 8000 0005 on little files (testet with 2 byte-file)
  26.   * when you send. If on receiver the file exists when receiver ask for
  27.   * overwrite, the machine crash if you click overwrite on receiver.
  28.   * Testet on Term 3.4 -> Ncomm 2.0, by Rainer Hess
  29.   *
  30.   **********************************************************************/
  31.  
  32. #include "xprzmodem_all.h"
  33.  
  34. #define CATCOMP_NUMBERS
  35. #include "xprzmodem_catalog.h"
  36.  
  37. /*
  38.  * Transfer options to use if XProtocolSetup not called
  39.  */
  40.  
  41. struct SetupVars Default_Config =
  42. {
  43.   NULL,                /* = *matchptr  */
  44.   NULL,                /* = *bufpos    */
  45.   0,                /* = buflen     */
  46.   "C",                /* option_t[2]  */
  47.   "N",                /* option_o[2]  */
  48.   "16",                /* option_b[8]  */
  49.   "0",                /* option_f[8]  */
  50.   "10",                /* option_e[8]  */
  51.   "N",                /* option_s[4]  */
  52.   "N",                /* option_r[4]  */
  53.   "Y",                /* option_a[4]  */
  54.   "N",                /* option_d[4]  */
  55.   "Y",                /* option_k[4]  */
  56.   "",                /* option_p[256] */
  57.   "1024"            /* option_m[8]  */
  58. };
  59.  
  60. #ifdef DEBUGLOG
  61. UBYTE DebugName[] = "T:XDebug.Log";
  62. void *DebugLog = NULL;
  63. #endif
  64.  
  65. struct DosLibrary *DOSBase;
  66. struct ExecBase *SysBase;
  67.  
  68. #ifdef UP_TO_2X
  69. struct Library *UtilityBase;
  70. #endif
  71.  
  72. #define LIBRARY_ANY 0L
  73.  
  74. #define LocaleBase li.li_LocaleBase
  75. #define catalog    li.li_Catalog
  76.  
  77. struct LocaleInfo li;
  78.  
  79. struct TagItem LocalTags[3] =
  80. {
  81.   OC_BuiltInLanguage, (ULONG) "english",
  82.   OC_Version, 1,        /* Catalog-Nummer */
  83.   TAG_DONE
  84. };
  85.  
  86. /**********************************************************
  87.  *      int __UserLibInit(struct Library *libbase)
  88.  **********************************************************/
  89. int __saveds __asm
  90. __UserLibInit (register __a6 struct MyLibrary *libbase)
  91. {
  92.   SysBase = *(struct ExecBase **) 4L;
  93.   if (!(DOSBase = (struct DosLibrary *) OpenLibrary ("dos.library", LIBRARY_ANY)))
  94.     return (RETURN_FAIL);
  95.  
  96. #ifdef UP_TO_2X
  97.   if (!(UtilityBase = OpenLibrary ("utility.library", 37L)))
  98.     return (RETURN_FAIL);
  99. #endif
  100.  
  101.   if (LocaleBase = OpenLibrary ("locale.library", 38L))
  102.     catalog = OpenCatalogA (NULL, "xprzmodem.catalog", &LocalTags[0]);
  103.  
  104.   return (RETURN_OK);
  105. }                /* End of __UserLibInit() */
  106.  
  107. /**********************************************************
  108.  *      void __UserLibCleanup(struct Library *libbase)
  109.  **********************************************************/
  110. void __saveds __asm
  111. __UserLibCleanup (register __a6 struct MyLibrary *libbase)
  112. {
  113.   if (DOSBase)
  114.     CloseLibrary ((struct Library *) DOSBase);
  115.  
  116. #ifdef UP_TO_2X
  117.   if (UtilityBase)
  118.     CloseLibrary (UtilityBase);
  119. #endif
  120.  
  121.   if (LocaleBase)
  122.     {
  123.       if (catalog)
  124.     CloseCatalog (catalog);
  125.       CloseLibrary (LocaleBase);
  126.     }
  127. }                /* End of __UserLibCleanup() */
  128.  
  129. /**********************************************************
  130.  *      long XProtocolSetup(struct XPR_IO *xio)
  131.  *
  132.  * Called by comm program to set transfer options
  133.  **********************************************************/
  134. long __saveds __asm
  135. XProtocolSetup (register __a0 struct XPR_IO *xio)
  136. {
  137.   struct SetupVars *sv, tempsv;
  138.   struct xpr_option *option_ptrs[13];
  139.   struct xpr_option *optr, xo_hdr, xo_t, xo_o, xo_b, xo_f, xo_e, xo_s,
  140.     xo_r, xo_a, xo_d, xo_k, xo_p, xo_m;
  141.   UBYTE buf[256], *p;
  142.   long i, len;
  143.  
  144.   /* Allocate memory for transfer options string */
  145.   if (!(sv = (void *) xio->xpr_data))
  146.     {
  147.       xio->xpr_data = AllocMem ((ULONG) sizeof (struct SetupVars), MEMF_CLEAR);
  148.       if (!(sv = (void *) xio->xpr_data))
  149.     {
  150.       ioerr (xio, "Not enough memory!");
  151.       return XPRS_FAILURE;
  152.     }
  153.       /* Start out with default options; merge user changes into defaults */
  154.       *sv = Default_Config;
  155.     }
  156.  
  157.   /* If options string passed by comm prog, use it; else prompt user */
  158.   if (xio->xpr_filename)
  159.     strcpy (buf, xio->xpr_filename);
  160.   else
  161.     {
  162.       /* If xpr_options() implemented by comm program, use it */
  163.       if (xio->xpr_extension >= 1 && xio->xpr_options)
  164.     {
  165.       /*
  166.          * Let user edit temp copy of options so we can ignore invalid
  167.          * entries.  Have to init all this crud the hard way 'cause it's
  168.          * got to be on the stack in order to maintain reentrancy
  169.        */
  170.       tempsv = *sv;
  171.       xo_hdr.xpro_description = GetLocalString( &li, MSG_ZMODEM_OPTIONS );
  172.       xo_hdr.xpro_type = XPRO_HEADER;
  173.       xo_hdr.xpro_value = NULL;
  174.       xo_hdr.xpro_length = 0;
  175.       option_ptrs[0] = &xo_hdr;
  176.       xo_t.xpro_description = GetLocalString( &li, MSG_TEXT_MODE );
  177.       xo_t.xpro_type = XPRO_STRING;
  178.       xo_t.xpro_value = tempsv.option_t;
  179.       xo_t.xpro_length = sizeof (tempsv.option_t);
  180.       option_ptrs[1] = &xo_t;
  181.       xo_o.xpro_description = GetLocalString( &li, MSG_OVERWRITE_MODE );
  182.       xo_o.xpro_type = XPRO_STRING;
  183.       xo_o.xpro_value = tempsv.option_o;
  184.       xo_o.xpro_length = sizeof (tempsv.option_o);
  185.       option_ptrs[2] = &xo_o;
  186.       xo_b.xpro_description = GetLocalString( &li, MSG_IO_BUFFER_SIZE );
  187.       xo_b.xpro_type = XPRO_LONG;
  188.       xo_b.xpro_value = tempsv.option_b;
  189.       xo_b.xpro_length = sizeof (tempsv.option_b);
  190.       option_ptrs[3] = &xo_b;
  191.       xo_f.xpro_description = GetLocalString( &li, MSG_FRAME_SIZE );
  192.       xo_f.xpro_type = XPRO_LONG;
  193.       xo_f.xpro_value = tempsv.option_f;
  194.       xo_f.xpro_length = sizeof (tempsv.option_f);
  195.       option_ptrs[4] = &xo_f;
  196.       xo_e.xpro_description = GetLocalString( &li, MSG_ERROR_LIMIT );
  197.       xo_e.xpro_type = XPRO_LONG;
  198.       xo_e.xpro_value = tempsv.option_e;
  199.       xo_e.xpro_length = sizeof (tempsv.option_e);
  200.       option_ptrs[5] = &xo_e;
  201.       xo_a.xpro_description = GetLocalString( &li, MSG_AUTO_ACTIVATE_RECEIVER );
  202.       xo_a.xpro_type = XPRO_BOOLEAN;
  203.       xo_a.xpro_value = tempsv.option_a;
  204.       xo_a.xpro_length = sizeof (tempsv.option_a);
  205.       option_ptrs[6] = &xo_a;
  206.       xo_d.xpro_description = GetLocalString( &li, MSG_DELETE_AFTER_SENDING );
  207.       xo_d.xpro_type = XPRO_BOOLEAN;
  208.       xo_d.xpro_value = tempsv.option_d;
  209.       xo_d.xpro_length = sizeof (tempsv.option_d);
  210.       option_ptrs[7] = &xo_d;
  211.       xo_k.xpro_description = GetLocalString( &li, MSG_KEEP_PARTIAL_FILES );
  212.       xo_k.xpro_type = XPRO_BOOLEAN;
  213.       xo_k.xpro_value = tempsv.option_k;
  214.       xo_k.xpro_length = sizeof (tempsv.option_k);
  215.       option_ptrs[8] = &xo_k;
  216.       xo_s.xpro_description = GetLocalString( &li, MSG_SEND_FULL_PATH );
  217.       xo_s.xpro_type = XPRO_BOOLEAN;
  218.       xo_s.xpro_value = tempsv.option_s;
  219.       xo_s.xpro_length = sizeof (tempsv.option_s);
  220.       option_ptrs[9] = &xo_s;
  221.       xo_r.xpro_description = GetLocalString( &li, MSG_USE_RECEIVED_PATH );
  222.       xo_r.xpro_type = XPRO_BOOLEAN;
  223.       xo_r.xpro_value = tempsv.option_r;
  224.       xo_r.xpro_length = sizeof (tempsv.option_r);
  225.       option_ptrs[10] = &xo_r;
  226.       xo_p.xpro_description = GetLocalString( &li, MSG_DEFAULT_RECEIVE_PATH );
  227.       xo_p.xpro_type = XPRO_STRING;
  228.       xo_p.xpro_value = tempsv.option_p;
  229.       xo_p.xpro_length = sizeof (tempsv.option_p);
  230.       option_ptrs[11] = &xo_p;
  231.       xo_m.xpro_description = GetLocalString( &li, MSG_MAXIMUM_BLOCK_SIZE );
  232.       xo_m.xpro_type = XPRO_LONG;
  233.       xo_m.xpro_value = tempsv.option_m;
  234.       xo_m.xpro_length = sizeof (tempsv.option_m);
  235.       option_ptrs[12] = &xo_m;
  236.  
  237.       /* Convert Y/N used elsewhere into "yes"/"no" required by spec */
  238.       for (i = 6; i <= 10; ++i)
  239.         {
  240.           optr = option_ptrs[i];
  241.           strcpy (optr->xpro_value, (*optr->xpro_value == 'Y') ? "yes" :