]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/write_entry.c
ncurses 5.8 - patch 20110307
[ncurses.git] / ncurses / tinfo / write_entry.c
index a89da90531a8876ade785b12091c326fe1397327..a86c11267e931376f12c4c30fd270bfe3d191ee8 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -42,7 +42,6 @@
 #include <sys/stat.h>
 
 #include <tic.h>
-#include <term_entry.h>
 
 #ifndef S_ISDIR
 #define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR)
@@ -54,7 +53,7 @@
 #define TRACE_OUT(p)           /*nothing */
 #endif
 
-MODULE_ID("$Id: write_entry.c,v 1.73 2009/04/18 21:01:38 tom Exp $")
+MODULE_ID("$Id: write_entry.c,v 1.78 2010/12/25 23:23:08 tom Exp $")
 
 static int total_written;
 
@@ -137,10 +136,12 @@ make_db_path(char *dst, const char *src, unsigned limit)
        if (_nc_is_dir_path(dst)) {
            rc = -1;
        } else {
+           static const char suffix[] = DBM_SUFFIX;
            unsigned have = strlen(dst);
-           if (have > 3 && strcmp(dst + have - 3, DBM_SUFFIX)) {
-               if (have + 3 <= limit)
-                   strcat(dst, DBM_SUFFIX);
+           unsigned need = strlen(suffix);
+           if (have > need && strcmp(dst + have - need, suffix)) {
+               if (have + need <= limit)
+                   strcat(dst, suffix);
                else
                    rc = -1;
            }
@@ -362,7 +363,7 @@ _nc_write_entry(TERMTYPE *const tp)
        start_time = 0;
     }
 
-    if (strlen(first_name) >= sizeof(filename) - 3)
+    if (strlen(first_name) >= sizeof(filename) - (2 + LEAF_LEN))
        _nc_warning("terminal name too long.");
 
     sprintf(filename, LEAF_FMT "/%s", first_name[0], first_name);
@@ -396,7 +397,7 @@ _nc_write_entry(TERMTYPE *const tp)
        if (*other_names != '\0')
            *(other_names++) = '\0';
 
-       if (strlen(ptr) > sizeof(linkname) - 3) {
+       if (strlen(ptr) > sizeof(linkname) - (2 + LEAF_LEN)) {
            _nc_warning("terminal alias %s too long.", ptr);
            continue;
        }
@@ -418,8 +419,12 @@ _nc_write_entry(TERMTYPE *const tp)
        {
            int code;
 #if USE_SYMLINKS
-           strcpy(symlinkname, "../");
-           strncat(symlinkname, filename, sizeof(symlinkname) - 4);
+           if (first_name[0] == linkname[0])
+               strncpy(symlinkname, first_name, sizeof(symlinkname) - 1);
+           else {
+               strcpy(symlinkname, "../");
+               strncat(symlinkname, filename, sizeof(symlinkname) - 4);
+           }
            symlinkname[sizeof(symlinkname) - 1] = '\0';
 #endif /* USE_SYMLINKS */
 #if HAVE_REMOVE
@@ -464,22 +469,22 @@ _nc_write_entry(TERMTYPE *const tp)
 #endif /* USE_HASHED_DB */
 }
 
-static unsigned
+static size_t
 fake_write(char *dst,
           unsigned *offset,
-          unsigned limit,
+          size_t limit,
           char *src,
-          unsigned want,
-          unsigned size)
+          size_t want,
+          size_t size)
 {
-    unsigned have = (limit - *offset);
+    size_t have = (limit - *offset);
 
     want *= size;
     if (have > 0) {
        if (want > have)
            want = have;
        memcpy(dst + *offset, src, want);
-       *offset += want;
+       *offset += (unsigned) want;
     } else {
        want = 0;
     }
@@ -497,10 +502,10 @@ fake_write(char *dst,
 #define WRITE_STRING(str) (Write(str, sizeof(char), strlen(str) + 1) == strlen(str) + 1)
 
 static int
-compute_offsets(char **Strings, unsigned strmax, short *offsets)
+compute_offsets(char **Strings, size_t strmax, short *offsets)
 {
     int nextfree = 0;
-    unsigned i;
+    size_t i;
 
     for (i = 0; i < strmax; i++) {
        if (Strings[i] == ABSENT_STRING) {
@@ -518,9 +523,9 @@ compute_offsets(char **Strings, unsigned strmax, short *offsets)
 }
 
 static void
-convert_shorts(unsigned char *buf, short *Numbers, unsigned count)
+convert_shorts(unsigned char *buf, short *Numbers, size_t count)
 {
-    unsigned i;
+    size_t i;
     for (i = 0; i < count; i++) {
        if (Numbers[i] == ABSENT_NUMERIC) {     /* HI/LO won't work */
            buf[2 * i] = buf[2 * i + 1] = 0377;
@@ -529,7 +534,7 @@ convert_shorts(unsigned char *buf, short *Numbers, unsigned count)
            buf[2 * i + 1] = 0377;
        } else {
            LITTLE_ENDIAN(buf + 2 * i, Numbers[i]);
-           TRACE_OUT(("put Numbers[%d]=%d", i, Numbers[i]));
+           TRACE_OUT(("put Numbers[%u]=%d", (unsigned) i, Numbers[i]));
        }
     }
 }
@@ -572,7 +577,7 @@ extended_Strings(TERMTYPE *tp)
 
     for (i = 0; i < tp->ext_Strings; ++i) {
        if (tp->Strings[STRCOUNT + i] != ABSENT_STRING)
-           result = (i + 1);
+           result = (unsigned short) (i + 1);
     }
     return result;
 }