]> git.kaiwu.me - njs.git/commitdiff
Eliminating sprintf() and vsnprintf() usage.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 12 Feb 2019 15:56:04 +0000 (18:56 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 12 Feb 2019 15:56:04 +0000 (18:56 +0300)
njs/njs_builtin.c
njs/njs_date.c
njs/njs_json.c
njs/njs_number.h
njs/njs_regexp.c
njs/njs_shell.c
njs/njs_time.c
njs/test/njs_unit_test.c
nxt/nxt_string.h
nxt/nxt_trace.c

index 07a3fa7bfe0380923d5b1e130602fa6d94092ed0..95df5dbe0874514815a2c1b2581a2c62c277cdf0 100644 (file)
@@ -595,7 +595,7 @@ njs_builtin_completions_size(njs_vm_t *vm)
 static nxt_array_t *
 njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
 {
-    char                     *compl;
+    u_char                   *compl;
     size_t                   n, len;
     nxt_str_t                string, *completions;
     nxt_uint_t               i, k;
@@ -634,7 +634,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
                 return NULL;
             }
 
-            snprintf(compl, len, "%s.%s", obj->name.start, string.start);
+            nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
+                        string.start);
 
             completions[n].length = len;
             completions[n++].start = (u_char *) compl;
@@ -654,12 +655,10 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
                 return NULL;
             }
 
-            snprintf(compl, len, ".%s", string.start);
+            nxt_sprintf(compl, compl + len, ".%s%Z", string.start);
 
             for (k = 0; k < n; k++) {
-                if (strncmp((char *) completions[k].start, compl, len)
-                    == 0)
-                {
+                if (nxt_strncmp(completions[k].start, compl, len) == 0) {
                     break;
                 }
             }
@@ -684,7 +683,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
                 return NULL;
             }
 
-            snprintf(compl, len, "%s.%s", obj->name.start, string.start);
+            nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start,
+                        string.start);
 
             completions[n].length = len;
             completions[n++].start = (u_char *) compl;
@@ -710,7 +710,7 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
             return NULL;
         }
 
-        snprintf(compl, len, "%.*s", (int) ev->name.length, ev->name.start);
+        nxt_sprintf(compl, compl + len, "%V%Z", &ev->name);
 
         completions[n].length = len;
         completions[n++].start = (u_char *) compl;
@@ -728,9 +728,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array)
                 return NULL;
             }
 
-            snprintf(compl, len, "%.*s.%.*s", (int) ev->name.length,
-                     ev->name.start, (int) ext_prop->name.length,
-                     ext_prop->name.start);
+            nxt_sprintf(compl, compl + len, "%V.%V%Z", &ev->name,
+                        &ext_prop->name);
 
             completions[n].length = len;
             completions[n++].start = (u_char *) compl;
index 7b28ec9a5fb4e689cbee8b43189b2f1e47a78e92..eabee2ef0f36238fb83f477b9b3f4582f3c0fd6a 100644 (file)
@@ -984,9 +984,8 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused)
 {
     double             time;
-    size_t             size;
     time_t             clock;
-    u_char             buf[NJS_DATE_TIME_LEN];
+    u_char             buf[NJS_DATE_TIME_LEN], *p;
     struct tm          tm;
 
     static const char  *week[] = { "Sun", "Mon", "Tue", "Wed",
@@ -1001,13 +1000,12 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args,
         clock = time / 1000;
         gmtime_r(&clock, &tm);
 
-        size = snprintf((char *) buf, NJS_DATE_TIME_LEN,
+        p = nxt_sprintf(buf, buf + NJS_DATE_TIME_LEN,
                         "%s %s %02d %4d %02d:%02d:%02d GMT",
-                        week[tm.tm_wday], month[tm.tm_mon],
-                        tm.tm_mday, tm.tm_year + 1900,
-                        tm.tm_hour, tm.tm_min, tm.tm_sec);
+                        week[tm.tm_wday], month[tm.tm_mon], tm.tm_mday,
+                        tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);
 
-        return njs_string_new(vm, &vm->retval, buf, size, size);
+        return njs_string_new(vm, &vm->retval, buf, p - buf, p - buf);
     }
 
     vm->retval = njs_string_invalid_date;
@@ -1029,9 +1027,8 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date)
 {
     int32_t    year;
     double     time;
-    size_t     size;
     time_t     clock;
-    u_char     buf[NJS_ISO_DATE_TIME_LEN];
+    u_char     buf[NJS_ISO_DATE_TIME_LEN], *p;
     struct tm  tm;
 
     time = date->data.u.date->time;
@@ -1043,14 +1040,13 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date)
 
         year = tm.tm_year + 1900;
 
