extern void list_file(const char *filename) { if (opt_format != FORMAT_XZ && opt_format != FORMAT_AUTO) message_fatal(_("--list works only on .xz files " "(--format=xz or --format=auto)")); message_filename(filename); if (filename == stdin_filename) { message_error(_("--list does not support reading from " "standard input")); return; } // Unset opt_stdout so that io_open_src() won't accept special files. // Set opt_force so that io_open_src() will follow symlinks. opt_stdout = false; opt_force = true; file_pair *pair = io_open_src(filename); if (pair == NULL) return; xz_file_info xfi = XZ_FILE_INFO_INIT; if (!parse_indexes(&xfi, pair)) { bool fail; // We have three main modes: // - --robot, which has submodes if --verbose is specified // once or twice // - Normal --list without --verbose // - --list with one or two --verbose if (opt_robot) fail = print_info_robot(&xfi, pair); else if (message_verbosity_get() <= V_WARNING) fail = print_info_basic(&xfi, pair); else fail = print_info_adv(&xfi, pair); // Update the totals that are displayed after all // the individual files have been listed. Don't count // broken files. if (!fail) update_totals(&xfi); lzma_index_end(xfi.idx, NULL); } io_close(pair, false); return; }
int32 model_def_read(model_def_t **out_model_def, const char *file_name) { char buf[BIG_STR_LEN]; uint32 n; char tag[32]; acmod_set_t *acmod_set; uint32 i, j; acmod_id_t acmod_id; uint32 tmat; uint32 n_state; uint32 n_tri; uint32 n_base; uint32 n_total_map; uint32 n_tied_state; uint32 n_tied_ci_state; uint32 n_tied_tmat; uint32 state[MAX_N_STATE]; uint32 n_read = 0; uint32 n_total; model_def_t *omd; model_def_entry_t *mdef; uint32 *all_state; uint32 max_tmat; uint32 max_state; uint32 max_ci_state; FILE *fp; fp = fopen(file_name, "r"); if (fp == NULL) { E_WARN_SYSTEM("Unable to open %s for reading", file_name); return S3_ERROR; } if (read_line(buf, BIG_STR_LEN, &n_read, fp) == NULL) { E_ERROR("ERROR not even a version number in %s!?\n", file_name); fclose(fp); return S3_ERROR; } if (strcmp(buf, MODEL_DEF_VERSION) != 0) { E_ERROR("ERROR version(%s) == \"%s\", but expected %s at line %d.\n", file_name, buf, MODEL_DEF_VERSION, n_read); fclose(fp); if (strcmp(buf, "0.1") == 0) { E_ERROR("You must add an attribute field to all the model records. See SPHINX-III File Formats manual\n"); } if (strcmp(buf, "0.2") == 0) { E_ERROR("You must add n_tied_state, n_tied_ci_state and n_tied_tmat definitions at the head of the file. See /net/alf19/usr2/eht/s3/cvtmdef.csh\n"); } return S3_ERROR; } n_tri = n_base = n_total_map = n_tied_state = n_tied_ci_state = n_tied_tmat = NO_NUMBER; for ( i = 0; i < 6; i++) { if (read_line(buf, BIG_STR_LEN, &n_read, fp) == NULL) { E_ERROR("Incomplete count information in %s!?\n", file_name); fclose(fp); return S3_ERROR; } sscanf(buf, "%u %s", &n, tag); if (strcmp(tag, "n_base") == 0) { n_base = n; } else if (strcmp(tag, "n_tri") == 0) { n_tri = n; } else if (strcmp(tag, "n_state_map") == 0) { n_total_map = n; } else if (strcmp(tag, "n_tied_state") == 0) { n_tied_state = n; } else if (strcmp(tag, "n_tied_ci_state") == 0) { n_tied_ci_state = n; } else if (strcmp(tag, "n_tied_tmat") == 0) { n_tied_tmat = n; } else { E_ERROR("Unknown tag %s in file at line %d\n", tag, n_read); fclose(fp); return S3_ERROR; } } *out_model_def = omd = ckd_calloc(1, sizeof(model_def_t)); omd->acmod_set = acmod_set = acmod_set_new(); /* give the acmod_set module some storage allocation requirements */ acmod_set_set_n_ci_hint(acmod_set, n_base); acmod_set_set_n_tri_hint(acmod_set, n_tri); n_total = n_base + n_tri; omd->defn = mdef = ckd_calloc(n_total, sizeof(model_def_entry_t)); omd->n_total_state = n_total_map; all_state = ckd_calloc(n_total_map, sizeof(uint32)); omd->n_tied_ci_state = n_tied_ci_state; omd->n_tied_state = n_tied_state; omd->n_tied_tmat = n_tied_tmat; omd->max_n_state = 0; omd->min_n_state = MAX_N_STATE; for (i = 0, j = 0, max_state = 0, max_ci_state = 0, max_tmat = 0; i < n_base; i++, j += n_state) { n_state = MAX_N_STATE; if (parse_base_line(&acmod_id, &tmat, state, &n_state, acmod_set, &n_read, fp) != S3_SUCCESS) { fclose(fp); return S3_ERROR; } mdef[i].p = acmod_id; mdef[i].tmat = tmat; mdef[i].n_state = n_state; mdef[i].state = &all_state[j]; memcpy((char *)mdef[i].state, (const char *)state, n_state * sizeof(uint32)); update_totals(omd, &mdef[i]); } for (; i < n_total; i++, j += n_state) { n_state = MAX_N_STATE; if (parse_tri_line(&acmod_id, &tmat, state, &n_state, acmod_set, &n_read, fp) != S3_SUCCESS) { fclose(fp); return S3_ERROR; } mdef[i].p = acmod_id; mdef[i].tmat = tmat; mdef[i].n_state = n_state; mdef[i].state = &all_state[j]; memcpy((char *)mdef[i].state, (const char *)state, n_state * sizeof(uint32)); update_totals(omd, &mdef[i]); } omd->n_defn = n_total; assert(j == n_total_map); E_INFO("Model definition info:\n"); E_INFO("%u total models defined (%u base, %u tri)\n", omd->n_defn, n_base, n_tri); E_INFO("%u total states\n", omd->n_total_state); E_INFO("%u total tied states\n", omd->n_tied_state); E_INFO("%u total tied CI states\n", omd->n_tied_ci_state); E_INFO("%u total tied transition matrices\n", omd->n_tied_tmat); E_INFO("%u max state/model\n", omd->max_n_state); E_INFO("%u min state/model\n", omd->min_n_state); fclose(fp); return S3_SUCCESS; }