home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Amiga / Workbench / Archivers / mpackWOS.lha / mpackppc / src / amigaunpk.c < prev    next >
C/C++ Source or Header  |  1998-04-22  |  7KB  |  189 lines

  1. /* (C) Copyright 1993 by Mike W. Meyer
  2.  *
  3.  * Permission to use, copy, modify, distribute, and sell this software
  4.  * and its documentation for any purpose is hereby granted without
  5.  * fee, provided that the above copyright notice appear in all copies
  6.  * and that both that copyright notice and this permission notice
  7.  * appear in supporting documentation, and that the name of Mike W.
  8.  * Meyer not be used in advertising or publicity pertaining to
  9.  * distribution of the software without specific, written prior
  10.  * permission.  Mike W. Meyer makes no representations about the
  11.  * suitability of this software for any purpose.  It is provided "as
  12.  * is" without express or implied warranty.
  13.  *
  14.  * MIKE W. MEYER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
  15.  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  16.  * FITNESS, IN NO EVENT SHALL MIKE W. MEYER BE LIABLE FOR ANY SPECIAL,
  17.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  18.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  19.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
  20.  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  21.  */
  22. #include <exec/types.h>
  23. #include <exec/execbase.h>
  24. #include <dos/dos.h>
  25. #ifndef __PPC__
  26. #include <libraries/netsupport.h>
  27. #endif
  28.  
  29. #ifdef __SASC
  30. #include <proto/exec.h>
  31. #include <proto/dos.h>
  32. #ifndef __PPC__
  33. #include <proto/netsupport.h>
  34. #endif
  35. #else
  36. #include <clib/exec_protos.h>
  37. #include <clib/dos_protos.h>
  38. //#include <clib/netsupport_protos.h>
  39. #endif
  40.  
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include <errno.h>
  45. #include "version.h"
  46.  
  47. extern int didchat;
  48. extern int overwrite_files;
  49.  
  50. #if defined(__SASC) && (__VERSION__ > 5) && (__REVISION__ > 50)
  51. static const char DOSId[] = "\0$VER: MPack " MPACK_VERSION " " __AMIGADATE__ ;
  52. #else
  53. static const char DOSId[] = "\0$VER: MPack " MPACK_VERSION " (" __DATE__ ")" ;
  54. #endif
  55.  
  56. int quiet ;
  57.  
  58. #define TEMPLATE        "Files/M,-f=Overwrite/S,-C=Directory/K,-q=Quiet/S,-t=Text/S"
  59. enum { FILES, OVERWRITE, DIRECTORY, QUIET, EXTRACTTEXT, OPT_COUNT } ;
  60. static struct RDArgs *args = NULL, *my_args = NULL ;
  61. BPTR    OldDir = NULL ;
  62.  
  63. #ifndef __PPC__
  64. struct NetSupportLibrary *NetSupportBase;
  65. #endif
  66.  
  67. #define HS1 "munpack version " MPACK_VERSION "\n"
  68. #define HS2 "Unpack input files. If no files are present, reads from standard in. The\n"
  69. #define HS3 "arguments other than file names are:\n"
  70. #define HS4 "-f=Overwrite/S          Causes the unpacked file to overwrite any existing\n"
  71. #define HS5 "                        files of the same name. Otherwise, an extension\n"
  72. #define HS6 "                        with a period and a number is added to the file\n"
  73. #define HS7 "                        name.\n"
  74. #define HS8 "-C=Directory/K          Change to the given directory before unpacking.\n"
  75. #define HS9 "                        Path names will be interpreted relative to the this\n"
  76. #define HS10 "                        directory, not the current one.\n"
  77. #define HS11 "-q=Quiet/S              Supress progress statements.\n"
  78. #define HS12 "-t=Text/S               Unpack the Text part fo multipart messages.\n"
  79.  
  80. char helpstuff[2048];
  81.  
  82. void warn(char *) ;
  83. void chat(char *) ;
  84.  
  85. void
  86. FreeSystem(void) {
  87.  
  88. #ifndef __PPC__
  89.         if (NetSupportBase) {
  90.                 UnLockFiles() ;
  91.                 CloseLibrary((struct Library *) NetSupportBase) ;
  92.                 }
  93. #endif
  94.  
  95.         if (args) FreeArgs(args) ;
  96.         if (my_args) FreeDosObject(DOS_RDARGS, args) ;
  97.         if (OldDir) UnLock(CurrentDir(OldDir)) ;
  98.         }
  99.  
  100. main(int argc, char **argv) {
  101.         long opts[OPT_COUNT] ;
  102.         FILE *file ;
  103.         int goodenough, extracttext ;
  104.         extern struct ExecBase *SysBase ;
  105.  
  106. #ifndef __PPC__
  107.         NetSupportBase = (struct NetSupportLibrary *) OldOpenLibrary(NETSUPPORTNAME) ;
  108. #endif
  109.  
  110.         goodenough = SysBase->LibNode.lib_Version > 36 ;
  111.  
  112.         /* Do the 2.x argument parsing stuff */
  113.         if (!goodenough) opts[FILES] = argc ;
  114.         else {
  115.                 memset((char *) opts, 0, sizeof(opts)) ;
  116.                 if (!(my_args = AllocDosObject(DOS_RDARGS, NULL))) {
  117.                         PrintFault(IoErr(), *argv) ;
  118.                         exit(RETURN_FAIL) ;
  119.                         }
  120.                 my_args->RDA_ExtHelp=&(helpstuff[0]);
  121.                 strcpy(my_args->RDA_ExtHelp,HS1);
  122.                 strcat(my_args->RDA_ExtHelp,HS2);
  123.                 strcat(my_args->RDA_ExtHelp,HS3);
  124.                 strcat(my_args->RDA_ExtHelp,HS4);
  125.                 strcat(my_args->RDA_ExtHelp,HS5);
  126.                 strcat(my_args->RDA_ExtHelp,HS6);
  127.                 strcat(my_args->RDA_ExtHelp,HS7);
  128.                 strcat(my_args->RDA_ExtHelp,HS8);
  129.                 strcat(my_args->RDA_ExtHelp,HS9);
  130.                 strcat(my_args->RDA_ExtHelp,HS10);
  131.                 strcat(my_args->RDA_ExtHelp,HS11);
  132.                 if (!(args = ReadArgs(TEMPLATE, opts, my_args))) {
  133.                         PrintFault(IoErr(), *argv) ;
  134.                         exit(RETURN_FAIL) ;
  135.                         }
  136.                 overwrite_files = opts[OVERWRITE] ;
  137.                 quiet = opts[QUIET] ;
  138.                 extracttext = opts[EXTRACTTEXT] ;
  139.                 if (opts[DIRECTORY])
  140.                         if (OldDir = Lock((char *) opts[DIRECTORY], SHARED_LOCK))
  141.                                 OldDir = CurrentDir(OldDir) ;
  142.                         else PrintFault(IoErr(), (char *) opts[DIRECTORY]) ;
  143.  
  144.                 argv = ((char **) opts[FILES]) - 1 ;
  145.                 }
  146.  
  147. #ifndef __PPC__
  148.         if (!NetSupportBase)
  149.                 fprintf(stdout, "Couldn't open NetSupport.Library: Can't parse configfiles.\n");
  150. #endif
  151.  
  152.         if (!opts[FILES]) {
  153.                 fprintf(stderr, "reading from standard input\n");
  154.                 didchat = 0;
  155.                 handleMessage(part_init(stdin), "text/plain", 0, extracttext,
  156.                         (struct boundary *) NULL) ;
  157.                 if (!didchat)
  158.                     fprintf(stdout,
  159.                             "Did not find anything to unpack from standard input\n");
  160.                 }
  161.         else {
  162.                 while (*++argv)
  163.                         if (!(file = fopen(*argv, "r")))
  164.                                 os_perror(*argv) ;
  165.                         else {
  166.                                 didchat = 0 ;
  167.                                 handleMessage(part_init(file), "text/plain", 0,
  168.                                 extracttext, (struct boundary *) NULL) ;
  169.                                 if (file) fclose(file) ;
  170.                                 if (!didchat)
  171.                                         fprintf(stdout,
  172.                                                 "Did not find anything to unpack from %s\n", *argv);
  173.                                 }
  174.                         }
  175.  
  176.         exit(0) ;
  177.         }
  178.  
  179. void
  180. warn(char *s) {
  181.     fprintf(stderr, "munpack: warning: %s\n", s);
  182. }
  183.  
  184. void
  185. chat(char *s) {
  186.         didchat = 1;
  187.         if (!quiet) fprintf(stderr, "munpack: %s\n", s);
  188.         }
  189.