-        size = snprintf((char *) buf, NJS_ISO_DATE_TIME_LEN,
+        p = nxt_sprintf(buf, buf + NJS_ISO_DATE_TIME_LEN,
                         (year < 0) ? "%07d-%02d-%02dT%02d:%02d:%02d.%03dZ"
                                    : "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
-                        year, tm.tm_mon + 1, tm.tm_mday,
-                        tm.tm_hour, tm.tm_min, tm.tm_sec,
-                        (int) ((int64_t) time % 1000));
+                        year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min,
+                        tm.tm_sec, (int) ((int64_t) time % 1000));
 
-        return njs_string_new(vm, retval, buf, size, size);
+        return njs_string_new(vm, retval, buf, p - buf, p - buf);
     }
 
     vm->retval = njs_string_invalid_date;
index a5432e4fe73c36829a423c53e09f037e6a380d8c..8c25dca8715445f2f99b567440162288efc03996 100644 (file)
@@ -2069,13 +2069,12 @@ const njs_object_init_t  njs_json_object_init = {
 static nxt_int_t
 njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value)
 {
-    size_t              len;
     njs_ret_t           ret;
     nxt_str_t           str;
     nxt_uint_t          written;
     njs_value_t         str_val;
     const njs_extern_t  *ext_proto;
-    char                buf[32];
+    u_char              buf[32], *p;
 
     njs_ret_t           (*to_string)(njs_vm_t *, njs_value_t *,
                                      const njs_value_t *);
@@ -2243,9 +2242,9 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value)
         return njs_json_buf_append(stringify, (char *) str.start, str.length);
 
     default:
-        len = snprintf(buf, sizeof(buf), "[Unknown value type:%d]",
-                       value->type);
-        return njs_json_buf_append(stringify, buf, len);
+        p = nxt_sprintf(buf, buf + nxt_length(buf), "[Unknown value type:%uD]",
+                        value->type);
+        return njs_json_buf_append(stringify, (char *) buf, p - buf);
     }
 
     return ret;
index 3e9406733834f9f93e59e69410243f81f6128d06..769ef3bdae3be6af40541ef505efb848650617a8 100644 (file)
@@ -62,11 +62,12 @@ njs_char_to_hex(u_char c)
 nxt_inline void
 njs_uint32_to_string(njs_value_t *value, uint32_t u32)
 {
-    size_t  size;
+    u_char  *dst, *p;
 
-    size = snprintf((char *) njs_string_short_start(value),
-                    NJS_STRING_SHORT, "%u", u32);
-    njs_string_short_set(value, size, size);
+    dst = njs_string_short_start(value);
+    p = nxt_sprintf(dst, dst + NJS_STRING_SHORT, "%uD", u32);
+
+    njs_string_short_set(value, p - dst, p - dst);
 }
 
 
index f256b21c8cbcef6dc093b983af33873fe41c1777..e759ba037ad7aaa952a739e8335e1a8a8eb3c0e2 100644 (file)
@@ -378,10 +378,11 @@ njs_regexp_compile_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
     p = trace->handler(trace, td, start);
 
     if (vm->parser != NULL) {
-        njs_syntax_error(vm, "%s in %uD", start, vm->parser->lexer->line);
+        njs_syntax_error(vm, "%*s in %uD", (int) (p - start), start,
+                         vm->parser->lexer->line);
 
     } else {
-        njs_syntax_error(vm, "%s", start);
+        njs_syntax_error(vm, "%*s", (int) (p - start), start);
     }
 
     return p;
index 3b72c079f0cc594e824b631368c592495a9562e7..cc274d5cc176ec6ff8a45e8203c079fb50357c11 100644 (file)
@@ -719,7 +719,7 @@ next:
                 continue;
             }
 
-            if (strncmp(text, (char *) var->name.start, cmpl->length) == 0) {
+            if (nxt_strncmp(text, var->name.start, cmpl->length) == 0) {
                 return njs_editline(&var->name);
             }
         }
