+ default:
+ error("invalid compression method 'o%c'", *optarg);
+ return -1;
+ }
+ break;
+ case 'z':
+ compress_method = LZHUFF0_METHOD_NUM; /* Changed N.Watazaki */
+ break;
+ case 'i':
+ ignore_directory = TRUE;
+ break;
+ case 'x':
+ if (!optarg) {
+ error("exclude files does not specified for `-x'");
+ exit(2);
+ }
+
+ for (i = 0; exclude_files && exclude_files[i]; i++)
+ ;
+ exclude_files = (char**)xrealloc(exclude_files,
+ sizeof(char*) * (i+2));
+
+ if (*optarg == '=')
+ optarg++;
+ exclude_files[i] = optarg;
+ exclude_files[i+1] = 0;
+
+ break;
+ case 'w':
+ if (!optarg) {
+ error("working directory does not specified for `-w'");
+ exit(2);
+ }
+ if (*optarg == '=')
+ optarg++;
+
+ extract_directory = optarg;
+ break;
+ case '0':
+ header_level = 0;
+ break;
+ case '1':
+ header_level = 1;
+ break;
+ case '2':
+ header_level = 2;
+ break;
+ case SYSTEM_KANJI_CODE_OPTION:
+ if (!optarg) {
+ error("kanji code not specified for --%s",
+ long_options[option_index].name);
+ return -1;
+ }
+ if (strcmp(optarg, "euc") == 0) {
+ optional_system_kanji_code = CODE_EUC;
+ }
+ else if (strcmp(optarg, "sjis") == 0) {
+ optional_system_kanji_code = CODE_SJIS;
+ }
+ else if (strcmp(optarg, "utf8") == 0) {
+ optional_system_kanji_code = CODE_UTF8;
+ }
+ else if (strcmp(optarg, "cap") == 0) {
+ optional_system_kanji_code = CODE_CAP;
+ }
+ else {
+ error("unknown kanji code \"%s\"", optarg);
+ return -1;
+ }
+ break;
+
+ case ARCHIVE_KANJI_CODE_OPTION:
+ if (!optarg) {
+ error("kanji code not specified for --%s",
+ long_options[option_index].name);
+ return -1;
+ }
+ if (strcmp(optarg, "euc") == 0) {
+ optional_archive_kanji_code = CODE_EUC;
+ }
+ else if (strcmp(optarg, "sjis") == 0) {
+ optional_archive_kanji_code = CODE_SJIS;
+ }
+ else if (strcmp(optarg, "utf8") == 0) {
+ optional_archive_kanji_code = CODE_UTF8;
+ }
+ else if (strcmp(optarg, "cap") == 0) {
+ optional_archive_kanji_code = CODE_CAP;
+ }
+ else {
+ error("unknown kanji code \"%s\"", optarg);
+ return -1;
+ }
+ break;
+
+ case TRADITIONAL_BEHAVIOR:
+ convertcase = TRUE;
+ break;
+
+ case IGNORE_MAC_FILES:
+ /* ignore Mac specific files (._*, .DS_Store and Icon\r)
+ when archiving */
+ for (i = 0; exclude_files && exclude_files[i]; i++)
+ ;
+ exclude_files = (char**)xrealloc(exclude_files,
+ sizeof(char*) * (i+4));
+
+ exclude_files[i] = xstrdup("._*");
+ exclude_files[i+1] = xstrdup(".DS_Store");
+ exclude_files[i+2] = xstrdup("Icon\r");
+ exclude_files[i+3] = 0;
+ break;
+
+ case DEBUG_OPTION:
+ if (!optarg) {
+ error("debugging item is not specified for --%s",
+ long_options[option_index].name);
+ return -1;
+ }
+ if (strcmp(optarg, "nosort") == 0) {
+ sort_contents = FALSE;
+ }
+ else if (strcmp(optarg, "norecursion") == 0) {
+ recursive_archiving = FALSE;
+ }
+ else if (strcmp(optarg, "dumplzss") == 0) {
+ dump_lzss = TRUE;
+ quiet = TRUE;
+ }
+ else {
+ error("unknown debugging item \"%s\" for --%s",
+ optarg, long_options[option_index].name);
+ return -1;
+ }
+ break;
+
+ default:
+ error("unknown option `-%c'.", c);
+ return -1;
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (!archive_name) {
+ archive_name = *argv++;
+ argc--;
+ }
+
+ cmd_filec = argc;
+ cmd_filev = argv;
+
+ return 0;
+}
+
+/*
+ Parse LHA command and options.
+*/
+static int
+parse_option(int argc, char **argv)
+{
+ char *cmd_char;
+
+ if (argv[1] == NULL || strcmp(argv[1], "--help") == 0) {
+ print_usage();
+ exit(0);
+ }
+
+ if (strcmp(argv[1], "--version") == 0) {
+ print_version();
+ exit(0);
+ }
+
+ if (argc == 2 && *argv[1] != '-') {
+ archive_name = argv[1];
+ cmd = CMD_LIST;
+ cmd_filec = 0;
+ cmd_filev = 0;
+ return 0;
+ }
+
+ cmd_char = argv[1];
+
+ if (cmd_char[0] == '-')
+ cmd_char++;
+
+ /* parse commands */
+ switch (*cmd_char) {
+ case 'x':
+ case 'e':
+ cmd = CMD_EXTRACT;
+ break;
+
+ case 'p':
+ output_to_stdout = TRUE;
+ cmd = CMD_EXTRACT;
+ break;
+
+ case 'c':
+ new_archive = TRUE;
+ cmd = CMD_ADD;
+ break;
+
+ case 'a':
+ cmd = CMD_ADD;
+ break;
+
+ case 'd':
+ cmd = CMD_DELETE;
+ break;
+
+ case 'u':
+ update_if_newer = TRUE;
+ cmd = CMD_ADD;
+ break;
+
+ case 'm':
+ delete_after_append = TRUE;
+ cmd = CMD_ADD;
+ break;
+
+ case 'v':
+ verbose_listing = TRUE;
+ cmd = CMD_LIST;
+ break;
+
+ case 'l':
+ cmd = CMD_LIST;
+ break;
+
+ case 't':
+ cmd = CMD_EXTRACT;
+ verify_mode = TRUE;
+ break;
+
+ default:
+ error("unknown command `-%c'", *cmd_char);
+ return -1;
+ }
+
+ if (cmd_char[1] == '\0') {
+ /* argv[1] is command name */
+ argv[1] = argv[0];
+ argv++;
+ argc--;
+ }
+ else {
+ /* Eliminate command character
+ e.g.) lha cv foo.lzh -> lha -v foo.lzh
+ lha -cv foo.lzh -> lha -v foo.lzh
+ */
+ cmd_char[0] = '-';
+ argv[1] = cmd_char;
+ }
+
+ return parse_suboption(argc, argv);
+}
+
+/* ------------------------------------------------------------------------ */
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ char *p;
+
+ int i;
+
+ init_variable(); /* Added N.Watazaki */
+
+ if (parse_option(argc, argv) == -1) {
+ fputs("\n", stderr);
+ print_tiny_usage();
+ exit(2);
+ }
+
+ if (!archive_name) {
+ error("archive file does not specified");
+ fputs("\n", stderr);
+ print_tiny_usage();
+ exit(2);
+ }
+
+ if (!strcmp(archive_name, "-")) {
+ if (!isatty(1) && cmd == CMD_ADD)
+ quiet = TRUE;
+ }