5 * Revision 1.12 99/03/17 MU
6 * added the option -i to extract with .inf files
7 * Also added the .inf extension to the default logfile name for MSDOS
9 * $Header: main.c 1.11 95/08/01 $
11 * Revision 1.11 95/08/01 xx:xx:xx BB
12 * Fixed for Borland C/C++
13 * Added / as command line switch option for DOS
15 * Revision 1.10 93/08/20 12:39:28 arb
16 * Added support for ArcFS archive detection
18 * Revision 1.9 93/08/20 10:30:50 arb
19 * Added -C option for "convert filenames to lowercase"
21 * Revision 1.8 93/03/05 15:40:32 arb
22 * Added <stdlib.h> for RISCOS, needed for exit()
24 * Revision 1.7 92/12/09 09:43:03 duplain
25 * Changed "-a" option to "-T".
27 * Revision 1.6 92/12/08 10:19:30 duplain
28 * Added -a option for "append filetype".
30 * Revision 1.5 92/12/07 17:18:42 duplain
33 * Revision 1.4 92/10/19 09:33:09 duplain
34 * Added -x as an alternative to -u.
36 * Revision 1.3 92/10/01 11:21:39 duplain
39 * Revision 1.2 92/09/30 10:27:29 duplain
40 * Added logfile option and processing.
42 * Revision 1.1 92/09/29 18:02:20 duplain
52 /* BB changed next line */
63 /* BB changed next line */
66 #if defined(RISCOS) || defined(__MSDOS__)
68 #endif /* RISCOS || __MSDOS__ */
70 /* BB added next includes */
74 #endif /* __MSDOS__ */
76 char *ourname
; /* program name */
77 char *archive
; /* name of archive file */
80 /* MU changed the default log filename for MSDOS */
82 char *logfile
= "settypes.inf"; /* default name for log file */
85 char *logfile
= "settypes"; /* default name for log file */
88 char **files
; /* optional file arguments */
89 unsigned char unarc
= 0; /* -u or -x or I */
90 unsigned char inffiles
= 0; /* I */
91 unsigned char quiet
= 0; /* -q */
92 unsigned char verbose
= 0; /* -v */
93 unsigned char testing
= 0; /* -t */
94 unsigned char listing
= 0; /* -l */
95 unsigned char force
= 0; /* -f */
96 unsigned char stamp
= 1; /* -s */
97 unsigned char to_stdout
= 0; /* -c */
98 unsigned char retry
= 0; /* -R */
99 unsigned char apptype
= 0; /* -T */
100 unsigned char singlecase
= 0; /* -C */
103 unsigned char debugging
= 0; /* -D */
105 #endif /* DEBUGGING */
111 main(int argc
, char *argv
[])
115 /* BB extra switch indicator for command line parsing
116 DOS allows switches like /a/b/c which enters as one
119 int nextmaybeaswitch
;
125 * check types are defined correctly for this machine (or compiler ???)
127 if (sizeof(Word
) != 4)
129 error("Word size != 4");
132 if (sizeof(Halfword
) != 2)
134 error("Halfword size != 2");
137 if (sizeof(Byte
) != 1)
139 error("Byte size != 1");
143 #endif /* DEBUGGING */
144 ourname
= basename(*argv
++);
146 /* BB cosmetics for DOS: Strip extention .exe (or .com if
147 somebody would like to compile nspark to a .com) from
148 the ourname string. And convert it to lowercase. That
149 way it looks better than ``NSPARK.EXE: error ...''. */
151 /* For DOS prior to 3.0, argv[0] contains the NULL pointer.
152 So substitute a `default'. */
156 /* NB: stricmp == strcmpi == strcasecmp */
157 if (stricmp(&ourname
[strlen(ourname
) - 4], ".com") == 0
158 || stricmp(&ourname
[strlen(ourname
) - 4], ".exe") == 0)
161 /* We cannot write a '\0' into ourname because it points to
162 argv[0]. And that may be in a read-only data segment. */
164 if ((newname
= (char *) malloc(strlen(ourname
)) - 3) != NULL
)
166 strncpy(newname
, ourname
, strlen(ourname
) - 4);
167 newname
[strlen(ourname
) - 4] = '\0';
168 ourname
= newname
; /* Allocated space will be released
169 automatically at exit */
170 for (cp
= ourname
; *cp
; cp
++)
171 if (isascii(*cp
) && isupper(*cp
))
176 #endif /* __MSDOS__ */
180 * parse args (can't use getopt() 'cos not all C libraries have it)
187 /* BB changed next line */
188 /* if (*arg == '-') { */
190 if (*arg
== '-' || *arg
== '/')
197 #endif /* __MSDOS__ */
201 /* BB first char following a switch may not be another switch */
202 nextmaybeaswitch
= 0;
204 #endif /* __MSDOS__ */
205 while (!donext
&& !isspace(c
= *++arg
) && c
)
215 unarc
= 1; /* implied */
219 unarc
= 1; /* implied */
239 fprintf(stderr
, "%s v%s - maintained by %s - PUBLIC DOMAIN\n",
240 ourname
, VERSION
, MAINTAINER
);
270 #endif /* DEBUGGING */
272 /* BB DOS allows switches like /a/b/c */
274 if (nextmaybeaswitch
&& arg
[1] != '/')
277 else /* fall through to error message */
280 #endif /* __MSDOS__ */
290 set_password(*++argv
);
296 error("unknown option '%c'", c
);
301 /* BB We've had a valid switch, next char may be
303 nextmaybeaswitch
= 1;
305 #endif /* __MSDOS__ */
324 /* BB added next line */
325 return 0; /* Keep compiler happy. */
331 * display program usage and exit
336 fprintf(stderr
, "usage: %s [options] archive [file ... file]\n",
338 fprintf(stderr
, " where options are:\n");
340 " -u or -x unarchive -t test archive integrity\n");
341 fprintf(stderr
, " -l list archive contents -q quiet\n");
343 " -f force file overwrite -s no filestamp\n");
345 " -v verbose -V display version number\n");
347 " -R retry if archive corrupt -L<name> set logfile name\n");
349 " -T append filetype to name -C create lowercase filenames\n");
351 /* MU added instuctions for the -I option */
352 fprintf(stderr
, " -I unarchive with .inf files -p<password> set password\n");
353 fprintf(stderr
, " -c extract files to stdout\n");