@@ -769,8 +769,8 @@ next:
 
             suffix = njs_completion(cmpl->suffix_completions, cmpl->index++);
 
-            if (len != 0 && strncmp((char *) suffix->start, p,
-                                    nxt_min(len, suffix->length)) != 0)
+            if (len != 0 && nxt_strncmp(suffix->start, p,
+                                        nxt_min(len, suffix->length)) != 0)
             {
                 continue;
             }
@@ -781,8 +781,8 @@ next:
                 return NULL;
             }
 
-            snprintf(completion, len, "%.*s%.*s", (int) (p - text), text,
-                     (int) suffix->length, suffix->start);
+            nxt_sprintf((u_char *) completion, (u_char *) completion + len,
+                        "%*s%V%Z", (int) (p - text), text, suffix);
             return completion;
         }
 
@@ -803,7 +803,7 @@ next:
                 continue;
             }
 
-            if (strncmp(text, (char *) suffix->start, cmpl->length) == 0) {
+            if (nxt_strncmp(text, suffix->start, cmpl->length) == 0) {
                 return njs_editline(suffix);
             }
         }
index f5b1fafe89904bc684a20daab0f0bbd92429da5b..58b589c953f38f98ee39ac0824e4c48f34fd928d 100644 (file)
@@ -100,7 +100,7 @@ njs_ret_t
 njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_index_t unused)
 {
-    u_char              buf[16];
+    u_char              buf[16], *p;
     njs_ret_t           ret;
     njs_event_t         *event;
     nxt_lvlhsh_query_t  lhq;
@@ -110,9 +110,11 @@ njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         return NJS_OK;
     }
 
+    p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD",
+                    (unsigned) args[1].data.u.number);
+
     lhq.key.start = buf;
-    lhq.key.length = snprintf((char *) buf, sizeof(buf) - 1, "%u",
-                              (unsigned) args[1].data.u.number);
+    lhq.key.length = p - buf;
     lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
     lhq.proto = &njs_event_hash_proto;
     lhq.pool = vm->mem_pool;
index 90b5db41b4723dc4d31dad4774379299049d2cb5..74d92313b95384d65793dba94b533b99e47a8c38 100644 (file)
@@ -11288,15 +11288,14 @@ static njs_ret_t
 njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj,
     uintptr_t data)
 {
-    char                 buf[16];
-    size_t               len;
+    u_char               buf[16], *p;
     njs_unit_test_req_t  *r;
 
     r = (njs_unit_test_req_t *) obj;
 
-    len = sprintf(buf, "%u", r->a);
+    p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", r->a);
 
-    return njs_string_create(vm, value, (u_char *) buf, len, 0);
+    return njs_string_create(vm, value, buf, p - buf, 0);
 }
 
 
index 338c6809245859a63875b0d08d2aa9cfe77774e9..3a6ec4beac057c4ade498f2ee44f66b62f45d98f 100644 (file)
@@ -44,6 +44,9 @@ nxt_upper_case(u_char c)
 #define nxt_cpymem(dst, src, n)   (((u_char *) memcpy(dst, src, n)) + (n))
 
 
+#define nxt_strncmp(s1, s2, n)        strncmp((char *) s1, (char *) s2, n)
+
+
 #define nxt_memset(buf, c, length)   (void) (memset(buf, c, length))
 
 
index f442ae8327bff1179c254c6897565fac5f99f595..440a7f39af2db24856342d7af30029d2e1e040d2 100644 (file)
@@ -8,6 +8,7 @@
 #include <nxt_types.h>
 #include <nxt_clang.h>
 #include <nxt_malloc.h>
+#include <nxt_sprintf.h>
 #include <nxt_trace.h>
 #include <stdio.h>
 
 static u_char *
 nxt_last_handler(nxt_trace_t *trace, nxt_trace_data_t *td, u_char *start)
 {
-    int      n;
+    u_char   *p;
     ssize_t  size;
 
     size = td->end - start;
-    n = vsnprintf((char *) start, size, td->fmt, td->args);
+    p = nxt_vsprintf(start, start + size, td->fmt, td->args);
 
-    if (n < size) {
-        start += n;
+    if (p - start < size) {
+        start = p;
     }
 
     return start;