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

📄 lib_setup.c

📁 ncurses 库 可能有用酒用 没用就算了 我觉得还可以用
💻 C
📖 第 1 页 / 共 2 页
字号:
	 * real terminfo database and use that.	 */	status = _nc_read_termcap_entry(tn, tp);#endif /* PURE_TERMINFO */    }#else    status = _nc_read_termcap_entry(tn, tp);#endif    /*     * If we have an entry, force all of the cancelled strings to null     * pointers so we don't have to test them in the rest of the library.     * (The terminfo compiler bypasses this logic, since it must know if     * a string is cancelled, for merging entries).     */    if (status == 1) {	unsigned n;	for_each_boolean(n, tp) {	    if (!VALID_BOOLEAN(tp->Booleans[n]))		tp->Booleans[n] = FALSE;	}	for_each_string(n, tp) {	    if (tp->Strings[n] == CANCELLED_STRING)		tp->Strings[n] = ABSENT_STRING;	}    }    return (status);}#endif/***	do_prototype()****	Take the real command character out of the CC environment variable**	and substitute it in for the prototype given in 'command_character'.***/static voiddo_prototype(void){    int i;    char CC;    char proto;    char *tmp;    tmp = getenv("CC");    CC = *tmp;    proto = *command_character;    for_each_string(i, &(cur_term->type)) {	for (tmp = cur_term->type.Strings[i]; *tmp; tmp++) {	    if (*tmp == proto)		*tmp = CC;	}    }}/* * Find the locale which is in effect. */NCURSES_EXPORT(char *)_nc_get_locale(void){    char *env;#if HAVE_LOCALE_H    /*     * This is preferable to using getenv() since it ensures that we are using     * the locale which was actually initialized by the application.     */    env = setlocale(LC_CTYPE, 0);#else    if (((env = getenv("LC_ALL")) != 0 && *env != '\0')	|| ((env = getenv("LC_CTYPE")) != 0 && *env != '\0')	|| ((env = getenv("LANG")) != 0 && *env != '\0')) {	;    }#endif    T(("_nc_get_locale %s", _nc_visbuf(env)));    return env;}/* * Check if we are running in a UTF-8 locale. */NCURSES_EXPORT(int)_nc_unicode_locale(void){    int result = 0;#if HAVE_LANGINFO_CODESET    char *env = nl_langinfo(CODESET);    result = !strcmp(env, "UTF-8");    T(("_nc_unicode_locale(%s) ->%d", env, result));#else    char *env = _nc_get_locale();    if (env != 0) {	if (strstr(env, ".UTF-8") != 0) {	    result = 1;	    T(("_nc_unicode_locale(%s) ->%d", env, result));	}    }#endif    return result;}#define CONTROL_N(s) ((s) != 0 && strstr(s, "\016") != 0)#define CONTROL_O(s) ((s) != 0 && strstr(s, "\017") != 0)/* * Check for known broken cases where a UTF-8 locale breaks the alternate * character set. */NCURSES_EXPORT(int)_nc_locale_breaks_acs(void){    char *env;    if ((env = getenv("NCURSES_NO_UTF8_ACS")) != 0) {	return atoi(env);    } else if ((env = getenv("TERM")) != 0) {	if (strstr(env, "linux"))	    return 1;		/* always broken */	if (strstr(env, "screen") != 0	    && ((env = getenv("TERMCAP")) != 0		&& strstr(env, "screen") != 0)	    && strstr(env, "hhII00") != 0) {	    if (CONTROL_N(enter_alt_charset_mode) ||		CONTROL_O(enter_alt_charset_mode) ||		CONTROL_N(set_attributes) ||		CONTROL_O(set_attributes))		return 1;	}    }    return 0;}/* * This entrypoint is called from tgetent() to allow special a case of reusing * the same TERMINAL data (see comment). */NCURSES_EXPORT(int)_nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse){    int status;    START_TRACE();    T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret));    if (tname == 0) {	tname = getenv("TERM");	if (tname == 0 || *tname == '\0') {	    ret_error0(-1, "TERM environment variable not set.\n");	}    }    if (strlen(tname) > MAX_NAME_SIZE) {	ret_error(-1, "TERM environment must be <= %d characters.\n",		  MAX_NAME_SIZE);    }    T(("your terminal name is %s", tname));    /*     * Allow output redirection.  This is what SVr3 does.  If stdout is     * directed to a file, screen updates go to standard error.     */    if (Filedes == STDOUT_FILENO && !isatty(Filedes))	Filedes = STDERR_FILENO;    /*     * Check if we have already initialized to use this terminal.  If so, we     * do not need to re-read the terminfo entry, or obtain TTY settings.     *     * This is an improvement on SVr4 curses.  If an application mixes curses     * and termcap calls, it may call both initscr and tgetent.  This is not     * really a good thing to do, but can happen if someone tries using ncurses     * with the readline library.  The problem we are fixing is that when     * tgetent calls setupterm, the resulting Ottyb struct in cur_term is     * zeroed.  A subsequent call to endwin uses the zeroed terminal settings     * rather than the ones saved in initscr.  So we check if cur_term appears     * to contain terminal settings for the same output file as our current     * call - and copy those terminal settings.  (SVr4 curses does not do this,     * however applications that are working around the problem will still work     * properly with this feature).     */    if (reuse	&& cur_term != 0	&& cur_term->Filedes == Filedes	&& cur_term->_termname != 0	&& !strcmp(cur_term->_termname, tname)	&& _nc_name_match(cur_term->type.term_names, tname, "|")) {	T(("reusing existing terminal information and mode-settings"));    } else {	TERMINAL *term_ptr;	term_ptr = typeCalloc(TERMINAL, 1);	if (term_ptr == 0) {	    ret_error0(-1,		       "Not enough memory to create terminal structure.\n");	}#if USE_DATABASE || USE_TERMCAP	status = grab_entry(tname, &term_ptr->type);#else	status = 0;#endif	/* try fallback list if entry on disk */	if (status != 1) {	    const TERMTYPE *fallback = _nc_fallback(tname);	    if (fallback) {		term_ptr->type = *fallback;		status = 1;	    }	}	if (status <= 0) {	    del_curterm(term_ptr);	    if (status == -1) {		ret_error0(-1, "terminals database is inaccessible\n");	    } else if (status == 0) {		ret_error(0, "'%s': unknown terminal type.\n", tname);	    }	}	set_curterm(term_ptr);	if (command_character && getenv("CC"))	    do_prototype();	strncpy(ttytype, cur_term->type.term_names, NAMESIZE - 1);	ttytype[NAMESIZE - 1] = '\0';	cur_term->Filedes = Filedes;	cur_term->_termname = strdup(tname);	/*	 * If an application calls setupterm() rather than initscr() or	 * newterm(), we will not have the def_prog_mode() call in	 * _nc_setupscreen().  Do it now anyway, so we can initialize the	 * baudrate.	 */	if (isatty(Filedes)) {	    def_prog_mode();	    baudrate();	}    }    /*     * We should always check the screensize, just in case.     */    _nc_get_screensize(&LINES, &COLS);    if (errret)	*errret = 1;    T((T_CREATE("screen %s %dx%d"), tname, LINES, COLS));    if (generic_type) {	ret_error(0, "'%s': I need something more specific.\n", tname);    }    if (hard_copy) {	ret_error(1, "'%s': I can't handle hardcopy terminals.\n", tname);    }    returnCode(OK);}/* *	setupterm(termname, Filedes, errret) * *	Find and read the appropriate object file for the terminal *	Make cur_term point to the structure. * */NCURSES_EXPORT(int)setupterm(NCURSES_CONST char *tname, int Filedes, int *errret){    return _nc_setupterm(tname, Filedes, errret, FALSE);}

⌨️ 快捷键说明

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