[BACK]Return to term.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libterminfo

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libterminfo/term.c between version 1.21.2.2 and 1.22

version 1.21.2.2, 2017/05/19 00:22:53 version 1.22, 2017/05/04 09:42:23
Line 46  __RCSID("$NetBSD$");
Line 46  __RCSID("$NetBSD$");
   
 #define _PATH_TERMINFO          "/usr/share/misc/terminfo"  #define _PATH_TERMINFO          "/usr/share/misc/terminfo"
   
 static char __ti_database[PATH_MAX];  static char database[PATH_MAX];
   static char pathbuf[PATH_MAX];
 const char *_ti_database;  const char *_ti_database;
   
 /* Include a generated list of pre-compiled terminfo descriptions. */  /* Include a generated list of pre-compiled terminfo descriptions. */
Line 243  out:
Line 244  out:
 }  }
   
 static int  static int
 _ti_checkname(const char *name, const char *termname, const char *termalias)  
 {  
         const char *alias, *s;  
         size_t len, l;  
   
         /* Check terminal name matches. */  
         if (strcmp(termname, name) == 0)  
                 return 1;  
   
         /* Check terminal aliases match. */  
         if (termalias == NULL)  
                 return 0;  
   
         len = strlen(name);  
         alias = termalias;  
         while (*alias != '\0') {  
                 s = strchr(alias, '|');  
                 if (s == NULL)  
                         l = strlen(alias);  
                 else  
                         l = (size_t)(s - alias);  
                 if (len == l && memcmp(alias, name, l) == 0)  
                         return 1;  
                 if (s == NULL)  
                         break;  
                 alias = s + 1;  
         }  
   
         /* No match. */  
         return 0;  
 }  
   
 static int  
 _ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)  _ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)
 {  {
         struct cdbr *db;          struct cdbr *db;
         const void *data;          const void *data;
           char *db_name;
         const uint8_t *data8;          const uint8_t *data8;
         size_t len, klen;          size_t len, klen;
         int r;          int r;
   
         if (snprintf(__ti_database, sizeof(__ti_database), "%s.cdb", path) < 0)          if (asprintf(&db_name, "%s.cdb", path) < 0)
                 return -1;                  return -1;
         db = cdbr_open(__ti_database, CDBR_DEFAULT);  
           db = cdbr_open(db_name, CDBR_DEFAULT);
           free(db_name);
         if (db == NULL)          if (db == NULL)
                 return -1;                  return -1;
   
         r = 0;  
         klen = strlen(name) + 1;          klen = strlen(name) + 1;
         if (cdbr_find(db, name, klen, &data, &len) == -1)          if (cdbr_find(db, name, klen, &data, &len) == -1)
                 goto out;                  goto fail;
         data8 = data;          data8 = data;
         if (len == 0)          if (len == 0)
                 goto out;                  goto fail;
           /* Check for alias first, fall through to processing normal entries. */
         /* If the entry is an alias, load the indexed terminfo description. */  
         if (data8[0] == 2) {          if (data8[0] == 2) {
                   if (klen + 7 > len || le16dec(data8 + 5) != klen)
                           goto fail;
                   if (memcmp(data8 + 7, name, klen))
                           goto fail;
                 if (cdbr_get(db, le32dec(data8 + 1), &data, &len))                  if (cdbr_get(db, le32dec(data8 + 1), &data, &len))
                         goto out;                          goto fail;
                 data8 = data;                  data8 = data;
         }                  if (data8[0] != 1)
                           goto fail;
           } else if (data8[0] != 1)
                   goto fail;
           else if (klen + 3 >= len || le16dec(data8 + 1) != klen)
                   goto fail;
           else if (memcmp(data8 + 3, name, klen))
                   goto fail;
   
         r = _ti_readterm(term, data, len, flags);          strlcpy(database, path, sizeof(database));
         /* Ensure that this is the right terminfo description. */          _ti_database = database;
         if (r == 1)  
                 r = _ti_checkname(name, term->name, term->_alias);  
         /* Remember the database we read. */  
         if (r == 1)  
                 _ti_database = __ti_database;  
   
 out:          r = _ti_readterm(term, data, len, flags);
         cdbr_close(db);          cdbr_close(db);
         return r;          return r;
   
   fail:
           cdbr_close(db);
           return 0;
 }  }
   
 static int  static int
 _ti_dbgettermp(TERMINAL *term, const char *path, const char *name, int flags)  _ti_dbgettermp(TERMINAL *term, const char *path, const char *name, int flags)
 {  {
         const char *p;          const char *p;
         char pathbuf[PATH_MAX];  
         size_t l;          size_t l;
         int r, e;          int r, e;
   
Line 346  _ti_dbgettermp(TERMINAL *term, const cha
Line 324  _ti_dbgettermp(TERMINAL *term, const cha
 }  }
   
 static int  static int
   ticcmp(const TIC *tic, const char *name)
   {
           char *alias, *s;
           size_t len, l;
   
           if (strcmp(tic->name, name) == 0)
                   return 0;
           if (tic->alias == NULL)
                   return -1;
   
           len = strlen(name);
           alias = tic->alias;
           while (*alias != '\0') {
                   s = strchr(alias, '|');
                   if (s == NULL)
                           l = strlen(alias);
                   else
                           l = (size_t)(s - alias);
                   if (len == l && memcmp(alias, name, l) == 0)
                           return 0;
                   if (s == NULL)
                           break;
                   alias = s + 1;
           }
           return 1;
   }
   
   static int
 _ti_findterm(TERMINAL *term, const char *name, int flags)  _ti_findterm(TERMINAL *term, const char *name, int flags)
 {  {
         int r;          int r;
         char *c, *e;          char *c, *e, h[PATH_MAX];
           TIC *tic;
           uint8_t *f;
           ssize_t len;
   
         _DIAGASSERT(term != NULL);          _DIAGASSERT(term != NULL);
         _DIAGASSERT(name != NULL);          _DIAGASSERT(name != NULL);
   
           database[0] = '\0';
         _ti_database = NULL;          _ti_database = NULL;
         r = 0;          r = 0;
   
Line 374  _ti_findterm(TERMINAL *term, const char 
Line 384  _ti_findterm(TERMINAL *term, const char 
         }          }
   
         if (e != NULL) {          if (e != NULL) {
                 TIC *tic;  
   
                 if (c == NULL)                  if (c == NULL)
                         e = strdup(e); /* So we don't destroy env */                          e = strdup(e); /* So we don't destroy env */
                 if (e == NULL)                  if (e == NULL)
Line 385  _ti_findterm(TERMINAL *term, const char 
Line 393  _ti_findterm(TERMINAL *term, const char 
                             TIC_ALIAS | TIC_DESCRIPTION | TIC_EXTRA);                              TIC_ALIAS | TIC_DESCRIPTION | TIC_EXTRA);
                         free(e);                          free(e);
                 }                  }
                 if (tic != NULL &&                  if (tic != NULL && ticcmp(tic, name) == 0) {
                     _ti_checkname(name, tic->name, tic->alias) == 1)  
                 {  
                         uint8_t *f;  
                         ssize_t len;  
   
                         len = _ti_flatten(&f, tic);                          len = _ti_flatten(&f, tic);
                         if (len != -1) {                          if (len != -1) {
                                 r = _ti_readterm(term, (char *)f, (size_t)len,                                  r = _ti_readterm(term, (char *)f, (size_t)len,
Line 412  _ti_findterm(TERMINAL *term, const char 
Line 415  _ti_findterm(TERMINAL *term, const char 
                 return _ti_dbgettermp(term, e, name, flags);                  return _ti_dbgettermp(term, e, name, flags);
   
         if ((e = getenv("HOME")) != NULL) {          if ((e = getenv("HOME")) != NULL) {
                 char homepath[PATH_MAX];                  snprintf(h, sizeof(h), "%s/.terminfo", e);
                   r = _ti_dbgetterm(term, h, name, flags);
                 if (snprintf(homepath, sizeof(homepath), "%s/.terminfo", e) > 0)  
                         r = _ti_dbgetterm(term, homepath, name, flags);  
         }          }
         if (r != 1)          if (r != 1)
                 r = _ti_dbgettermp(term, _PATH_TERMINFO, name, flags);                  r = _ti_dbgettermp(term, _PATH_TERMINFO, name, flags);

Legend:
Removed from v.1.21.2.2  
changed lines
  Added in v.1.22

CVSweb <webmaster@jp.NetBSD.org>