Move initialisation logic out of termkey_new into a static function

This commit is contained in:
Paul LeoNerd Evans 2012-01-26 10:13:03 +00:00
parent 8b46e65aa3
commit 63f37cecd6
1 changed files with 46 additions and 39 deletions

View File

@ -211,38 +211,11 @@ static TermKey *termkey_alloc(void)
return tk; return tk;
} }
TermKey *termkey_new(int fd, int flags) static int termkey_init(TermKey *tk, const char *term)
{ {
TermKey *tk = termkey_alloc();
if(!tk)
return NULL;
tk->fd = fd;
if(!(flags & (TERMKEY_FLAG_RAW|TERMKEY_FLAG_UTF8))) {
int locale_is_utf8 = 0;
char *e;
if((e = getenv("LANG")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(!locale_is_utf8 && (e = getenv("LC_MESSAGES")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(!locale_is_utf8 && (e = getenv("LC_ALL")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(locale_is_utf8)
flags |= TERMKEY_FLAG_UTF8;
else
flags |= TERMKEY_FLAG_RAW;
}
termkey_set_flags(tk, flags);
tk->buffer = malloc(tk->buffsize); tk->buffer = malloc(tk->buffsize);
if(!tk->buffer) if(!tk->buffer)
goto abort_free_tk; return 0;
tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames); tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames);
if(!tk->keynames) if(!tk->keynames)
@ -261,8 +234,6 @@ TermKey *termkey_new(int fd, int flags)
register_c0(tk, TERMKEY_SYM_ENTER, 0x0d, NULL); register_c0(tk, TERMKEY_SYM_ENTER, 0x0d, NULL);
register_c0(tk, TERMKEY_SYM_ESCAPE, 0x1b, NULL); register_c0(tk, TERMKEY_SYM_ESCAPE, 0x1b, NULL);
const char *term = getenv("TERM");
struct TermKeyDriverNode *tail = NULL; struct TermKeyDriverNode *tail = NULL;
for(i = 0; drivers[i]; i++) { for(i = 0; drivers[i]; i++) {
@ -299,9 +270,9 @@ TermKey *termkey_new(int fd, int flags)
goto abort_free_keynames; goto abort_free_keynames;
} }
if(fd != -1 && !(flags & TERMKEY_FLAG_NOTERMIOS)) { if(tk->fd != -1 && !(tk->flags & TERMKEY_FLAG_NOTERMIOS)) {
struct termios termios; struct termios termios;
if(tcgetattr(fd, &termios) == 0) { if(tcgetattr(tk->fd, &termios) == 0) {
tk->restore_termios = termios; tk->restore_termios = termios;
tk->restore_termios_valid = 1; tk->restore_termios_valid = 1;
@ -310,7 +281,7 @@ TermKey *termkey_new(int fd, int flags)
termios.c_cc[VMIN] = 1; termios.c_cc[VMIN] = 1;
termios.c_cc[VTIME] = 0; termios.c_cc[VTIME] = 0;
if(flags & TERMKEY_FLAG_CTRLC) if(tk->flags & TERMKEY_FLAG_CTRLC)
/* want no signal keys at all, so just disable ISIG */ /* want no signal keys at all, so just disable ISIG */
termios.c_lflag &= ~ISIG; termios.c_lflag &= ~ISIG;
else { else {
@ -326,7 +297,7 @@ TermKey *termkey_new(int fd, int flags)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "Setting termios(3) flags\n"); fprintf(stderr, "Setting termios(3) flags\n");
#endif #endif
tcsetattr(fd, TCSANOW, &termios); tcsetattr(tk->fd, TCSANOW, &termios);
} }
} }
@ -340,7 +311,7 @@ TermKey *termkey_new(int fd, int flags)
fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk); fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk);
#endif #endif
return tk; return 1;
abort_free_drivers: abort_free_drivers:
for(p = tk->drivers; p; ) { for(p = tk->drivers; p; ) {
@ -356,10 +327,46 @@ abort_free_keynames:
abort_free_buffer: abort_free_buffer:
free(tk->buffer); free(tk->buffer);
abort_free_tk: return 0;
free(tk); }
return NULL; TermKey *termkey_new(int fd, int flags)
{
TermKey *tk = termkey_alloc();
if(!tk)
return NULL;
tk->fd = fd;
if(!(flags & (TERMKEY_FLAG_RAW|TERMKEY_FLAG_UTF8))) {
int locale_is_utf8 = 0;
char *e;
if((e = getenv("LANG")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(!locale_is_utf8 && (e = getenv("LC_MESSAGES")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(!locale_is_utf8 && (e = getenv("LC_ALL")) && strstr(e, "UTF-8"))
locale_is_utf8 = 1;
if(locale_is_utf8)
flags |= TERMKEY_FLAG_UTF8;
else
flags |= TERMKEY_FLAG_RAW;
}
termkey_set_flags(tk, flags);
const char *term = getenv("TERM");
if(!termkey_init(tk, term)) {
free(tk);
return NULL;
}
return tk;
} }
void termkey_free(TermKey *tk) void termkey_free(TermKey *tk)