From 9338aa37c26c351c1281192e9cbe8658775cb165 Mon Sep 17 00:00:00 2001 From: "Nicholas J. Kain" Date: Tue, 9 Aug 2022 14:17:31 -0400 Subject: [PATCH] Use libc snprintf and nstr{cpy,cat}. We don't need async-safe snprintf anymore, and nstr{cpy,cat} are more ergonomic and efficient where they can used. --- cfg.c | 1072 +++++++++++++------------- cfg.rl | 12 +- duiaid.c | 5 +- ifchange.c | 24 +- ifchd-parse.c | 97 +-- ifchd-parse.rl | 17 +- ifchd.c | 28 +- leasefile.c | 25 +- nk/stb_sprintf.c | 3 - nk/stb_sprintf.h | 1915 ---------------------------------------------- sockd.c | 5 +- 11 files changed, 637 insertions(+), 2566 deletions(-) delete mode 100644 nk/stb_sprintf.c delete mode 100644 nk/stb_sprintf.h diff --git a/cfg.c b/cfg.c index d5d4202..0601435 100644 --- a/cfg.c +++ b/cfg.c @@ -14,16 +14,15 @@ #include "ndhc.h" #include "ifchd.h" #include "sockd.h" -#include "nk/stb_sprintf.h" #include "nk/log.h" +#include "nk/nstrcpy.h" #include "nk/privs.h" #include "nk/io.h" static void copy_cmdarg(char *dest, const char *src, size_t destlen, const char *argname) { - ssize_t olen = stbsp_snprintf(dest, destlen, "%s", src); - if (olen < 0 || (size_t)olen > destlen) + if (!nstrcpy(dest, destlen, src)) suicide("snprintf failed on %s", argname); } @@ -35,15 +34,15 @@ struct cfgparse { }; -#line 169 "cfg.rl" +#line 168 "cfg.rl" -#line 218 "cfg.rl" +#line 217 "cfg.rl" -#line 47 "cfg.c" +#line 46 "cfg.c" static const int file_cfg_start = 1; static const int file_cfg_first_final = 291; static const int file_cfg_error = 0; @@ -51,7 +50,7 @@ static const int file_cfg_error = 0; static const int file_cfg_en_main = 1; -#line 220 "cfg.rl" +#line 219 "cfg.rl" static void parse_cfgfile(const char *fname) @@ -86,15 +85,15 @@ static void parse_cfgfile(const char *fname) const char *p = l + lstart; const char *pe = l + lstart + llen + 1; -#line 90 "cfg.c" +#line 89 "cfg.c" { ccfg.cs = (int)file_cfg_start; } -#line 253 "cfg.rl" +#line 252 "cfg.rl" -#line 98 "cfg.c" +#line 97 "cfg.c" { switch ( ccfg.cs ) { case 1: @@ -730,16 +729,16 @@ static void parse_cfgfile(const char *fname) goto _out0; _ctr34: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 740 "cfg.c" +#line 739 "cfg.c" { -#line 128 "cfg.rl" +#line 127 "cfg.rl" int t = atoi(ccfg.buf); arp_probe_max = t; @@ -750,21 +749,21 @@ static void parse_cfgfile(const char *fname) } } -#line 754 "cfg.c" +#line 753 "cfg.c" goto _st291; _ctr42: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 765 "cfg.c" +#line 764 "cfg.c" { -#line 119 "cfg.rl" +#line 118 "cfg.rl" int t = atoi(ccfg.buf); arp_probe_min = t; @@ -775,96 +774,96 @@ static void parse_cfgfile(const char *fname) } } -#line 779 "cfg.c" +#line 778 "cfg.c" goto _st291; _ctr51: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 790 "cfg.c" +#line 789 "cfg.c" { -#line 114 "cfg.rl" +#line 113 "cfg.rl" int t = atoi(ccfg.buf); if (t >= 0) arp_probe_num = t; } -#line 800 "cfg.c" +#line 799 "cfg.c" goto _st291; _ctr61: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 811 "cfg.c" +#line 810 "cfg.c" { -#line 109 "cfg.rl" +#line 108 "cfg.rl" int t = atoi(ccfg.buf); if (t >= 0) arp_probe_wait = t; } -#line 821 "cfg.c" +#line 820 "cfg.c" goto _st291; _ctr74: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 832 "cfg.c" +#line 831 "cfg.c" { -#line 90 "cfg.rl" +#line 89 "cfg.rl" copy_cmdarg(chroot_dir, ccfg.buf, sizeof chroot_dir, "chroot"); } -#line 840 "cfg.c" +#line 839 "cfg.c" goto _st291; _ctr87: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 851 "cfg.c" +#line 850 "cfg.c" { -#line 58 "cfg.rl" +#line 57 "cfg.rl" get_clientid_string(ccfg.buf, ccfg.buflen); } -#line 857 "cfg.c" +#line 856 "cfg.c" goto _st291; _ctr110: { -#line 56 "cfg.rl" +#line 55 "cfg.rl" ccfg.ternary = -1; } -#line 865 "cfg.c" +#line 864 "cfg.c" { -#line 152 "cfg.rl" +#line 151 "cfg.rl" switch (ccfg.ternary) { case 1: allow_hostname = 1; break; @@ -872,18 +871,18 @@ static void parse_cfgfile(const char *fname) } } -#line 876 "cfg.c" +#line 875 "cfg.c" goto _st291; _ctr111: { -#line 55 "cfg.rl" +#line 54 "cfg.rl" ccfg.ternary = 1; } -#line 884 "cfg.c" +#line 883 "cfg.c" { -#line 152 "cfg.rl" +#line 151 "cfg.rl" switch (ccfg.ternary) { case 1: allow_hostname = 1; break; @@ -891,21 +890,21 @@ static void parse_cfgfile(const char *fname) } } -#line 895 "cfg.c" +#line 894 "cfg.c" goto _st291; _ctr130: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 906 "cfg.c" +#line 905 "cfg.c" { -#line 137 "cfg.rl" +#line 136 "cfg.rl" char *q; long mt = strtol(ccfg.buf, &q, 10); @@ -918,78 +917,78 @@ static void parse_cfgfile(const char *fname) client_config.metric = (int)mt; } -#line 922 "cfg.c" +#line 921 "cfg.c" goto _st291; _ctr144: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 933 "cfg.c" +#line 932 "cfg.c" { -#line 59 "cfg.rl" +#line 58 "cfg.rl" copy_cmdarg(client_config.hostname, ccfg.buf, sizeof client_config.hostname, "hostname"); } -#line 942 "cfg.c" +#line 941 "cfg.c" goto _st291; _ctr160: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 953 "cfg.c" +#line 952 "cfg.c" { -#line 82 "cfg.rl" +#line 81 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &ifch_uid, &ifch_gid)) suicide("invalid ifch user '%s' specified", ccfg.buf); } -#line 962 "cfg.c" +#line 961 "cfg.c" goto _st291; _ctr174: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 973 "cfg.c" +#line 972 "cfg.c" { -#line 63 "cfg.rl" +#line 62 "cfg.rl" copy_cmdarg(client_config.interface, ccfg.buf, sizeof client_config.interface, "interface"); } -#line 982 "cfg.c" +#line 981 "cfg.c" goto _st291; _ctr183: { -#line 56 "cfg.rl" +#line 55 "cfg.rl" ccfg.ternary = -1; } -#line 990 "cfg.c" +#line 989 "cfg.c" { -#line 67 "cfg.rl" +#line 66 "cfg.rl" switch (ccfg.ternary) { case 1: client_config.abort_if_no_lease = true; break; @@ -997,18 +996,18 @@ static void parse_cfgfile(const char *fname) } } -#line 1001 "cfg.c" +#line 1000 "cfg.c" goto _st291; _ctr184: { -#line 55 "cfg.rl" +#line 54 "cfg.rl" ccfg.ternary = 1; } -#line 1009 "cfg.c" +#line 1008 "cfg.c" { -#line 67 "cfg.rl" +#line 66 "cfg.rl" switch (ccfg.ternary) { case 1: client_config.abort_if_no_lease = true; break; @@ -1016,18 +1015,18 @@ static void parse_cfgfile(const char *fname) } } -#line 1020 "cfg.c" +#line 1019 "cfg.c" goto _st291; _ctr215: { -#line 56 "cfg.rl" +#line 55 "cfg.rl" ccfg.ternary = -1; } -#line 1028 "cfg.c" +#line 1027 "cfg.c" { -#line 103 "cfg.rl" +#line 102 "cfg.rl" switch (ccfg.ternary) { case 1: set_arp_relentless_def(true); break; @@ -1035,18 +1034,18 @@ static void parse_cfgfile(const char *fname) } } -#line 1039 "cfg.c" +#line 1038 "cfg.c" goto _st291; _ctr216: { -#line 55 "cfg.rl" +#line 54 "cfg.rl" ccfg.ternary = 1; } -#line 1047 "cfg.c" +#line 1046 "cfg.c" { -#line 103 "cfg.rl" +#line 102 "cfg.rl" switch (ccfg.ternary) { case 1: set_arp_relentless_def(true); break; @@ -1054,217 +1053,217 @@ static void parse_cfgfile(const char *fname) } } -#line 1058 "cfg.c" +#line 1057 "cfg.c" goto _st291; _ctr231: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1069 "cfg.c" +#line 1068 "cfg.c" { -#line 73 "cfg.rl" +#line 72 "cfg.rl" set_client_addr(ccfg.buf); } -#line 1075 "cfg.c" +#line 1074 "cfg.c" goto _st291; _ctr246: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1086 "cfg.c" +#line 1085 "cfg.c" { -#line 148 "cfg.rl" +#line 147 "cfg.rl" copy_cmdarg(resolv_conf_d, ccfg.buf, sizeof resolv_conf_d, "resolv-conf"); } -#line 1095 "cfg.c" +#line 1094 "cfg.c" goto _st291; _ctr261: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1106 "cfg.c" +#line 1105 "cfg.c" { -#line 158 "cfg.rl" +#line 157 "cfg.rl" uint32_t t = (uint32_t)atoi(ccfg.buf); client_config.rfkillIdx = t; client_config.enable_rfkill = true; } -#line 1116 "cfg.c" +#line 1115 "cfg.c" goto _st291; _ctr280: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1127 "cfg.c" +#line 1126 "cfg.c" { -#line 163 "cfg.rl" +#line 162 "cfg.rl" client_config.s6_notify_fd = atoi(ccfg.buf); client_config.enable_s6_notify = true; } -#line 1136 "cfg.c" +#line 1135 "cfg.c" goto _st291; _ctr296: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1147 "cfg.c" +#line 1146 "cfg.c" { -#line 96 "cfg.rl" +#line 95 "cfg.rl" copy_cmdarg(script_file, ccfg.buf, sizeof script_file, "script-file"); } -#line 1155 "cfg.c" +#line 1154 "cfg.c" goto _st291; _ctr316: { -#line 56 "cfg.rl" +#line 55 "cfg.rl" ccfg.ternary = -1; } -#line 1163 "cfg.c" +#line 1162 "cfg.c" { -#line 99 "cfg.rl" +#line 98 "cfg.rl" log_line("seccomp_enforce option is deprecated; please remove it"); log_line("In the meanwhile, it is ignored and seccomp is disabled."); } -#line 1172 "cfg.c" +#line 1171 "cfg.c" goto _st291; _ctr317: { -#line 55 "cfg.rl" +#line 54 "cfg.rl" ccfg.ternary = 1; } -#line 1180 "cfg.c" +#line 1179 "cfg.c" { -#line 99 "cfg.rl" +#line 98 "cfg.rl" log_line("seccomp_enforce option is deprecated; please remove it"); log_line("In the meanwhile, it is ignored and seccomp is disabled."); } -#line 1189 "cfg.c" +#line 1188 "cfg.c" goto _st291; _ctr336: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1200 "cfg.c" +#line 1199 "cfg.c" { -#line 86 "cfg.rl" +#line 85 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &sockd_uid, &sockd_gid)) suicide("invalid sockd user '%s' specified", ccfg.buf); } -#line 1209 "cfg.c" +#line 1208 "cfg.c" goto _st291; _ctr350: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1220 "cfg.c" +#line 1219 "cfg.c" { -#line 93 "cfg.rl" +#line 92 "cfg.rl" copy_cmdarg(state_dir, ccfg.buf, sizeof state_dir, "state-dir"); } -#line 1228 "cfg.c" +#line 1227 "cfg.c" goto _st291; _ctr360: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1239 "cfg.c" +#line 1238 "cfg.c" { -#line 78 "cfg.rl" +#line 77 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &ndhc_uid, &ndhc_gid)) suicide("invalid ndhc user '%s' specified", ccfg.buf); } -#line 1248 "cfg.c" +#line 1247 "cfg.c" goto _st291; _ctr374: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 1259 "cfg.c" +#line 1258 "cfg.c" { -#line 74 "cfg.rl" +#line 73 "cfg.rl" copy_cmdarg(client_config.vendor, ccfg.buf, sizeof client_config.vendor, "vendorid"); } -#line 1268 "cfg.c" +#line 1267 "cfg.c" goto _st291; _st291: @@ -1430,17 +1429,17 @@ static void parse_cfgfile(const char *fname) goto _ctr30; _ctr30: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1441 "cfg.c" +#line 1440 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1448,12 +1447,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1452 "cfg.c" +#line 1451 "cfg.c" goto _st16; _ctr33: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1461,7 +1460,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1465 "cfg.c" +#line 1464 "cfg.c" goto _st16; _st16: @@ -1475,17 +1474,17 @@ static void parse_cfgfile(const char *fname) goto _ctr33; _ctr31: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1486 "cfg.c" +#line 1485 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1493,7 +1492,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1497 "cfg.c" +#line 1496 "cfg.c" goto _st17; _st17: @@ -1558,17 +1557,17 @@ static void parse_cfgfile(const char *fname) goto _ctr38; _ctr38: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1569 "cfg.c" +#line 1568 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1576,12 +1575,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1580 "cfg.c" +#line 1579 "cfg.c" goto _st21; _ctr41: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1589,7 +1588,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1593 "cfg.c" +#line 1592 "cfg.c" goto _st21; _st21: @@ -1603,17 +1602,17 @@ static void parse_cfgfile(const char *fname) goto _ctr41; _ctr39: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1614 "cfg.c" +#line 1613 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1621,7 +1620,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1625 "cfg.c" +#line 1624 "cfg.c" goto _st22; _st22: @@ -1695,17 +1694,17 @@ static void parse_cfgfile(const char *fname) goto _ctr47; _ctr47: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1706 "cfg.c" +#line 1705 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1713,12 +1712,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1717 "cfg.c" +#line 1716 "cfg.c" goto _st27; _ctr50: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1726,7 +1725,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1730 "cfg.c" +#line 1729 "cfg.c" goto _st27; _st27: @@ -1740,17 +1739,17 @@ static void parse_cfgfile(const char *fname) goto _ctr50; _ctr48: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1751 "cfg.c" +#line 1750 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1758,7 +1757,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1762 "cfg.c" +#line 1761 "cfg.c" goto _st28; _st28: @@ -1841,17 +1840,17 @@ static void parse_cfgfile(const char *fname) goto _ctr57; _ctr57: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1852 "cfg.c" +#line 1851 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1859,12 +1858,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1863 "cfg.c" +#line 1862 "cfg.c" goto _st34; _ctr60: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1872,7 +1871,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1876 "cfg.c" +#line 1875 "cfg.c" goto _st34; _st34: @@ -1886,17 +1885,17 @@ static void parse_cfgfile(const char *fname) goto _ctr60; _ctr58: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 1897 "cfg.c" +#line 1896 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -1904,7 +1903,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 1908 "cfg.c" +#line 1907 "cfg.c" goto _st35; _st35: @@ -2010,17 +2009,17 @@ static void parse_cfgfile(const char *fname) goto _ctr70; _ctr70: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2021 "cfg.c" +#line 2020 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2028,12 +2027,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2032 "cfg.c" +#line 2031 "cfg.c" goto _st43; _ctr73: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2041,7 +2040,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2045 "cfg.c" +#line 2044 "cfg.c" goto _st43; _st43: @@ -2055,17 +2054,17 @@ static void parse_cfgfile(const char *fname) goto _ctr73; _ctr71: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2066 "cfg.c" +#line 2065 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2073,7 +2072,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2077 "cfg.c" +#line 2076 "cfg.c" goto _st44; _st44: @@ -2183,17 +2182,17 @@ static void parse_cfgfile(const char *fname) goto _ctr83; _ctr83: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2194 "cfg.c" +#line 2193 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2201,12 +2200,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2205 "cfg.c" +#line 2204 "cfg.c" goto _st53; _ctr86: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2214,7 +2213,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2218 "cfg.c" +#line 2217 "cfg.c" goto _st53; _st53: @@ -2228,17 +2227,17 @@ static void parse_cfgfile(const char *fname) goto _ctr86; _ctr84: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2239 "cfg.c" +#line 2238 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2246,7 +2245,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2250 "cfg.c" +#line 2249 "cfg.c" goto _st54; _st54: @@ -2642,17 +2641,17 @@ static void parse_cfgfile(const char *fname) goto _ctr126; _ctr126: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2653 "cfg.c" +#line 2652 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2660,12 +2659,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2664 "cfg.c" +#line 2663 "cfg.c" goto _st92; _ctr129: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2673,7 +2672,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2677 "cfg.c" +#line 2676 "cfg.c" goto _st92; _st92: @@ -2687,17 +2686,17 @@ static void parse_cfgfile(const char *fname) goto _ctr129; _ctr127: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2698 "cfg.c" +#line 2697 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2705,7 +2704,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2709 "cfg.c" +#line 2708 "cfg.c" goto _st93; _st93: @@ -2824,17 +2823,17 @@ static void parse_cfgfile(const char *fname) goto _ctr140; _ctr140: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2835 "cfg.c" +#line 2834 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2842,12 +2841,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2846 "cfg.c" +#line 2845 "cfg.c" goto _st103; _ctr143: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2855,7 +2854,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2859 "cfg.c" +#line 2858 "cfg.c" goto _st103; _st103: @@ -2869,17 +2868,17 @@ static void parse_cfgfile(const char *fname) goto _ctr143; _ctr141: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 2880 "cfg.c" +#line 2879 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -2887,7 +2886,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 2891 "cfg.c" +#line 2890 "cfg.c" goto _st104; _st104: @@ -3020,17 +3019,17 @@ static void parse_cfgfile(const char *fname) goto _ctr156; _ctr156: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3031 "cfg.c" +#line 3030 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3038,12 +3037,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3042 "cfg.c" +#line 3041 "cfg.c" goto _st115; _ctr159: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3051,7 +3050,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3055 "cfg.c" +#line 3054 "cfg.c" goto _st115; _st115: @@ -3065,17 +3064,17 @@ static void parse_cfgfile(const char *fname) goto _ctr159; _ctr157: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3076 "cfg.c" +#line 3075 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3083,7 +3082,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3087 "cfg.c" +#line 3086 "cfg.c" goto _st116; _st116: @@ -3202,17 +3201,17 @@ static void parse_cfgfile(const char *fname) goto _ctr170; _ctr170: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3213 "cfg.c" +#line 3212 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3220,12 +3219,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3224 "cfg.c" +#line 3223 "cfg.c" goto _st126; _ctr173: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3233,7 +3232,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3237 "cfg.c" +#line 3236 "cfg.c" goto _st126; _st126: @@ -3247,17 +3246,17 @@ static void parse_cfgfile(const char *fname) goto _ctr173; _ctr171: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3258 "cfg.c" +#line 3257 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3265,7 +3264,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3269 "cfg.c" +#line 3268 "cfg.c" goto _st127; _st127: @@ -3789,17 +3788,17 @@ static void parse_cfgfile(const char *fname) goto _ctr227; _ctr227: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3800 "cfg.c" +#line 3799 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3807,12 +3806,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3811 "cfg.c" +#line 3810 "cfg.c" goto _st175; _ctr230: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3820,7 +3819,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3824 "cfg.c" +#line 3823 "cfg.c" goto _st175; _st175: @@ -3834,17 +3833,17 @@ static void parse_cfgfile(const char *fname) goto _ctr230; _ctr228: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3845 "cfg.c" +#line 3844 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3852,7 +3851,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 3856 "cfg.c" +#line 3855 "cfg.c" goto _st176; _st176: @@ -3980,17 +3979,17 @@ static void parse_cfgfile(const char *fname) goto _ctr242; _ctr242: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 3991 "cfg.c" +#line 3990 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -3998,12 +3997,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4002 "cfg.c" +#line 4001 "cfg.c" goto _st187; _ctr245: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4011,7 +4010,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4015 "cfg.c" +#line 4014 "cfg.c" goto _st187; _st187: @@ -4025,17 +4024,17 @@ static void parse_cfgfile(const char *fname) goto _ctr245; _ctr243: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4036 "cfg.c" +#line 4035 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4043,7 +4042,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4047 "cfg.c" +#line 4046 "cfg.c" goto _st188; _st188: @@ -4171,17 +4170,17 @@ static void parse_cfgfile(const char *fname) goto _ctr257; _ctr257: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4182 "cfg.c" +#line 4181 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4189,12 +4188,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4193 "cfg.c" +#line 4192 "cfg.c" goto _st199; _ctr260: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4202,7 +4201,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4206 "cfg.c" +#line 4205 "cfg.c" goto _st199; _st199: @@ -4216,17 +4215,17 @@ static void parse_cfgfile(const char *fname) goto _ctr260; _ctr258: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4227 "cfg.c" +#line 4226 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4234,7 +4233,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4238 "cfg.c" +#line 4237 "cfg.c" goto _st200; _st200: @@ -4376,17 +4375,17 @@ static void parse_cfgfile(const char *fname) goto _ctr276; _ctr276: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4387 "cfg.c" +#line 4386 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4394,12 +4393,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4398 "cfg.c" +#line 4397 "cfg.c" goto _st211; _ctr279: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4407,7 +4406,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4411 "cfg.c" +#line 4410 "cfg.c" goto _st211; _st211: @@ -4421,17 +4420,17 @@ static void parse_cfgfile(const char *fname) goto _ctr279; _ctr277: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4432 "cfg.c" +#line 4431 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4439,7 +4438,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4443 "cfg.c" +#line 4442 "cfg.c" goto _st212; _st212: @@ -4576,17 +4575,17 @@ static void parse_cfgfile(const char *fname) goto _ctr292; _ctr292: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4587 "cfg.c" +#line 4586 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4594,12 +4593,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4598 "cfg.c" +#line 4597 "cfg.c" goto _st224; _ctr295: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4607,7 +4606,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4611 "cfg.c" +#line 4610 "cfg.c" goto _st224; _st224: @@ -4621,17 +4620,17 @@ static void parse_cfgfile(const char *fname) goto _ctr295; _ctr293: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 4632 "cfg.c" +#line 4631 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -4639,7 +4638,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 4643 "cfg.c" +#line 4642 "cfg.c" goto _st225; _st225: @@ -5008,17 +5007,17 @@ static void parse_cfgfile(const char *fname) goto _ctr332; _ctr332: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5019 "cfg.c" +#line 5018 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5026,12 +5025,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5030 "cfg.c" +#line 5029 "cfg.c" goto _st260; _ctr335: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5039,7 +5038,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5043 "cfg.c" +#line 5042 "cfg.c" goto _st260; _st260: @@ -5053,17 +5052,17 @@ static void parse_cfgfile(const char *fname) goto _ctr335; _ctr333: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5064 "cfg.c" +#line 5063 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5071,7 +5070,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5075 "cfg.c" +#line 5074 "cfg.c" goto _st261; _st261: @@ -5190,17 +5189,17 @@ static void parse_cfgfile(const char *fname) goto _ctr346; _ctr346: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5201 "cfg.c" +#line 5200 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5208,12 +5207,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5212 "cfg.c" +#line 5211 "cfg.c" goto _st271; _ctr349: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5221,7 +5220,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5225 "cfg.c" +#line 5224 "cfg.c" goto _st271; _st271: @@ -5235,17 +5234,17 @@ static void parse_cfgfile(const char *fname) goto _ctr349; _ctr347: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5246 "cfg.c" +#line 5245 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5253,7 +5252,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5257 "cfg.c" +#line 5256 "cfg.c" goto _st272; _st272: @@ -5336,17 +5335,17 @@ static void parse_cfgfile(const char *fname) goto _ctr356; _ctr356: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5347 "cfg.c" +#line 5346 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5354,12 +5353,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5358 "cfg.c" +#line 5357 "cfg.c" goto _st278; _ctr359: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5367,7 +5366,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5371 "cfg.c" +#line 5370 "cfg.c" goto _st278; _st278: @@ -5381,17 +5380,17 @@ static void parse_cfgfile(const char *fname) goto _ctr359; _ctr357: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5392 "cfg.c" +#line 5391 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5399,7 +5398,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5403 "cfg.c" +#line 5402 "cfg.c" goto _st279; _st279: @@ -5518,17 +5517,17 @@ static void parse_cfgfile(const char *fname) goto _ctr370; _ctr370: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5529 "cfg.c" +#line 5528 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5536,12 +5535,12 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5540 "cfg.c" +#line 5539 "cfg.c" goto _st289; _ctr373: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5549,7 +5548,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5553 "cfg.c" +#line 5552 "cfg.c" goto _st289; _st289: @@ -5563,17 +5562,17 @@ static void parse_cfgfile(const char *fname) goto _ctr373; _ctr371: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 5574 "cfg.c" +#line 5573 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -5581,7 +5580,7 @@ static void parse_cfgfile(const char *fname) suicide("line or option is too long"); } -#line 5585 "cfg.c" +#line 5584 "cfg.c" goto _st290; _st290: @@ -5896,7 +5895,7 @@ static void parse_cfgfile(const char *fname) _out: {} } -#line 254 "cfg.rl" +#line 253 "cfg.rl" if (ccfg.cs == file_cfg_error) @@ -5922,11 +5921,11 @@ static void parse_cfgfile(const char *fname) } -#line 324 "cfg.rl" +#line 323 "cfg.rl" -#line 5930 "cfg.c" +#line 5929 "cfg.c" static const int cmd_cfg_start = 248; static const int cmd_cfg_first_final = 248; static const int cmd_cfg_error = 0; @@ -5934,7 +5933,7 @@ static const int cmd_cfg_error = 0; static const int cmd_cfg_en_main = 248; -#line 326 "cfg.rl" +#line 325 "cfg.rl" void parse_cmdline(int argc, char *argv[]) @@ -5943,12 +5942,9 @@ void parse_cmdline(int argc, char *argv[]) size_t argbl = 0; for (size_t i = 1; i < (size_t)argc; ++i) { ssize_t snl; - if (i > 1) - snl = stbsp_snprintf(argb + argbl, sizeof argb - argbl, "%c%s", - 0, argv[i]); - else - snl = stbsp_snprintf(argb + argbl, sizeof argb - argbl, "%s", argv[i]); - if (snl < 0 || (size_t)snl > sizeof argb) + if (i > 1) snl = snprintf(argb + argbl, sizeof argb - argbl, "%c%s", 0, argv[i]); + else snl = snprintf(argb + argbl, sizeof argb - argbl, "%s", argv[i]); + if (snl < 0 || (size_t)snl > sizeof argb) suicide("error parsing command line option: option too long"); argbl += (size_t)snl; } @@ -5961,15 +5957,15 @@ void parse_cmdline(int argc, char *argv[]) const char *eof = pe; -#line 5965 "cfg.c" +#line 5961 "cfg.c" { ccfg.cs = (int)cmd_cfg_start; } -#line 351 "cfg.rl" +#line 347 "cfg.rl" -#line 5973 "cfg.c" +#line 5969 "cfg.c" { switch ( ccfg.cs ) { case 248: @@ -6475,16 +6471,16 @@ void parse_cmdline(int argc, char *argv[]) } _ctr58: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6485 "cfg.c" +#line 6481 "cfg.c" { -#line 128 "cfg.rl" +#line 127 "cfg.rl" int t = atoi(ccfg.buf); arp_probe_max = t; @@ -6495,21 +6491,21 @@ void parse_cmdline(int argc, char *argv[]) } } -#line 6499 "cfg.c" +#line 6495 "cfg.c" goto _st248; _ctr63: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6510 "cfg.c" +#line 6506 "cfg.c" { -#line 119 "cfg.rl" +#line 118 "cfg.rl" int t = atoi(ccfg.buf); arp_probe_min = t; @@ -6520,116 +6516,116 @@ void parse_cmdline(int argc, char *argv[]) } } -#line 6524 "cfg.c" +#line 6520 "cfg.c" goto _st248; _ctr69: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6535 "cfg.c" +#line 6531 "cfg.c" { -#line 114 "cfg.rl" +#line 113 "cfg.rl" int t = atoi(ccfg.buf); if (t >= 0) arp_probe_num = t; } -#line 6545 "cfg.c" +#line 6541 "cfg.c" goto _st248; _ctr76: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6556 "cfg.c" +#line 6552 "cfg.c" { -#line 109 "cfg.rl" +#line 108 "cfg.rl" int t = atoi(ccfg.buf); if (t >= 0) arp_probe_wait = t; } -#line 6566 "cfg.c" +#line 6562 "cfg.c" goto _st248; _ctr87: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6577 "cfg.c" +#line 6573 "cfg.c" { -#line 90 "cfg.rl" +#line 89 "cfg.rl" copy_cmdarg(chroot_dir, ccfg.buf, sizeof chroot_dir, "chroot"); } -#line 6585 "cfg.c" +#line 6581 "cfg.c" goto _st248; _ctr97: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6596 "cfg.c" +#line 6592 "cfg.c" { -#line 58 "cfg.rl" +#line 57 "cfg.rl" get_clientid_string(ccfg.buf, ccfg.buflen); } -#line 6602 "cfg.c" +#line 6598 "cfg.c" goto _st248; _ctr105: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6613 "cfg.c" +#line 6609 "cfg.c" { -#line 283 "cfg.rl" +#line 282 "cfg.rl" parse_cfgfile(ccfg.buf); } -#line 6619 "cfg.c" +#line 6615 "cfg.c" goto _st248; _ctr133: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6630 "cfg.c" +#line 6626 "cfg.c" { -#line 137 "cfg.rl" +#line 136 "cfg.rl" char *q; long mt = strtol(ccfg.buf, &q, 10); @@ -6642,259 +6638,259 @@ void parse_cmdline(int argc, char *argv[]) client_config.metric = (int)mt; } -#line 6646 "cfg.c" +#line 6642 "cfg.c" goto _st248; _ctr137: { -#line 168 "cfg.rl" +#line 167 "cfg.rl" show_usage(); exit(EXIT_SUCCESS); } -#line 6654 "cfg.c" +#line 6650 "cfg.c" goto _st248; _ctr147: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6665 "cfg.c" +#line 6661 "cfg.c" { -#line 59 "cfg.rl" +#line 58 "cfg.rl" copy_cmdarg(client_config.hostname, ccfg.buf, sizeof client_config.hostname, "hostname"); } -#line 6674 "cfg.c" +#line 6670 "cfg.c" goto _st248; _ctr160: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6685 "cfg.c" +#line 6681 "cfg.c" { -#line 82 "cfg.rl" +#line 81 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &ifch_uid, &ifch_gid)) suicide("invalid ifch user '%s' specified", ccfg.buf); } -#line 6694 "cfg.c" +#line 6690 "cfg.c" goto _st248; _ctr171: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6705 "cfg.c" +#line 6701 "cfg.c" { -#line 63 "cfg.rl" +#line 62 "cfg.rl" copy_cmdarg(client_config.interface, ccfg.buf, sizeof client_config.interface, "interface"); } -#line 6714 "cfg.c" +#line 6710 "cfg.c" goto _st248; _ctr201: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6725 "cfg.c" +#line 6721 "cfg.c" { -#line 73 "cfg.rl" +#line 72 "cfg.rl" set_client_addr(ccfg.buf); } -#line 6731 "cfg.c" +#line 6727 "cfg.c" goto _st248; _ctr213: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6742 "cfg.c" +#line 6738 "cfg.c" { -#line 148 "cfg.rl" +#line 147 "cfg.rl" copy_cmdarg(resolv_conf_d, ccfg.buf, sizeof resolv_conf_d, "resolv-conf"); } -#line 6751 "cfg.c" +#line 6747 "cfg.c" goto _st248; _ctr225: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6762 "cfg.c" +#line 6758 "cfg.c" { -#line 158 "cfg.rl" +#line 157 "cfg.rl" uint32_t t = (uint32_t)atoi(ccfg.buf); client_config.rfkillIdx = t; client_config.enable_rfkill = true; } -#line 6772 "cfg.c" +#line 6768 "cfg.c" goto _st248; _ctr241: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6783 "cfg.c" +#line 6779 "cfg.c" { -#line 163 "cfg.rl" +#line 162 "cfg.rl" client_config.s6_notify_fd = atoi(ccfg.buf); client_config.enable_s6_notify = true; } -#line 6792 "cfg.c" +#line 6788 "cfg.c" goto _st248; _ctr254: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6803 "cfg.c" +#line 6799 "cfg.c" { -#line 96 "cfg.rl" +#line 95 "cfg.rl" copy_cmdarg(script_file, ccfg.buf, sizeof script_file, "script-file"); } -#line 6811 "cfg.c" +#line 6807 "cfg.c" goto _st248; _ctr279: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6822 "cfg.c" +#line 6818 "cfg.c" { -#line 86 "cfg.rl" +#line 85 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &sockd_uid, &sockd_gid)) suicide("invalid sockd user '%s' specified", ccfg.buf); } -#line 6831 "cfg.c" +#line 6827 "cfg.c" goto _st248; _ctr290: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6842 "cfg.c" +#line 6838 "cfg.c" { -#line 93 "cfg.rl" +#line 92 "cfg.rl" copy_cmdarg(state_dir, ccfg.buf, sizeof state_dir, "state-dir"); } -#line 6850 "cfg.c" +#line 6846 "cfg.c" goto _st248; _ctr297: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6861 "cfg.c" +#line 6857 "cfg.c" { -#line 78 "cfg.rl" +#line 77 "cfg.rl" if (nk_uidgidbyname(ccfg.buf, &ndhc_uid, &ndhc_gid)) suicide("invalid ndhc user '%s' specified", ccfg.buf); } -#line 6870 "cfg.c" +#line 6866 "cfg.c" goto _st248; _ctr309: { -#line 51 "cfg.rl" +#line 50 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf) ccfg.buf[ccfg.buflen] = 0; } -#line 6881 "cfg.c" +#line 6877 "cfg.c" { -#line 74 "cfg.rl" +#line 73 "cfg.rl" copy_cmdarg(client_config.vendor, ccfg.buf, sizeof client_config.vendor, "vendorid"); } -#line 6890 "cfg.c" +#line 6886 "cfg.c" goto _st248; _ctr313: { -#line 167 "cfg.rl" +#line 166 "cfg.rl" print_version(); exit(EXIT_SUCCESS); } -#line 6898 "cfg.c" +#line 6894 "cfg.c" goto _st248; _st248: @@ -6919,10 +6915,10 @@ void parse_cmdline(int argc, char *argv[]) goto _out0; _ctr316: { -#line 284 "cfg.rl" +#line 283 "cfg.rl" ccfg.ternary = 1; } -#line 6926 "cfg.c" +#line 6922 "cfg.c" goto _st1; _st1: @@ -7292,17 +7288,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr55: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7303 "cfg.c" +#line 7299 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7310,12 +7306,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7314 "cfg.c" +#line 7310 "cfg.c" goto _st17; _ctr57: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7323,7 +7319,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7327 "cfg.c" +#line 7323 "cfg.c" goto _st17; _st17: @@ -7388,17 +7384,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr60: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7399 "cfg.c" +#line 7395 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7406,12 +7402,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7410 "cfg.c" +#line 7406 "cfg.c" goto _st21; _ctr62: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7419,7 +7415,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7423 "cfg.c" +#line 7419 "cfg.c" goto _st21; _st21: @@ -7499,17 +7495,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr66: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7510 "cfg.c" +#line 7506 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7517,12 +7513,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7521 "cfg.c" +#line 7517 "cfg.c" goto _st26; _ctr68: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7530,7 +7526,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7534 "cfg.c" +#line 7530 "cfg.c" goto _st26; _st26: @@ -7625,17 +7621,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr73: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7636 "cfg.c" +#line 7632 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7643,12 +7639,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7647 "cfg.c" +#line 7643 "cfg.c" goto _st32; _ctr75: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7656,7 +7652,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7660 "cfg.c" +#line 7656 "cfg.c" goto _st32; _st32: @@ -7789,17 +7785,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr84: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7800 "cfg.c" +#line 7796 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7807,12 +7803,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7811 "cfg.c" +#line 7807 "cfg.c" goto _st40; _ctr86: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7820,7 +7816,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7824 "cfg.c" +#line 7820 "cfg.c" goto _st40; _st40: @@ -7960,17 +7956,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr94: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 7971 "cfg.c" +#line 7967 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7978,12 +7974,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7982 "cfg.c" +#line 7978 "cfg.c" goto _st49; _ctr96: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -7991,7 +7987,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 7995 "cfg.c" +#line 7991 "cfg.c" goto _st49; _st49: @@ -8101,17 +8097,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr102: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 8112 "cfg.c" +#line 8108 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8119,12 +8115,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8123 "cfg.c" +#line 8119 "cfg.c" goto _st56; _ctr104: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8132,7 +8128,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8136 "cfg.c" +#line 8132 "cfg.c" goto _st56; _st56: @@ -8407,7 +8403,7 @@ void parse_cmdline(int argc, char *argv[]) } _ctr121: { -#line 152 "cfg.rl" +#line 151 "cfg.rl" switch (ccfg.ternary) { case 1: allow_hostname = 1; break; @@ -8415,12 +8411,12 @@ void parse_cmdline(int argc, char *argv[]) } } -#line 8419 "cfg.c" +#line 8415 "cfg.c" goto _st249; _ctr173: { -#line 67 "cfg.rl" +#line 66 "cfg.rl" switch (ccfg.ternary) { case 1: client_config.abort_if_no_lease = true; break; @@ -8428,12 +8424,12 @@ void parse_cmdline(int argc, char *argv[]) } } -#line 8432 "cfg.c" +#line 8428 "cfg.c" goto _st249; _ctr193: { -#line 103 "cfg.rl" +#line 102 "cfg.rl" switch (ccfg.ternary) { case 1: set_arp_relentless_def(true); break; @@ -8441,26 +8437,26 @@ void parse_cmdline(int argc, char *argv[]) } } -#line 8445 "cfg.c" +#line 8441 "cfg.c" goto _st249; _ctr267: { -#line 99 "cfg.rl" +#line 98 "cfg.rl" log_line("seccomp_enforce option is deprecated; please remove it"); log_line("In the meanwhile, it is ignored and seccomp is disabled."); } -#line 8456 "cfg.c" +#line 8452 "cfg.c" goto _st249; _ctr315: { -#line 284 "cfg.rl" +#line 283 "cfg.rl" ccfg.ternary = 1; } -#line 8464 "cfg.c" +#line 8460 "cfg.c" goto _st249; _st249: @@ -8630,17 +8626,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr130: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 8641 "cfg.c" +#line 8637 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8648,12 +8644,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8652 "cfg.c" +#line 8648 "cfg.c" goto _st84; _ctr132: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8661,7 +8657,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8665 "cfg.c" +#line 8661 "cfg.c" goto _st84; _st84: @@ -8866,17 +8862,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr144: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 8877 "cfg.c" +#line 8873 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8884,12 +8880,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8888 "cfg.c" +#line 8884 "cfg.c" goto _st97; _ctr146: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -8897,7 +8893,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 8901 "cfg.c" +#line 8897 "cfg.c" goto _st97; _st97: @@ -9072,17 +9068,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr157: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 9083 "cfg.c" +#line 9079 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9090,12 +9086,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9094 "cfg.c" +#line 9090 "cfg.c" goto _st108; _ctr159: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9103,7 +9099,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9107 "cfg.c" +#line 9103 "cfg.c" goto _st108; _st108: @@ -9258,17 +9254,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr168: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 9269 "cfg.c" +#line 9265 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9276,12 +9272,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9280 "cfg.c" +#line 9276 "cfg.c" goto _st118; _ctr170: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9289,7 +9285,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9293 "cfg.c" +#line 9289 "cfg.c" goto _st118; _st118: @@ -9727,17 +9723,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr198: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 9738 "cfg.c" +#line 9734 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9745,12 +9741,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9749 "cfg.c" +#line 9745 "cfg.c" goto _st146; _ctr200: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9758,7 +9754,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9762 "cfg.c" +#line 9758 "cfg.c" goto _st146; _st146: @@ -9928,17 +9924,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr210: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 9939 "cfg.c" +#line 9935 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9946,12 +9942,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9950 "cfg.c" +#line 9946 "cfg.c" goto _st157; _ctr212: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -9959,7 +9955,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 9963 "cfg.c" +#line 9959 "cfg.c" goto _st157; _st157: @@ -10129,17 +10125,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr222: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 10140 "cfg.c" +#line 10136 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10147,12 +10143,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10151 "cfg.c" +#line 10147 "cfg.c" goto _st168; _ctr224: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10160,7 +10156,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10164 "cfg.c" +#line 10160 "cfg.c" goto _st168; _st168: @@ -10344,17 +10340,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr238: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 10355 "cfg.c" +#line 10351 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10362,12 +10358,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10366 "cfg.c" +#line 10362 "cfg.c" goto _st179; _ctr240: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10375,7 +10371,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10379 "cfg.c" +#line 10375 "cfg.c" goto _st179; _st179: @@ -10560,17 +10556,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr251: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 10571 "cfg.c" +#line 10567 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10578,12 +10574,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10582 "cfg.c" +#line 10578 "cfg.c" goto _st191; _ctr253: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10591,7 +10587,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10595 "cfg.c" +#line 10591 "cfg.c" goto _st191; _st191: @@ -10971,17 +10967,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr276: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 10982 "cfg.c" +#line 10978 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -10989,12 +10985,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 10993 "cfg.c" +#line 10989 "cfg.c" goto _st216; _ctr278: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11002,7 +10998,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11006 "cfg.c" +#line 11002 "cfg.c" goto _st216; _st216: @@ -11157,17 +11153,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr287: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 11168 "cfg.c" +#line 11164 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11175,12 +11171,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11179 "cfg.c" +#line 11175 "cfg.c" goto _st226; _ctr289: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11188,7 +11184,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11192 "cfg.c" +#line 11188 "cfg.c" goto _st226; _st226: @@ -11283,17 +11279,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr294: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 11294 "cfg.c" +#line 11290 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11301,12 +11297,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11305 "cfg.c" +#line 11301 "cfg.c" goto _st232; _ctr296: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11314,7 +11310,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11318 "cfg.c" +#line 11314 "cfg.c" goto _st232; _st232: @@ -11474,17 +11470,17 @@ void parse_cmdline(int argc, char *argv[]) } _ctr306: { -#line 40 "cfg.rl" +#line 39 "cfg.rl" memset(&ccfg.buf, 0, sizeof ccfg.buf); ccfg.buflen = 0; ccfg.ternary = 0; } -#line 11485 "cfg.c" +#line 11481 "cfg.c" { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11492,12 +11488,12 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11496 "cfg.c" +#line 11492 "cfg.c" goto _st242; _ctr308: { -#line 45 "cfg.rl" +#line 44 "cfg.rl" if (ccfg.buflen < sizeof ccfg.buf - 1) ccfg.buf[ccfg.buflen++] = *p; @@ -11505,7 +11501,7 @@ void parse_cmdline(int argc, char *argv[]) suicide("line or option is too long"); } -#line 11509 "cfg.c" +#line 11505 "cfg.c" goto _st242; _st242: @@ -11851,7 +11847,7 @@ void parse_cmdline(int argc, char *argv[]) _out: {} } -#line 352 "cfg.rl" +#line 348 "cfg.rl" if (ccfg.cs == cmd_cfg_error) diff --git a/cfg.rl b/cfg.rl index 762b845..b050030 100644 --- a/cfg.rl +++ b/cfg.rl @@ -13,16 +13,15 @@ #include "ndhc.h" #include "ifchd.h" #include "sockd.h" -#include "nk/stb_sprintf.h" #include "nk/log.h" +#include "nk/nstrcpy.h" #include "nk/privs.h" #include "nk/io.h" static void copy_cmdarg(char *dest, const char *src, size_t destlen, const char *argname) { - ssize_t olen = stbsp_snprintf(dest, destlen, "%s", src); - if (olen < 0 || (size_t)olen > destlen) + if (!nstrcpy(dest, destlen, src)) suicide("snprintf failed on %s", argname); } @@ -331,11 +330,8 @@ void parse_cmdline(int argc, char *argv[]) size_t argbl = 0; for (size_t i = 1; i < (size_t)argc; ++i) { ssize_t snl; - if (i > 1) - snl = stbsp_snprintf(argb + argbl, sizeof argb - argbl, "%c%s", - 0, argv[i]); - else - snl = stbsp_snprintf(argb + argbl, sizeof argb - argbl, "%s", argv[i]); + if (i > 1) snl = snprintf(argb + argbl, sizeof argb - argbl, "%c%s", 0, argv[i]); + else snl = snprintf(argb + argbl, sizeof argb - argbl, "%s", argv[i]); if (snl < 0 || (size_t)snl > sizeof argb) suicide("error parsing command line option: option too long"); argbl += (size_t)snl; diff --git a/duiaid.c b/duiaid.c index 7e4b970..3363c82 100644 --- a/duiaid.c +++ b/duiaid.c @@ -10,7 +10,6 @@ #include #include #include -#include "nk/stb_sprintf.h" #include "nk/log.h" #include "nk/random.h" #include "nk/io.h" @@ -19,7 +18,7 @@ static void get_duid_path(char *duidfile, size_t dlen) { - int splen = stbsp_snprintf(duidfile, dlen, "%s/DUID", state_dir); + int splen = snprintf(duidfile, dlen, "%s/DUID", state_dir); if (splen < 0 || (size_t)splen > dlen) suicide("%s: snprintf failed; return=%d", __func__, splen); } @@ -30,7 +29,7 @@ static void get_iaid_path(char *iaidfile, size_t ilen, if (hwaddrlen != 6) suicide("%s: Hardware address length=%zu != 6 bytes", __func__, hwaddrlen); - int splen = stbsp_snprintf + int splen = snprintf (iaidfile, ilen, "%s/IAID-%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x", state_dir, hwaddr[0], hwaddr[1], hwaddr[2], diff --git a/ifchange.c b/ifchange.c index 5cfeb44..015b575 100644 --- a/ifchange.c +++ b/ifchange.c @@ -9,7 +9,6 @@ #include #include #include -#include "nk/stb_sprintf.h" #include "nk/log.h" #include "nk/io.h" #include "options.h" @@ -40,8 +39,7 @@ static int ifcmd_raw(char *buf, size_t buflen, const char *optname, return -1; } int ioptlen = (int)optlen; - ssize_t olen = stbsp_snprintf(buf, buflen, "%s:%.*s;", - optname, ioptlen, optdata); + ssize_t olen = snprintf(buf, buflen, "%s:%.*s;", optname, ioptlen, optdata); if (olen < 0 || (size_t)olen > buflen) { log_line("%s: (%s) '%s' option would truncate, so it was dropped.", client_config.interface, __func__, optname); @@ -64,7 +62,7 @@ static int ifcmd_u8(char *buf, size_t buflen, const char *optname, return -1; char numbuf[16]; uint8_t c = optdata[0]; - ssize_t olen = stbsp_snprintf(numbuf, sizeof numbuf, "%c", c); + ssize_t olen = snprintf(numbuf, sizeof numbuf, "%c", c); if (olen < 0 || (size_t)olen > sizeof numbuf) return -1; return ifcmd_raw(buf, buflen, optname, numbuf, strlen(numbuf)); @@ -79,7 +77,7 @@ static int ifcmd_u16(char *buf, size_t buflen, const char *optname, uint16_t v; memcpy(&v, optdata, 2); v = ntohs(v); - ssize_t olen = stbsp_snprintf(numbuf, sizeof numbuf, "%hu", v); + ssize_t olen = snprintf(numbuf, sizeof numbuf, "%hu", v); if (olen < 0 || (size_t)olen > sizeof numbuf) return -1; return ifcmd_raw(buf, buflen, optname, numbuf, strlen(numbuf)); @@ -94,7 +92,7 @@ static int ifcmd_s32(char *buf, size_t buflen, const char *optname, uint32_t v; memcpy(&v, optdata, 4); v = ntohl(v); - ssize_t olen = stbsp_snprintf(numbuf, sizeof numbuf, "%d", v); + ssize_t olen = snprintf(numbuf, sizeof numbuf, "%d", v); if (olen < 0 || (size_t)olen > sizeof numbuf) return -1; return ifcmd_raw(buf, buflen, optname, numbuf, strlen(numbuf)); @@ -122,14 +120,14 @@ static int ifcmd_iplist(char *out, size_t outlen, const char *optname, return -1; inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf); - ssize_t wc = stbsp_snprintf(buf + bufoff, sizeof buf, "%s", ipbuf); + ssize_t wc = snprintf(buf + bufoff, sizeof buf, "%s", ipbuf); if (wc < 0 || (size_t)wc > sizeof buf) return -1; optoff += 4; bufoff += (size_t)wc; while (optlen >= 4 + optoff) { inet_ntop(AF_INET, optdata + optoff, ipbuf, sizeof ipbuf); - wc = stbsp_snprintf(buf + bufoff, sizeof buf, ",%s", ipbuf); + wc = snprintf(buf + bufoff, sizeof buf, ",%s", ipbuf); if (wc < 0 || (size_t)wc > sizeof buf) return -1; optoff += 4; @@ -193,20 +191,18 @@ static int ifchwrite(const char *buf, size_t count) bool ifchange_carrier_isup(void) { - char buf[256]; - stbsp_snprintf(buf, sizeof buf, "carrier:;"); + const char buf[] = "carrier:;"; return ifchwrite(buf, strlen(buf)) == 0; } int ifchange_deconfig(struct client_state_t *cs) { - char buf[256]; + const char buf[] = "ip4:0.0.0.0,255.255.255.255;"; int ret = -1; if (cs->ifDeconfig) return 0; - stbsp_snprintf(buf, sizeof buf, "ip4:0.0.0.0,255.255.255.255;"); log_line("%s: Resetting IP configuration.", client_config.interface); ret = ifchwrite(buf, strlen(buf)); @@ -266,9 +262,9 @@ static size_t send_client_ip(char *out, size_t olen, int snlen; if (have_bcast) { - snlen = stbsp_snprintf(out, olen, "ip4:%s,%s,%s;", ip, sn, bc); + snlen = snprintf(out, olen, "ip4:%s,%s,%s;", ip, sn, bc); } else { - snlen = stbsp_snprintf(out, olen, "ip4:%s,%s;", ip, sn); + snlen = snprintf(out, olen, "ip4:%s,%s;", ip, sn); } if (snlen < 0 || (size_t)snlen > olen) { log_line("%s: (%s) ip4 command would truncate so it was dropped.", diff --git a/ifchd-parse.c b/ifchd-parse.c index ddc4416..6682bb4 100644 --- a/ifchd-parse.c +++ b/ifchd-parse.c @@ -6,8 +6,8 @@ #include #include #include -#include "nk/stb_sprintf.h" #include "nk/log.h" +#include "nk/nstrcpy.h" #include "ifchd-parse.h" #include "ifchd.h" #include "ifset.h" @@ -1187,10 +1187,14 @@ int execute_buffer(const char *newbuf) char tb[MAX_BUF]; int cmdf = 0; - ssize_t buflen = stbsp_snprintf(buf, sizeof buf, "%s%s", cl.ibuf, newbuf); + char *snp = nstrcpy(buf, sizeof buf, cl.ibuf); memset(cl.ibuf, 0, sizeof cl.ibuf); - if (buflen < 0 || (size_t)buflen > sizeof buf) { - log_line("%s: (%s) snprintf1 failed", client_config.interface, __func__); + if (!snp) { + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); + return -99; + } + if (!nstrcat(buf, sizeof buf, newbuf)) { + log_line("%s: (%s) nstrcat failed", client_config.interface, __func__); return -99; } @@ -1202,15 +1206,15 @@ int execute_buffer(const char *newbuf) int cs = 0; -#line 1206 "ifchd-parse.c" +#line 1210 "ifchd-parse.c" { cs = (int)ifchd_parser_start; } -#line 188 "ifchd-parse.rl" +#line 192 "ifchd-parse.rl" -#line 1214 "ifchd-parse.c" +#line 1218 "ifchd-parse.c" { switch ( cs ) { case 1: @@ -1513,7 +1517,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 1517 "ifchd-parse.c" +#line 1521 "ifchd-parse.c" goto _st2; _st2: @@ -1593,7 +1597,7 @@ int execute_buffer(const char *newbuf) #line 155 "ifchd-parse.rl" cl.state = STATE_CARRIER; } -#line 1597 "ifchd-parse.c" +#line 1601 "ifchd-parse.c" { #line 105 "ifchd-parse.rl" @@ -1624,7 +1628,7 @@ int execute_buffer(const char *newbuf) cmdf |= pr; } -#line 1628 "ifchd-parse.c" +#line 1632 "ifchd-parse.c" goto _st126; _ctr39: @@ -1641,7 +1645,7 @@ int execute_buffer(const char *newbuf) tb[arg_len] = 0; } -#line 1645 "ifchd-parse.c" +#line 1649 "ifchd-parse.c" { #line 105 "ifchd-parse.rl" @@ -1672,7 +1676,7 @@ int execute_buffer(const char *newbuf) cmdf |= pr; } -#line 1676 "ifchd-parse.c" +#line 1680 "ifchd-parse.c" goto _st126; _st126: @@ -1718,7 +1722,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 1722 "ifchd-parse.c" +#line 1726 "ifchd-parse.c" goto _st10; _st10: @@ -1767,13 +1771,13 @@ int execute_buffer(const char *newbuf) #line 144 "ifchd-parse.rl" cl.state = STATE_DNS; } -#line 1771 "ifchd-parse.c" +#line 1775 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 1777 "ifchd-parse.c" +#line 1781 "ifchd-parse.c" goto _st14; _ctr115: @@ -1781,13 +1785,13 @@ int execute_buffer(const char *newbuf) #line 145 "ifchd-parse.rl" cl.state = STATE_LPRSVR; } -#line 1785 "ifchd-parse.c" +#line 1789 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 1791 "ifchd-parse.c" +#line 1795 "ifchd-parse.c" goto _st14; _ctr126: @@ -1795,13 +1799,13 @@ int execute_buffer(const char *newbuf) #line 146 "ifchd-parse.rl" cl.state = STATE_NTPSVR; } -#line 1799 "ifchd-parse.c" +#line 1803 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 1805 "ifchd-parse.c" +#line 1809 "ifchd-parse.c" goto _st14; _ctr148: @@ -1809,13 +1813,13 @@ int execute_buffer(const char *newbuf) #line 147 "ifchd-parse.rl" cl.state = STATE_WINS; } -#line 1813 "ifchd-parse.c" +#line 1817 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 1819 "ifchd-parse.c" +#line 1823 "ifchd-parse.c" goto _st14; _st14: @@ -2038,13 +2042,13 @@ int execute_buffer(const char *newbuf) #line 150 "ifchd-parse.rl" cl.state = STATE_DOMAIN; } -#line 2042 "ifchd-parse.c" +#line 2046 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2048 "ifchd-parse.c" +#line 2052 "ifchd-parse.c" goto _st33; _ctr53: @@ -2052,13 +2056,13 @@ int execute_buffer(const char *newbuf) #line 149 "ifchd-parse.rl" cl.state = STATE_HOSTNAME; } -#line 2056 "ifchd-parse.c" +#line 2060 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2062 "ifchd-parse.c" +#line 2066 "ifchd-parse.c" goto _st33; _st33: @@ -2080,7 +2084,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2084 "ifchd-parse.c" +#line 2088 "ifchd-parse.c" goto _st34; _st34: @@ -2138,7 +2142,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2142 "ifchd-parse.c" +#line 2146 "ifchd-parse.c" goto _st39; _st39: @@ -2187,13 +2191,13 @@ int execute_buffer(const char *newbuf) #line 143 "ifchd-parse.rl" cl.state = STATE_IP4SET; } -#line 2191 "ifchd-parse.c" +#line 2195 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2197 "ifchd-parse.c" +#line 2201 "ifchd-parse.c" goto _st43; _st43: @@ -2374,13 +2378,13 @@ int execute_buffer(const char *newbuf) #line 142 "ifchd-parse.rl" cl.state = STATE_ROUTER; } -#line 2378 "ifchd-parse.c" +#line 2382 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2384 "ifchd-parse.c" +#line 2388 "ifchd-parse.c" goto _st59; _st59: @@ -2475,13 +2479,13 @@ int execute_buffer(const char *newbuf) #line 154 "ifchd-parse.rl" cl.state = STATE_IPTTL; } -#line 2479 "ifchd-parse.c" +#line 2483 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2485 "ifchd-parse.c" +#line 2489 "ifchd-parse.c" goto _st67; _st67: @@ -2772,7 +2776,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2776 "ifchd-parse.c" +#line 2780 "ifchd-parse.c" goto _st94; _st94: @@ -2816,7 +2820,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2820 "ifchd-parse.c" +#line 2824 "ifchd-parse.c" goto _st98; _st98: @@ -2857,13 +2861,13 @@ int execute_buffer(const char *newbuf) #line 153 "ifchd-parse.rl" cl.state = STATE_MTU; } -#line 2861 "ifchd-parse.c" +#line 2865 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 2867 "ifchd-parse.c" +#line 2871 "ifchd-parse.c" goto _st102; _st102: @@ -2877,7 +2881,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2881 "ifchd-parse.c" +#line 2885 "ifchd-parse.c" goto _st103; _st103: @@ -2921,7 +2925,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2925 "ifchd-parse.c" +#line 2929 "ifchd-parse.c" goto _st107; _st107: @@ -2983,7 +2987,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 2987 "ifchd-parse.c" +#line 2991 "ifchd-parse.c" goto _st113; _st113: @@ -3042,13 +3046,13 @@ int execute_buffer(const char *newbuf) #line 152 "ifchd-parse.rl" cl.state = STATE_TIMEZONE; } -#line 3046 "ifchd-parse.c" +#line 3050 "ifchd-parse.c" { #line 93 "ifchd-parse.rl" arg_start = p; } -#line 3052 "ifchd-parse.c" +#line 3056 "ifchd-parse.c" goto _st119; _st119: @@ -3068,7 +3072,7 @@ int execute_buffer(const char *newbuf) #line 92 "ifchd-parse.rl" cl.state = STATE_NOTHING; } -#line 3072 "ifchd-parse.c" +#line 3076 "ifchd-parse.c" goto _st121; _st121: @@ -3246,7 +3250,7 @@ int execute_buffer(const char *newbuf) _out: {} } -#line 189 "ifchd-parse.rl" +#line 193 "ifchd-parse.rl" if (cs == ifchd_parser_error) { @@ -3256,9 +3260,8 @@ int execute_buffer(const char *newbuf) } if (cmd_start != pe) { - ssize_t ilen = stbsp_snprintf(cl.ibuf, sizeof cl.ibuf, "%s", cmd_start); - if (ilen < 0 || (size_t)ilen > sizeof buf) { - log_line("%s: (%s) snprintf2 failed", client_config.interface, __func__); + if (!nstrcpy(cl.ibuf, sizeof cl.ibuf, cmd_start)) { + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); return -99; } } diff --git a/ifchd-parse.rl b/ifchd-parse.rl index 860fe32..81a9e23 100644 --- a/ifchd-parse.rl +++ b/ifchd-parse.rl @@ -5,8 +5,8 @@ #include #include #include -#include "nk/stb_sprintf.h" #include "nk/log.h" +#include "nk/nstrcpy.h" #include "ifchd-parse.h" #include "ifchd.h" #include "ifset.h" @@ -171,10 +171,14 @@ int execute_buffer(const char *newbuf) char tb[MAX_BUF]; int cmdf = 0; - ssize_t buflen = stbsp_snprintf(buf, sizeof buf, "%s%s", cl.ibuf, newbuf); + char *snp = nstrcpy(buf, sizeof buf, cl.ibuf); memset(cl.ibuf, 0, sizeof cl.ibuf); - if (buflen < 0 || (size_t)buflen > sizeof buf) { - log_line("%s: (%s) snprintf1 failed", client_config.interface, __func__); + if (!snp) { + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); + return -99; + } + if (!nstrcat(buf, sizeof buf, newbuf)) { + log_line("%s: (%s) nstrcat failed", client_config.interface, __func__); return -99; } @@ -195,9 +199,8 @@ int execute_buffer(const char *newbuf) } if (cmd_start != pe) { - ssize_t ilen = stbsp_snprintf(cl.ibuf, sizeof cl.ibuf, "%s", cmd_start); - if (ilen < 0 || (size_t)ilen > sizeof buf) { - log_line("%s: (%s) snprintf2 failed", client_config.interface, __func__); + if (!nstrcpy(cl.ibuf, sizeof cl.ibuf, cmd_start)) { + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); return -99; } } diff --git a/ifchd.c b/ifchd.c index 3f1cd11..b14e8ae 100644 --- a/ifchd.c +++ b/ifchd.c @@ -14,7 +14,7 @@ #include #include #include -#include "nk/stb_sprintf.h" +#include "nk/nstrcpy.h" #include "nk/log.h" #include "nk/privs.h" #include "nk/io.h" @@ -103,9 +103,8 @@ static int write_resolve_conf(void) q = strchr(p, '\0'); else *q++ = '\0'; - ssize_t sl = stbsp_snprintf(buf, sizeof buf, "%s", p); - if (sl < 0 || (size_t)sl > sizeof buf) { - log_line("%s: (%s) snprintf failed appending nameservers", + if (!nstrcpy(buf, sizeof buf, p)) { + log_line("%s: (%s) nstrcpy failed appending nameservers", client_config.interface, __func__); } @@ -124,9 +123,8 @@ static int write_resolve_conf(void) q = strchr(p, '\0'); else *q++ = '\0'; - ssize_t sl = stbsp_snprintf(buf, sizeof buf, "%s", p); - if (sl < 0 || (size_t)sl > sizeof buf) { - log_line("%s: (%s) snprintf failed appending domains", + if (!nstrcpy(buf, sizeof buf, p)) { + log_line("%s: (%s) nstrcpy failed appending domains", client_config.interface, __func__); } @@ -190,10 +188,8 @@ int perform_dns(const char *str, size_t len) log_line("DNS server list is too long: %zu > %zu", len, sizeof cl.namesvrs); return ret; } - ssize_t sl = stbsp_snprintf(cl.namesvrs, sizeof cl.namesvrs, "%s", str); - if (sl < 0 || (size_t)sl > sizeof cl.namesvrs) { - log_line("%s: (%s) snprintf failed", client_config.interface, __func__); - } + if (!nstrcpy(cl.namesvrs, sizeof cl.namesvrs, str)) + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); ret = write_resolve_conf(); if (ret >= 0) log_line("Added DNS server: '%s'", str); @@ -231,10 +227,8 @@ int perform_domain(const char *str, size_t len) log_line("DNS domain list is too long: %zu > %zu", len, sizeof cl.namesvrs); return ret; } - ssize_t sl = stbsp_snprintf(cl.domains, sizeof cl.domains, "%s", str); - if (sl < 0 || (size_t)sl > sizeof cl.domains) { - log_line("%s: (%s) snprintf failed", client_config.interface, __func__); - } + if (!nstrcpy(cl.domains, sizeof cl.domains, str)) + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); ret = write_resolve_conf(); if (ret == 0) log_line("Added DNS domain: '%s'", str); @@ -345,13 +339,13 @@ static void setup_resolv_conf(void) } char buf[PATH_MAX]; - ssize_t sl = stbsp_snprintf(buf, sizeof buf, "%s.head", resolv_conf_d); + ssize_t sl = snprintf(buf, sizeof buf, "%s.head", resolv_conf_d); if (sl < 0 || (size_t)sl > sizeof buf) log_line("snprintf failed appending resolv_conf_head; path too long?"); else resolv_conf_head_fd = open(buf, O_RDONLY|O_CLOEXEC, 0); - sl = stbsp_snprintf(buf, sizeof buf, "%s.tail", resolv_conf_d); + sl = snprintf(buf, sizeof buf, "%s.tail", resolv_conf_d); if (sl < 0 || (size_t)sl > sizeof buf) log_line("snprintf failed appending resolv_conf_tail; path too long?"); else diff --git a/leasefile.c b/leasefile.c index 991f819..20c78d2 100644 --- a/leasefile.c +++ b/leasefile.c @@ -1,4 +1,4 @@ -// Copyright 2011-2018 Nicholas J. Kain +// Copyright 2011-2022 Nicholas J. Kain // SPDX-License-Identifier: MIT #include #include @@ -11,7 +11,7 @@ #include #include #include -#include "nk/stb_sprintf.h" +#include "nk/nstrcpy.h" #include "nk/log.h" #include "nk/io.h" #include "leasefile.h" @@ -22,11 +22,12 @@ static int leasefilefd = -1; static void get_leasefile_path(char *leasefile, size_t dlen, char *ifname) { - int splen = stbsp_snprintf(leasefile, dlen, "%s/LEASE-%s", - state_dir, ifname); - if (splen < 0 || (size_t)splen > dlen) - suicide("%s: (%s) snprintf failed; return=%d", - client_config.interface, __func__, splen); + if (!nstrcpy(leasefile, dlen, state_dir)) + suicide("%s: (%s) nstrcpy failed", client_config.interface, __func__); + if (!nstrcat(leasefile, dlen, "/LEASE-")) + suicide("%s: (%s) nstrcat1 failed", client_config.interface, __func__); + if (!nstrcat(leasefile, dlen, ifname)) + suicide("%s: (%s) nstrcat2 failed", client_config.interface, __func__); } void open_leasefile(void) @@ -49,10 +50,12 @@ static void do_write_leasefile(struct in_addr ipnum) return; } inet_ntop(AF_INET, &ipnum, ip, sizeof ip); - ssize_t olen = stbsp_snprintf(out, sizeof out, "%s\n", ip); - if (olen < 0 || (size_t)olen > sizeof ip) { - log_line("%s: (%s) snprintf failed; return=%zd", - client_config.interface, __func__, olen); + if (!nstrcpy(out, sizeof out, ip)) { + log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__); + return; + } + if (!nstrcat(out, sizeof out, "\n")) { + log_line("%s: (%s) nstrcat failed", client_config.interface, __func__); return; } if (safe_ftruncate(leasefilefd, 0)) { diff --git a/nk/stb_sprintf.c b/nk/stb_sprintf.c deleted file mode 100644 index d234a55..0000000 --- a/nk/stb_sprintf.c +++ /dev/null @@ -1,3 +0,0 @@ -#define STB_SPRINTF_IMPLEMENTATION -#define STB_SPRINTF_NOFLOAT -#include "stb_sprintf.h" diff --git a/nk/stb_sprintf.h b/nk/stb_sprintf.h deleted file mode 100644 index fd09e3f..0000000 --- a/nk/stb_sprintf.h +++ /dev/null @@ -1,1915 +0,0 @@ -// stb_sprintf - v1.10 - public domain snprintf() implementation -// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 -// http://github.com/nothings/stb -// -// allowed types: sc uidBboXx p AaGgEef n -// lengths : hh h ll j z t I64 I32 I -// -// Contributors: -// Fabian "ryg" Giesen (reformatting) -// github:aganm (attribute format) -// -// Contributors (bugfixes): -// github:d26435 -// github:trex78 -// github:account-login -// Jari Komppa (SI suffixes) -// Rohit Nirmal -// Marcin Wojdyr -// Leonard Ritter -// Stefano Zanotti -// Adam Allison -// Arvid Gerstmann -// Markus Kolb -// -// LICENSE: -// -// See end of file for license information. - -#ifndef STB_SPRINTF_H_INCLUDE -#define STB_SPRINTF_H_INCLUDE - -/* -Single file sprintf replacement. - -Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. -Hereby placed in public domain. - -This is a full sprintf replacement that supports everything that -the C runtime sprintfs support, including float/double, 64-bit integers, -hex floats, field parameters (%*.*d stuff), length reads backs, etc. - -Why would you need this if sprintf already exists? Well, first off, -it's *much* faster (see below). It's also much smaller than the CRT -versions code-space-wise. We've also added some simple improvements -that are super handy (commas in thousands, callbacks at buffer full, -for example). Finally, the format strings for MSVC and GCC differ -for 64-bit integers (among other small things), so this lets you use -the same format strings in cross platform code. - -It uses the standard single file trick of being both the header file -and the source itself. If you just include it normally, you just get -the header file function definitions. To get the code, you include -it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. - -It only uses va_args macros from the C runtime to do it's work. It -does cast doubles to S64s and shifts and divides U64s, which does -drag in CRT code on most platforms. - -It compiles to roughly 8K with float support, and 4K without. -As a comparison, when using MSVC static libs, calling sprintf drags -in 16K. - -API: -==== -int stbsp_sprintf( char * buf, char const * fmt, ... ) -int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) - Convert an arg list into a buffer. stbsp_snprintf always returns - a zero-terminated string (unlike regular snprintf). - -int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) -int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) - Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns - a zero-terminated string (unlike regular snprintf). - -int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) - typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); - Convert into a buffer, calling back every STB_SPRINTF_MIN chars. - Your callback can then copy the chars out, print them or whatever. - This function is actually the workhorse for everything else. - The buffer you pass in must hold at least STB_SPRINTF_MIN characters. - // you return the next buffer to use or 0 to stop converting - -void stbsp_set_separators( char comma, char period ) - Set the comma and period characters to use. - -FLOATS/DOUBLES: -=============== -This code uses a internal float->ascii conversion method that uses -doubles with error correction (double-doubles, for ~105 bits of -precision). This conversion is round-trip perfect - that is, an atof -of the values output here will give you the bit-exact double back. - -One difference is that our insignificant digits will be different than -with MSVC or GCC (but they don't match each other either). We also -don't attempt to find the minimum length matching float (pre-MSVC15 -doesn't either). - -If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT -and you'll save 4K of code space. - -64-BIT INTS: -============ -This library also supports 64-bit integers and you can use MSVC style or -GCC style indicators (%I64d or %lld). It supports the C99 specifiers -for size_t and ptr_diff_t (%jd %zd) as well. - -EXTRAS: -======= -Like some GCCs, for integers and floats, you can use a ' (single quote) -specifier and commas will be inserted on the thousands: "%'d" on 12345 -would print 12,345. - -For integers and floats, you can use a "$" specifier and the number -will be converted to float and then divided to get kilo, mega, giga or -tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is -"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn -2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three -$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the -suffix, add "_" specifier: "%_$d" -> "2.53M". - -In addition to octal and hexadecimal conversions, you can print -integers in binary: "%b" for 256 would print 100. - -PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): -=================================================================== -"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) -"%24d" across all 32-bit ints (4.5x/4.2x faster) -"%x" across all 32-bit ints (4.5x/3.8x faster) -"%08x" across all 32-bit ints (4.3x/3.8x faster) -"%f" across e-10 to e+10 floats (7.3x/6.0x faster) -"%e" across e-10 to e+10 floats (8.1x/6.0x faster) -"%g" across e-10 to e+10 floats (10.0x/7.1x faster) -"%f" for values near e-300 (7.9x/6.5x faster) -"%f" for values near e+300 (10.0x/9.1x faster) -"%e" for values near e-300 (10.1x/7.0x faster) -"%e" for values near e+300 (9.2x/6.0x faster) -"%.320f" for values near e-300 (12.6x/11.2x faster) -"%a" for random values (8.6x/4.3x faster) -"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) -"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) -"%s%s%s" for 64 char strings (7.1x/7.3x faster) -"...512 char string..." ( 35.0x/32.5x faster!) -*/ - -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wcast-qual" -#pragma GCC diagnostic ignored "-Wsign-conversion" -#endif - -#if defined(__clang__) - #if defined(__has_feature) && defined(__has_attribute) - #if __has_feature(address_sanitizer) - #if __has_attribute(__no_sanitize__) - #define STBSP__ASAN __attribute__((__no_sanitize__("address"))) - #elif __has_attribute(__no_sanitize_address__) - #define STBSP__ASAN __attribute__((__no_sanitize_address__)) - #elif __has_attribute(__no_address_safety_analysis__) - #define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) - #endif - #endif - #endif -#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ - #define STBSP__ASAN __attribute__((__no_sanitize_address__)) - #endif -#endif - -#ifndef STBSP__ASAN -#define STBSP__ASAN -#endif - -#ifdef STB_SPRINTF_STATIC -#define STBSP__PUBLICDEC static -#define STBSP__PUBLICDEF static STBSP__ASAN -#else -#ifdef __cplusplus -#define STBSP__PUBLICDEC extern "C" -#define STBSP__PUBLICDEF extern "C" STBSP__ASAN -#else -#define STBSP__PUBLICDEC extern -#define STBSP__PUBLICDEF STBSP__ASAN -#endif -#endif - -#if defined(__has_attribute) - #if __has_attribute(format) - #define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) - #endif -#endif - -#ifndef STBSP__ATTRIBUTE_FORMAT -#define STBSP__ATTRIBUTE_FORMAT(fmt,va) -#endif - -#ifdef _MSC_VER -#define STBSP__NOTUSED(v) (void)(v) -#else -#define STBSP__NOTUSED(v) (void)sizeof(v) -#endif - -#include // for va_arg(), va_list() -#include // size_t, ptrdiff_t - -#ifndef STB_SPRINTF_MIN -#define STB_SPRINTF_MIN 512 // how many characters per callback -#endif -typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); - -#ifndef STB_SPRINTF_DECORATE -#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names -#endif - -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); - -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); -STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); - -#endif // STB_SPRINTF_H_INCLUDE - -#ifdef STB_SPRINTF_IMPLEMENTATION - -#define stbsp__uint32 unsigned int -#define stbsp__int32 signed int - -#ifdef _MSC_VER -#define stbsp__uint64 unsigned __int64 -#define stbsp__int64 signed __int64 -#else -#define stbsp__uint64 unsigned long long -#define stbsp__int64 signed long long -#endif -#define stbsp__uint16 unsigned short - -#ifndef stbsp__uintptr -#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) -#define stbsp__uintptr stbsp__uint64 -#else -#define stbsp__uintptr stbsp__uint32 -#endif -#endif - -#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define STB_SPRINTF_MSVC_MODE -#endif -#endif - -#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses -#define STBSP__UNALIGNED(code) -#else -#define STBSP__UNALIGNED(code) code -#endif - -#ifndef STB_SPRINTF_NOFLOAT -// internal float utility functions -static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); -static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); -#define STBSP__SPECIAL 0x7000 -#endif - -static char stbsp__period = '.'; -static char stbsp__comma = ','; -static struct -{ - short temp; // force next field to be 2-byte aligned - char pair[201]; -} stbsp__digitpair = -{ - 0, - "00010203040506070809101112131415161718192021222324" - "25262728293031323334353637383940414243444546474849" - "50515253545556575859606162636465666768697071727374" - "75767778798081828384858687888990919293949596979899" -}; - -STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) -{ - stbsp__period = pperiod; - stbsp__comma = pcomma; -} - -#define STBSP__LEFTJUST 1 -#define STBSP__LEADINGPLUS 2 -#define STBSP__LEADINGSPACE 4 -#define STBSP__LEADING_0X 8 -#define STBSP__LEADINGZERO 16 -#define STBSP__INTMAX 32 -#define STBSP__TRIPLET_COMMA 64 -#define STBSP__NEGATIVE 128 -#define STBSP__METRIC_SUFFIX 256 -#define STBSP__HALFWIDTH 512 -#define STBSP__METRIC_NOSPACE 1024 -#define STBSP__METRIC_1024 2048 -#define STBSP__METRIC_JEDEC 4096 - -static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) -{ - sign[0] = 0; - if (fl & STBSP__NEGATIVE) { - sign[0] = 1; - sign[1] = '-'; - } else if (fl & STBSP__LEADINGSPACE) { - sign[0] = 1; - sign[1] = ' '; - } else if (fl & STBSP__LEADINGPLUS) { - sign[0] = 1; - sign[1] = '+'; - } -} - -static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) -{ - char const * sn = s; - - // get up to 4-byte alignment - for (;;) { - if (((stbsp__uintptr)sn & 3) == 0) - break; - - if (!limit || *sn == 0) - return (stbsp__uint32)(sn - s); - - ++sn; - --limit; - } - - // scan over 4 bytes at a time to find terminating 0 - // this will intentionally scan up to 3 bytes past the end of buffers, - // but becase it works 4B aligned, it will never cross page boundaries - // (hence the STBSP__ASAN markup; the over-read here is intentional - // and harmless) - while (limit >= 4) { - stbsp__uint32 v = *(stbsp__uint32 *)sn; - // bit hack to find if there's a 0 byte in there - if ((v - 0x01010101) & (~v) & 0x80808080UL) - break; - - sn += 4; - limit -= 4; - } - - // handle the last few characters to find actual size - while (limit && *sn) { - ++sn; - --limit; - } - - return (stbsp__uint32)(sn - s); -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) -{ - static char hex[] = "0123456789abcdefxp"; - static char hexu[] = "0123456789ABCDEFXP"; - char *bf; - char const *f; - int tlen = 0; - - bf = buf; - f = fmt; - for (;;) { - stbsp__int32 fw, pr, tz; - stbsp__uint32 fl; - - // macros for the callback buffer stuff - #define stbsp__chk_cb_bufL(bytes) \ - { \ - int len = (int)(bf - buf); \ - if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ - tlen += len; \ - if (0 == (bf = buf = callback(buf, user, len))) \ - goto done; \ - } \ - } - #define stbsp__chk_cb_buf(bytes) \ - { \ - if (callback) { \ - stbsp__chk_cb_bufL(bytes); \ - } \ - } - #define stbsp__flush_cb() \ - { \ - stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ - } // flush if there is even one byte in the buffer - #define stbsp__cb_buf_clamp(cl, v) \ - cl = v; \ - if (callback) { \ - int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ - if (cl > lg) \ - cl = lg; \ - } - - // fast copy everything up to the next % (or end of string) - for (;;) { - while (((stbsp__uintptr)f) & 3) { - schk1: - if (f[0] == '%') - goto scandd; - schk2: - if (f[0] == 0) - goto endfmt; - stbsp__chk_cb_buf(1); - *bf++ = f[0]; - ++f; - } - for (;;) { - // Check if the next 4 bytes contain %(0x25) or end of string. - // Using the 'hasless' trick: - // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord - stbsp__uint32 v, c; - v = *(stbsp__uint32 *)f; - c = (~v) & 0x80808080; - if (((v ^ 0x25252525) - 0x01010101) & c) - goto schk1; - if ((v - 0x01010101) & c) - goto schk2; - if (callback) - if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) - goto schk1; - #ifdef STB_SPRINTF_NOUNALIGNED - if(((stbsp__uintptr)bf) & 3) { - bf[0] = f[0]; - bf[1] = f[1]; - bf[2] = f[2]; - bf[3] = f[3]; - } else - #endif - { - *(stbsp__uint32 *)bf = v; - } - bf += 4; - f += 4; - } - } - scandd: - - ++f; - - // ok, we have a percent, read the modifiers first - fw = 0; - pr = -1; - fl = 0; - tz = 0; - - // flags - for (;;) { - switch (f[0]) { - // if we have left justify - case '-': - fl |= STBSP__LEFTJUST; - ++f; - continue; - // if we have leading plus - case '+': - fl |= STBSP__LEADINGPLUS; - ++f; - continue; - // if we have leading space - case ' ': - fl |= STBSP__LEADINGSPACE; - ++f; - continue; - // if we have leading 0x - case '#': - fl |= STBSP__LEADING_0X; - ++f; - continue; - // if we have thousand commas - case '\'': - fl |= STBSP__TRIPLET_COMMA; - ++f; - continue; - // if we have kilo marker (none->kilo->kibi->jedec) - case '$': - if (fl & STBSP__METRIC_SUFFIX) { - if (fl & STBSP__METRIC_1024) { - fl |= STBSP__METRIC_JEDEC; - } else { - fl |= STBSP__METRIC_1024; - } - } else { - fl |= STBSP__METRIC_SUFFIX; - } - ++f; - continue; - // if we don't want space between metric suffix and number - case '_': - fl |= STBSP__METRIC_NOSPACE; - ++f; - continue; - // if we have leading zero - case '0': - fl |= STBSP__LEADINGZERO; - ++f; - goto flags_done; - default: goto flags_done; - } - } - flags_done: - - // get the field width - if (f[0] == '*') { - fw = va_arg(va, stbsp__uint32); - ++f; - } else { - while ((f[0] >= '0') && (f[0] <= '9')) { - fw = fw * 10 + f[0] - '0'; - f++; - } - } - // get the precision - if (f[0] == '.') { - ++f; - if (f[0] == '*') { - pr = va_arg(va, stbsp__uint32); - ++f; - } else { - pr = 0; - while ((f[0] >= '0') && (f[0] <= '9')) { - pr = pr * 10 + f[0] - '0'; - f++; - } - } - } - - // handle integer size overrides - switch (f[0]) { - // are we halfwidth? - case 'h': - fl |= STBSP__HALFWIDTH; - ++f; - if (f[0] == 'h') - ++f; // QUARTERWIDTH - break; - // are we 64-bit (unix style) - case 'l': - fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); - ++f; - if (f[0] == 'l') { - fl |= STBSP__INTMAX; - ++f; - } - break; - // are we 64-bit on intmax? (c99) - case 'j': - fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - // are we 64-bit on size_t or ptrdiff_t? (c99) - case 'z': - fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - case 't': - fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - // are we 64-bit (msft style) - case 'I': - if ((f[1] == '6') && (f[2] == '4')) { - fl |= STBSP__INTMAX; - f += 3; - } else if ((f[1] == '3') && (f[2] == '2')) { - f += 3; - } else { - fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); - ++f; - } - break; - default: break; - } - - // handle each replacement - switch (f[0]) { - #define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 - char num[STBSP__NUMSZ]; - char lead[8]; - char tail[8]; - char *s; - char const *h; - stbsp__uint32 l, n, cs; - stbsp__uint64 n64; -#ifndef STB_SPRINTF_NOFLOAT - double fv; -#endif - stbsp__int32 dp; - char const *sn; - - case 's': - // get the string - s = va_arg(va, char *); - if (s == 0) - s = (char *)"null"; - // get the length, limited to desired precision - // always limit to ~0u chars since our counts are 32b - l = stbsp__strlen_limited(s, (pr >= 0) ? (unsigned)pr : ~0u); - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - // copy the string in - goto scopy; - - case 'c': // char - // get the character - s = num + STBSP__NUMSZ - 1; - *s = (char)va_arg(va, int); - l = 1; - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - goto scopy; - - case 'n': // weird write-bytes specifier - { - int *d = va_arg(va, int *); - *d = tlen + (int)(bf - buf); - } break; - -#ifdef STB_SPRINTF_NOFLOAT - case 'A': // float - case 'a': // hex float - case 'G': // float - case 'g': // float - case 'E': // float - case 'e': // float - case 'f': // float - va_arg(va, double); // eat it - s = (char *)"No float"; - l = 8; - lead[0] = 0; - tail[0] = 0; - pr = 0; - cs = 0; - STBSP__NOTUSED(dp); - goto scopy; -#else - case 'A': // hex float - case 'a': // hex float - h = (f[0] == 'A') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) - fl |= STBSP__NEGATIVE; - - s = num + 64; - - stbsp__lead_sign(fl, lead); - - if (dp == -1023) - dp = (n64) ? -1022 : 0; - else - n64 |= (((stbsp__uint64)1) << 52); - n64 <<= (64 - 56); - if (pr < 15) - n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); -// add leading chars - -#ifdef STB_SPRINTF_MSVC_MODE - *s++ = '0'; - *s++ = 'x'; -#else - lead[1 + lead[0]] = '0'; - lead[2 + lead[0]] = 'x'; - lead[0] += 2; -#endif - *s++ = h[(n64 >> 60) & 15]; - n64 <<= 4; - if (pr) - *s++ = stbsp__period; - sn = s; - - // print the bits - n = pr; - if (n > 13) - n = 13; - if (pr > (stbsp__int32)n) - tz = pr - n; - pr = 0; - while (n--) { - *s++ = h[(n64 >> 60) & 15]; - n64 <<= 4; - } - - // print the expo - tail[1] = h[17]; - if (dp < 0) { - tail[2] = '-'; - dp = -dp; - } else - tail[2] = '+'; - n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); - tail[0] = (char)n; - for (;;) { - tail[n] = '0' + dp % 10; - if (n <= 3) - break; - --n; - dp /= 10; - } - - dp = (int)(s - sn); - l = (int)(s - (num + 64)); - s = num + 64; - cs = 1 + (3 << 24); - goto scopy; - - case 'G': // float - case 'g': // float - h = (f[0] == 'G') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; - else if (pr == 0) - pr = 1; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) - fl |= STBSP__NEGATIVE; - - // clamp the precision and delete extra zeros after clamp - n = pr; - if (l > (stbsp__uint32)pr) - l = pr; - while ((l > 1) && (pr) && (sn[l - 1] == '0')) { - --pr; - --l; - } - - // should we use %e - if ((dp <= -4) || (dp > (stbsp__int32)n)) { - if (pr > (stbsp__int32)l) - pr = l - 1; - else if (pr) - --pr; // when using %e, there is one digit before the decimal - goto doexpfromg; - } - // this is the insane action to get the pr to match %g semantics for %f - if (dp > 0) { - pr = (dp < (stbsp__int32)l) ? l - dp : 0; - } else { - pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); - } - goto dofloatfromg; - - case 'E': // float - case 'e': // float - h = (f[0] == 'E') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) - fl |= STBSP__NEGATIVE; - doexpfromg: - tail[0] = 0; - stbsp__lead_sign(fl, lead); - if (dp == STBSP__SPECIAL) { - s = (char *)sn; - cs = 0; - pr = 0; - goto scopy; - } - s = num + 64; - // handle leading chars - *s++ = sn[0]; - - if (pr) - *s++ = stbsp__period; - - // handle after decimal - if ((l - 1) > (stbsp__uint32)pr) - l = pr + 1; - for (n = 1; n < l; n++) - *s++ = sn[n]; - // trailing zeros - tz = pr - (l - 1); - pr = 0; - // dump expo - tail[1] = h[0xe]; - dp -= 1; - if (dp < 0) { - tail[2] = '-'; - dp = -dp; - } else - tail[2] = '+'; -#ifdef STB_SPRINTF_MSVC_MODE - n = 5; -#else - n = (dp >= 100) ? 5 : 4; -#endif - tail[0] = (char)n; - for (;;) { - tail[n] = '0' + dp % 10; - if (n <= 3) - break; - --n; - dp /= 10; - } - cs = 1 + (3 << 24); // how many tens - goto flt_lead; - - case 'f': // float - fv = va_arg(va, double); - doafloat: - // do kilos - if (fl & STBSP__METRIC_SUFFIX) { - double divisor; - divisor = 1000.0f; - if (fl & STBSP__METRIC_1024) - divisor = 1024.0; - while (fl < 0x4000000) { - if ((fv < divisor) && (fv > -divisor)) - break; - fv /= divisor; - fl += 0x1000000; - } - } - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) - fl |= STBSP__NEGATIVE; - dofloatfromg: - tail[0] = 0; - stbsp__lead_sign(fl, lead); - if (dp == STBSP__SPECIAL) { - s = (char *)sn; - cs = 0; - pr = 0; - goto scopy; - } - s = num + 64; - - // handle the three decimal varieties - if (dp <= 0) { - stbsp__int32 i; - // handle 0.000*000xxxx - *s++ = '0'; - if (pr) - *s++ = stbsp__period; - n = -dp; - if ((stbsp__int32)n > pr) - n = pr; - i = n; - while (i) { - if ((((stbsp__uintptr)s) & 3) == 0) - break; - *s++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)s = 0x30303030; - s += 4; - i -= 4; - } - while (i) { - *s++ = '0'; - --i; - } - if ((stbsp__int32)(l + n) > pr) - l = pr - n; - i = l; - while (i) { - *s++ = *sn++; - --i; - } - tz = pr - (n + l); - cs = 1 + (3 << 24); // how many tens did we write (for commas below) - } else { - cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; - if ((stbsp__uint32)dp >= l) { - // handle xxxx000*000.0 - n = 0; - for (;;) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = sn[n]; - ++n; - if (n >= l) - break; - } - } - if (n < (stbsp__uint32)dp) { - n = dp - n; - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - while (n) { - if ((((stbsp__uintptr)s) & 3) == 0) - break; - *s++ = '0'; - --n; - } - while (n >= 4) { - *(stbsp__uint32 *)s = 0x30303030; - s += 4; - n -= 4; - } - } - while (n) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = '0'; - --n; - } - } - } - cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens - if (pr) { - *s++ = stbsp__period; - tz = pr; - } - } else { - // handle xxxxx.xxxx000*000 - n = 0; - for (;;) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = sn[n]; - ++n; - if (n >= (stbsp__uint32)dp) - break; - } - } - cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens - if (pr) - *s++ = stbsp__period; - if ((l - dp) > (stbsp__uint32)pr) - l = pr + dp; - while (n < l) { - *s++ = sn[n]; - ++n; - } - tz = pr - (l - dp); - } - } - pr = 0; - - // handle k,m,g,t - if (fl & STBSP__METRIC_SUFFIX) { - char idx; - idx = 1; - if (fl & STBSP__METRIC_NOSPACE) - idx = 0; - tail[0] = idx; - tail[1] = ' '; - { - if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. - if (fl & STBSP__METRIC_1024) - tail[idx + 1] = "_KMGT"[fl >> 24]; - else - tail[idx + 1] = "_kMGT"[fl >> 24]; - idx++; - // If printing kibits and not in jedec, add the 'i'. - if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { - tail[idx + 1] = 'i'; - idx++; - } - tail[0] = idx; - } - } - }; - - flt_lead: - // get the length that we copied - l = (stbsp__uint32)(s - (num + 64)); - s = num + 64; - goto scopy; -#endif - - case 'B': // upper binary - case 'b': // lower binary - h = (f[0] == 'B') ? hexu : hex; - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 2; - lead[1] = '0'; - lead[2] = h[0xb]; - } - l = (8 << 4) | (1 << 8); - goto radixnum; - - case 'o': // octal - h = hexu; - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 1; - lead[1] = '0'; - } - l = (3 << 4) | (3 << 8); - goto radixnum; - - case 'p': // pointer - fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; - pr = sizeof(void *) * 2; - fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros - // fall through - to X - - case 'X': // upper hex - case 'x': // lower hex - h = (f[0] == 'X') ? hexu : hex; - l = (4 << 4) | (4 << 8); - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 2; - lead[1] = '0'; - lead[2] = h[16]; - } - radixnum: - // get the number - if (fl & STBSP__INTMAX) - n64 = va_arg(va, stbsp__uint64); - else - n64 = va_arg(va, stbsp__uint32); - - s = num + STBSP__NUMSZ; - dp = 0; - // clear tail, and clear leading if value is zero - tail[0] = 0; - if (n64 == 0) { - lead[0] = 0; - if (pr == 0) { - l = 0; - cs = 0; - goto scopy; - } - } - // convert to string - for (;;) { - *--s = h[n64 & ((1 << (l >> 8)) - 1)]; - n64 >>= (l >> 8); - if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) - break; - if (fl & STBSP__TRIPLET_COMMA) { - ++l; - if ((l & 15) == ((l >> 4) & 15)) { - l &= ~15; - *--s = stbsp__comma; - } - } - }; - // get the tens and the comma pos - cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); - // get the length that we copied - l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); - // copy it - goto scopy; - - case 'u': // unsigned - case 'i': - case 'd': // integer - // get the integer and abs it - if (fl & STBSP__INTMAX) { - stbsp__int64 i64 = va_arg(va, stbsp__int64); - n64 = (stbsp__uint64)i64; - if ((f[0] != 'u') && (i64 < 0)) { - n64 = (stbsp__uint64)-i64; - fl |= STBSP__NEGATIVE; - } - } else { - stbsp__int32 i = va_arg(va, stbsp__int32); - n64 = (stbsp__uint32)i; - if ((f[0] != 'u') && (i < 0)) { - n64 = (stbsp__uint32)-i; - fl |= STBSP__NEGATIVE; - } - } - -#ifndef STB_SPRINTF_NOFLOAT - if (fl & STBSP__METRIC_SUFFIX) { - if (n64 < 1024) - pr = 0; - else if (pr == -1) - pr = 1; - fv = (double)(stbsp__int64)n64; - goto doafloat; - } -#endif - - // convert to string - s = num + STBSP__NUMSZ; - l = 0; - - for (;;) { - // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) - char *o = s - 8; - if (n64 >= 100000000) { - n = (stbsp__uint32)(n64 % 100000000); - n64 /= 100000000; - } else { - n = (stbsp__uint32)n64; - n64 = 0; - } - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - do { - s -= 2; - *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; - n /= 100; - } while (n); - } - while (n) { - if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { - l = 0; - *--s = stbsp__comma; - --o; - } else { - *--s = (char)(n % 10) + '0'; - n /= 10; - } - } - if (n64 == 0) { - if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) - ++s; - break; - } - while (s != o) - if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { - l = 0; - *--s = stbsp__comma; - --o; - } else { - *--s = '0'; - } - } - - tail[0] = 0; - stbsp__lead_sign(fl, lead); - - // get the length that we copied - l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); - if (l == 0) { - *--s = '0'; - l = 1; - } - cs = l + (3 << 24); - if (pr < 0) - pr = 0; - - scopy: - // get fw=leading/trailing space, pr=leading zeros - if (pr < (stbsp__int32)l) - pr = l; - n = pr + lead[0] + tail[0] + tz; - if (fw < (stbsp__int32)n) - fw = n; - fw -= n; - pr -= l; - - // handle right justify and leading zeros - if ((fl & STBSP__LEFTJUST) == 0) { - if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr - { - pr = (fw > pr) ? fw : pr; - fw = 0; - } else { - fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas - } - } - - // copy the spaces and/or zeros - if (fw + pr) { - stbsp__int32 i; - stbsp__uint32 c; - - // copy leading spaces (or when doing %8.4d stuff) - if ((fl & STBSP__LEFTJUST) == 0) - while (fw > 0) { - stbsp__cb_buf_clamp(i, fw); - fw -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = ' '; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x20202020; - bf += 4; - i -= 4; - } - while (i) { - *bf++ = ' '; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy leader - sn = lead + 1; - while (lead[0]) { - stbsp__cb_buf_clamp(i, lead[0]); - lead[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy leading zeros - c = cs >> 24; - cs &= 0xffffff; - cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; - while (pr > 0) { - stbsp__cb_buf_clamp(i, pr); - pr -= i; - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x30303030; - bf += 4; - i -= 4; - } - } - while (i) { - if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { - cs = 0; - *bf++ = stbsp__comma; - } else - *bf++ = '0'; - --i; - } - stbsp__chk_cb_buf(1); - } - } - - // copy leader if there is still one - sn = lead + 1; - while (lead[0]) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, lead[0]); - lead[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy the string - n = l; - while (n) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, n); - n -= i; - STBSP__UNALIGNED(while (i >= 4) { - *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; - bf += 4; - s += 4; - i -= 4; - }) - while (i) { - *bf++ = *s++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy trailing zeros - while (tz) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, tz); - tz -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x30303030; - bf += 4; - i -= 4; - } - while (i) { - *bf++ = '0'; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy tail if there is one - sn = tail + 1; - while (tail[0]) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, tail[0]); - tail[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // handle the left justify - if (fl & STBSP__LEFTJUST) - if (fw > 0) { - while (fw) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, fw); - fw -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = ' '; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x20202020; - bf += 4; - i -= 4; - } - while (i--) - *bf++ = ' '; - stbsp__chk_cb_buf(1); - } - } - break; - - default: // unknown, just copy code - s = num + STBSP__NUMSZ - 1; - *s = f[0]; - l = 1; - fw = fl = 0; - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - goto scopy; - } - ++f; - } -endfmt: - - if (!callback) - *bf = 0; - else - stbsp__flush_cb(); - -done: - return tlen + (int)(bf - buf); -} - -// cleanup -#undef STBSP__LEFTJUST -#undef STBSP__LEADINGPLUS -#undef STBSP__LEADINGSPACE -#undef STBSP__LEADING_0X -#undef STBSP__LEADINGZERO -#undef STBSP__INTMAX -#undef STBSP__TRIPLET_COMMA -#undef STBSP__NEGATIVE -#undef STBSP__METRIC_SUFFIX -#undef STBSP__NUMSZ -#undef stbsp__chk_cb_bufL -#undef stbsp__chk_cb_buf -#undef stbsp__flush_cb -#undef stbsp__cb_buf_clamp - -// ============================================================================ -// wrapper functions - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) -{ - int result; - va_list va; - va_start(va, fmt); - result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); - va_end(va); - return result; -} - -typedef struct stbsp__context { - char *buf; - int count; - int length; - char tmp[STB_SPRINTF_MIN]; -} stbsp__context; - -static char *stbsp__clamp_callback(const char *buf, void *user, int len) -{ - stbsp__context *c = (stbsp__context *)user; - c->length += len; - - if (len > c->count) - len = c->count; - - if (len) { - if (buf != c->buf) { - const char *s, *se; - char *d; - d = c->buf; - s = buf; - se = buf + len; - do { - *d++ = *s++; - } while (s < se); - } - c->buf += len; - c->count -= len; - } - - if (c->count <= 0) - return c->tmp; - return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can -} - -static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) -{ - stbsp__context * c = (stbsp__context*)user; - (void) sizeof(buf); - - c->length += len; - return c->tmp; // go direct into buffer if you can -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) -{ - stbsp__context c; - - if ( (count == 0) && !buf ) - { - c.length = 0; - - STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); - } - else - { - int l; - - c.buf = buf; - c.count = count; - c.length = 0; - - STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); - - // zero-terminate - l = (int)( c.buf - buf ); - if ( l >= count ) // should never be greater, only equal (or less) than count - l = count - 1; - buf[l] = 0; - } - - return c.length; -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) -{ - int result; - va_list va; - va_start(va, fmt); - - result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); - va_end(va); - - return result; -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) -{ - return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); -} - -// ======================================================================= -// low level float utility functions - -#ifndef STB_SPRINTF_NOFLOAT - -// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) -#define STBSP__COPYFP(dest, src) \ - { \ - int cn; \ - for (cn = 0; cn < 8; cn++) \ - ((char *)&dest)[cn] = ((char *)&src)[cn]; \ - } - -// get float info -static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) -{ - double d; - stbsp__int64 b = 0; - - // load value and round at the frac_digits - d = value; - - STBSP__COPYFP(b, d); - - *bits = b & ((((stbsp__uint64)1) << 52) - 1); - *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); - - return (stbsp__int32)((stbsp__uint64) b >> 63); -} - -static double const stbsp__bot[23] = { - 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, - 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 -}; -static double const stbsp__negbot[22] = { - 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, - 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 -}; -static double const stbsp__negboterr[22] = { - -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, - 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, - -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, - 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 -}; -static double const stbsp__top[13] = { - 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 -}; -static double const stbsp__negtop[13] = { - 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 -}; -static double const stbsp__toperr[13] = { - 8388608, - 6.8601809640529717e+028, - -7.253143638152921e+052, - -4.3377296974619174e+075, - -1.5559416129466825e+098, - -3.2841562489204913e+121, - -3.7745893248228135e+144, - -1.7356668416969134e+167, - -3.8893577551088374e+190, - -9.9566444326005119e+213, - 6.3641293062232429e+236, - -5.2069140800249813e+259, - -5.2504760255204387e+282 -}; -static double const stbsp__negtoperr[13] = { - 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, - -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, - 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, - 8.0970921678014997e-317 -}; - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -static stbsp__uint64 const stbsp__powten[20] = { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000, - 100000000000, - 1000000000000, - 10000000000000, - 100000000000000, - 1000000000000000, - 10000000000000000, - 100000000000000000, - 1000000000000000000, - 10000000000000000000U -}; -#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) -#else -static stbsp__uint64 const stbsp__powten[20] = { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000ULL, - 100000000000ULL, - 1000000000000ULL, - 10000000000000ULL, - 100000000000000ULL, - 1000000000000000ULL, - 10000000000000000ULL, - 100000000000000000ULL, - 1000000000000000000ULL, - 10000000000000000000ULL -}; -#define stbsp__tento19th (1000000000000000000ULL) -#endif - -#define stbsp__ddmulthi(oh, ol, xh, yh) \ - { \ - double ahi = 0, alo, bhi = 0, blo; \ - stbsp__int64 bt; \ - oh = xh * yh; \ - STBSP__COPYFP(bt, xh); \ - bt &= ((~(stbsp__uint64)0) << 27); \ - STBSP__COPYFP(ahi, bt); \ - alo = xh - ahi; \ - STBSP__COPYFP(bt, yh); \ - bt &= ((~(stbsp__uint64)0) << 27); \ - STBSP__COPYFP(bhi, bt); \ - blo = yh - bhi; \ - ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ - } - -#define stbsp__ddtoS64(ob, xh, xl) \ - { \ - double ahi = 0, alo, vh, t; \ - ob = (stbsp__int64)xh; \ - vh = (double)ob; \ - ahi = (xh - vh); \ - t = (ahi - xh); \ - alo = (xh - (ahi - t)) - (vh + t); \ - ob += (stbsp__int64)(ahi + alo + xl); \ - } - -#define stbsp__ddrenorm(oh, ol) \ - { \ - double s; \ - s = oh + ol; \ - ol = ol - (s - oh); \ - oh = s; \ - } - -#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); - -#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); - -static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 -{ - double ph, pl; - if ((power >= 0) && (power <= 22)) { - stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); - } else { - stbsp__int32 e, et, eb; - double p2h, p2l; - - e = power; - if (power < 0) - e = -e; - et = (e * 0x2c9) >> 14; /* %23 */ - if (et > 13) - et = 13; - eb = e - (et * 23); - - ph = d; - pl = 0.0; - if (power < 0) { - if (eb) { - --eb; - stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); - stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); - } - if (et) { - stbsp__ddrenorm(ph, pl); - --et; - stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); - stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); - ph = p2h; - pl = p2l; - } - } else { - if (eb) { - e = eb; - if (eb > 22) - eb = 22; - e -= eb; - stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); - if (e) { - stbsp__ddrenorm(ph, pl); - stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); - stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); - ph = p2h; - pl = p2l; - } - } - if (et) { - stbsp__ddrenorm(ph, pl); - --et; - stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); - stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); - ph = p2h; - pl = p2l; - } - } - } - stbsp__ddrenorm(ph, pl); - *ohi = ph; - *olo = pl; -} - -// given a float value, returns the significant bits in bits, and the position of the -// decimal point in decimal_pos. +/-INF and NAN are specified by special values -// returned in the decimal_pos parameter. -// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 -static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) -{ - double d; - stbsp__int64 bits = 0; - stbsp__int32 expo, e, ng, tens; - - d = value; - STBSP__COPYFP(bits, d); - expo = (stbsp__int32)((bits >> 52) & 2047); - ng = (stbsp__int32)((stbsp__uint64) bits >> 63); - if (ng) - d = -d; - - if (expo == 2047) // is nan or inf? - { - *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; - *decimal_pos = STBSP__SPECIAL; - *len = 3; - return ng; - } - - if (expo == 0) // is zero or denormal - { - if (((stbsp__uint64) bits << 1) == 0) // do zero - { - *decimal_pos = 1; - *start = out; - out[0] = '0'; - *len = 1; - return ng; - } - // find the right expo for denormals - { - stbsp__int64 v = ((stbsp__uint64)1) << 51; - while ((bits & v) == 0) { - --expo; - v >>= 1; - } - } - } - - // find the decimal exponent as well as the decimal bits of the value - { - double ph, pl; - - // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 - tens = expo - 1023; - tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); - - // move the significant bits into position and stick them into an int - stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); - - // get full as much precision from double-double as possible - stbsp__ddtoS64(bits, ph, pl); - - // check if we undershot - if (((stbsp__uint64)bits) >= stbsp__tento19th) - ++tens; - } - - // now do the rounding in integer land - frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); - if ((frac_digits < 24)) { - stbsp__uint32 dg = 1; - if ((stbsp__uint64)bits >= stbsp__powten[9]) - dg = 10; - while ((stbsp__uint64)bits >= stbsp__powten[dg]) { - ++dg; - if (dg == 20) - goto noround; - } - if (frac_digits < dg) { - stbsp__uint64 r; - // add 0.5 at the right position and round - e = dg - frac_digits; - if ((stbsp__uint32)e >= 24) - goto noround; - r = stbsp__powten[e]; - bits = bits + (r / 2); - if ((stbsp__uint64)bits >= stbsp__powten[dg]) - ++tens; - bits /= r; - } - noround:; - } - - // kill long trailing runs of zeros - if (bits) { - stbsp__uint32 n; - for (;;) { - if (bits <= 0xffffffff) - break; - if (bits % 1000) - goto donez; - bits /= 1000; - } - n = (stbsp__uint32)bits; - while ((n % 1000) == 0) - n /= 1000; - bits = n; - donez:; - } - - // convert to string - out += 64; - e = 0; - for (;;) { - stbsp__uint32 n; - char *o = out - 8; - // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) - if (bits >= 100000000) { - n = (stbsp__uint32)(bits % 100000000); - bits /= 100000000; - } else { - n = (stbsp__uint32)bits; - bits = 0; - } - while (n) { - out -= 2; - *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; - n /= 100; - e += 2; - } - if (bits == 0) { - if ((e) && (out[0] == '0')) { - ++out; - --e; - } - break; - } - while (out != o) { - *--out = '0'; - ++e; - } - } - - *decimal_pos = tens; - *start = out; - *len = e; - return ng; -} - -#undef stbsp__ddmulthi -#undef stbsp__ddrenorm -#undef stbsp__ddmultlo -#undef stbsp__ddmultlos -#undef STBSP__SPECIAL -#undef STBSP__COPYFP - -#endif // STB_SPRINTF_NOFLOAT - -// clean up -#undef stbsp__uint16 -#undef stbsp__uint32 -#undef stbsp__int32 -#undef stbsp__uint64 -#undef stbsp__int64 -#undef STBSP__UNALIGNED - -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_SPRINTF_IMPLEMENTATION - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/sockd.c b/sockd.c index 5088442..2eff2ba 100644 --- a/sockd.c +++ b/sockd.c @@ -23,10 +23,10 @@ #include #include #include -#include "nk/stb_sprintf.h" #include "nk/log.h" #include "nk/io.h" #include "nk/privs.h" +#include "nk/nstrcpy.h" #include "sockd.h" #include "ndhc-defines.h" #include "ndhc.h" @@ -142,8 +142,7 @@ static int create_udp_socket(uint32_t ip, uint16_t port, char *iface) } struct ifreq ifr; memset(&ifr, 0, sizeof ifr); - ssize_t sl = stbsp_snprintf(ifr.ifr_name, sizeof ifr.ifr_name, "%s", iface); - if (sl < 0 || (size_t)sl > sizeof ifr.ifr_name) { + if (!nstrcpy(ifr.ifr_name, sizeof ifr.ifr_name, iface)) { log_line("%s: (%s) Set interface name failed.", client_config.interface, __func__); goto out_fd;