⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comp_parse.c

📁 ncurses 库 可能有用酒用 没用就算了 我觉得还可以用
💻 C
📖 第 1 页 / 共 2 页
字号:
		    multiples++;		}		if (matchcount >= 1)		    (void) fprintf(stderr, " %s", _nc_first_name(rp->tterm.term_names));	    }	}	if (matchcount >= 1)	    (void) putc('\n', stderr);    }    if (multiples > 0)	return (FALSE);    DEBUG(2, ("NO MULTIPLE NAME OCCURRENCES"));    /*     * First resolution stage: compute link pointers corresponding to names.     */    total_unresolved = 0;    _nc_curr_col = -1;    for_entry_list(qp) {	unresolved = 0;	for (i = 0; i < qp->nuses; i++) {	    bool foundit;	    char *child = _nc_first_name(qp->tterm.term_names);	    char *lookfor = qp->uses[i].name;	    long lookline = qp->uses[i].line;	    foundit = FALSE;	    _nc_set_type(child);	    /* first, try to resolve from in-core records */	    for_entry_list(rp) {		if (rp != qp		    && _nc_name_match(rp->tterm.term_names, lookfor, "|")) {		    DEBUG(2, ("%s: resolving use=%s (in core)",			      child, lookfor));		    qp->uses[i].link = rp;		    foundit = TRUE;		}	    }	    /* if that didn't work, try to merge in a compiled entry */	    if (!foundit) {		TERMTYPE thisterm;		char filename[PATH_MAX];		memset(&thisterm, 0, sizeof(thisterm));		if (_nc_read_entry(lookfor, filename, &thisterm) == 1) {		    DEBUG(2, ("%s: resolving use=%s (compiled)",			      child, lookfor));		    rp = typeMalloc(ENTRY, 1);		    if (rp == 0)			_nc_err_abort(MSG_NO_MEMORY);		    rp->tterm = thisterm;		    rp->nuses = 0;		    rp->next = lastread;		    lastread = rp;		    qp->uses[i].link = rp;		    foundit = TRUE;		}	    }	    /* no good, mark this one unresolvable and complain */	    if (!foundit) {		unresolved++;		total_unresolved++;		_nc_curr_line = lookline;		_nc_warning("resolution of use=%s failed", lookfor);		qp->uses[i].link = 0;	    }	}    }    if (total_unresolved) {	/* free entries read in off disk */	_nc_free_entries(lastread);	return (FALSE);    }    DEBUG(2, ("NAME RESOLUTION COMPLETED OK"));    /*     * OK, at this point all (char *) references in `name' members     * have been successfully converted to (ENTRY *) pointers in     * `link' members.  Time to do the actual merges.     */    if (fullresolve) {	do {	    TERMTYPE merged;	    keepgoing = FALSE;	    for_entry_list(qp) {		if (qp->nuses > 0) {		    DEBUG(2, ("%s: attempting merge",			      _nc_first_name(qp->tterm.term_names)));		    /*		     * If any of the use entries we're looking for is		     * incomplete, punt.  We'll catch this entry on a		     * subsequent pass.		     */		    for (i = 0; i < qp->nuses; i++)			if (qp->uses[i].link->nuses) {			    DEBUG(2, ("%s: use entry %d unresolved",				      _nc_first_name(qp->tterm.term_names), i));			    goto incomplete;			}		    /*		       * First, make sure there's no garbage in the		       * merge block.  as a side effect, copy into		       * the merged entry the name field and string		       * table pointer.		     */		    _nc_copy_termtype(&merged, &(qp->tterm));		    /*		     * Now merge in each use entry in the proper		     * (reverse) order.		     */		    for (; qp->nuses; qp->nuses--)			_nc_merge_entry(&merged,					&qp->uses[qp->nuses - 1].link->tterm);		    /*		     * Now merge in the original entry.		     */		    _nc_merge_entry(&merged, &qp->tterm);		    /*		     * Replace the original entry with the merged one.		     */		    FreeIfNeeded(qp->tterm.Booleans);		    FreeIfNeeded(qp->tterm.Numbers);		    FreeIfNeeded(qp->tterm.Strings);		    qp->tterm = merged;		    _nc_wrap_entry(qp, TRUE);		    /*		     * We know every entry is resolvable because name resolution		     * didn't bomb.  So go back for another pass.		     */		    /* FALLTHRU */		  incomplete:		    keepgoing = TRUE;		}	    }	} while	    (keepgoing);	DEBUG(2, ("MERGES COMPLETED OK"));    }    /*     * We'd like to free entries read in off disk at this point, but can't.     * The merge_entry() code doesn't copy the strings in the use entries,     * it just aliases them.  If this ever changes, do a     * free_entries(lastread) here.     */    DEBUG(2, ("RESOLUTION FINISHED"));    if (fullresolve)	if (_nc_check_termtype != 0) {	    _nc_curr_col = -1;	    for_entry_list(qp) {		_nc_curr_line = qp->startline;		_nc_set_type(_nc_first_name(qp->tterm.term_names));		_nc_check_termtype2(&qp->tterm, literal);	    }	    DEBUG(2, ("SANITY CHECK FINISHED"));	}    return (TRUE);}/* obsolete: 20040705 */NCURSES_EXPORT(int)_nc_resolve_uses(bool fullresolve){    return _nc_resolve_uses2(fullresolve, FALSE);}/* * This bit of legerdemain turns all the terminfo variable names into * references to locations in the arrays Booleans, Numbers, and Strings --- * precisely what's needed. */#undef CUR#define CUR tp->static voidsanity_check2(TERMTYPE *tp, bool literal){    if (!PRESENT(exit_attribute_mode)) {#ifdef __UNUSED__		/* this casts too wide a net */	bool terminal_entry = !strchr(tp->term_names, '+');	if (terminal_entry &&	    (PRESENT(set_attributes)	     || PRESENT(enter_standout_mode)	     || PRESENT(enter_underline_mode)	     || PRESENT(enter_blink_mode)	     || PRESENT(enter_bold_mode)	     || PRESENT(enter_dim_mode)	     || PRESENT(enter_secure_mode)	     || PRESENT(enter_protected_mode)	     || PRESENT(enter_reverse_mode)))	    _nc_warning("no exit_attribute_mode");#endif /* __UNUSED__ */	PAIRED(enter_standout_mode, exit_standout_mode);	PAIRED(enter_underline_mode, exit_underline_mode);    }    /* we do this check/fix in postprocess_termcap(), but some packagers     * prefer to bypass it...     */    if (!literal) {	if (acs_chars == 0	    && enter_alt_charset_mode != 0	    && exit_alt_charset_mode != 0)	    acs_chars = strdup(VT_ACSC);	ANDMISSING(enter_alt_charset_mode, acs_chars);	ANDMISSING(exit_alt_charset_mode, acs_chars);    }    /* listed in structure-member order of first argument */    PAIRED(enter_alt_charset_mode, exit_alt_charset_mode);    ANDMISSING(enter_blink_mode, exit_attribute_mode);    ANDMISSING(enter_bold_mode, exit_attribute_mode);    PAIRED(exit_ca_mode, enter_ca_mode);    PAIRED(enter_delete_mode, exit_delete_mode);    ANDMISSING(enter_dim_mode, exit_attribute_mode);    PAIRED(enter_insert_mode, exit_insert_mode);    ANDMISSING(enter_secure_mode, exit_attribute_mode);    ANDMISSING(enter_protected_mode, exit_attribute_mode);    ANDMISSING(enter_reverse_mode, exit_attribute_mode);    PAIRED(from_status_line, to_status_line);    PAIRED(meta_off, meta_on);    PAIRED(prtr_on, prtr_off);    PAIRED(save_cursor, restore_cursor);    PAIRED(enter_xon_mode, exit_xon_mode);    PAIRED(enter_am_mode, exit_am_mode);    ANDMISSING(label_off, label_on);#ifdef remove_clock    PAIRED(display_clock, remove_clock);#endif    ANDMISSING(set_color_pair, initialize_pair);}/* obsolete: 20040705 */static voidsanity_check(TERMTYPE *tp){    sanity_check2(tp, FALSE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -