/* * Copyright (c) 2002-2005 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ /* ** Test s*printf() functions */ #include "sm/generic.h" SM_IDSTR(id, "@(#)$Id: t-printf.c,v 1.24 2007/11/18 05:38:31 ca Exp $") #include "sm/limits.h" #include "sm/string.h" #include "sm/base64.h" #include "sm/io.h" #include "sm/str.h" #include "sm/rpool.h" #include "sm/types.h" #include "sm/net.h" #include "sm/test.h" #include /* for snprintf() prototype */ static void cmp(char *s1, char *s2, int line) { if (!SM_TEST(strcmp(s1, s2) == 0)) (void) sm_io_fprintf(smioerr, "%3d: got \"%s\"\ninstead of \"%s\"\n", line, s1, s2); } #define MAXL 128 #define STRL 16 static void test(sm_rpool_P rpool) { int i; sm_str_P str; char *r; char buf[MAXL]; char buf2[MAXL]; sm_file_T file; memset(buf, (int) 'X', sizeof(buf)); memset(buf2, (int) 'X', sizeof(buf2)); str = sm_str_new(rpool, STRL, MAXL); SM_TEST(str != NULL); if (str == NULL) return; i = sm_str2file(str, &file); SM_TEST(i == SM_SUCCESS); if (i != SM_SUCCESS) return; sm_strprintf(str, "%d", 0); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%S", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_io_fprintf(&file, "%d", 0); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%S", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); #if HAVE_SNPRINTF sm_str_clr(str); sm_strprintf(str, "%d%cend", 0, '\0'); snprintf(buf2, sizeof(buf2), "%d%cend", 0, '\0'); i = sm_snprintf(buf, sizeof(buf), "%S", str); SM_TEST(i > 1); cmp(buf, buf2, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d%c", 0, '\0'); snprintf(buf2, sizeof(buf2), "%d%c", 0, '\0'); i = sm_snprintf(buf, sizeof(buf), "%S", str); SM_TEST(i > 1); cmp(buf, buf2, __LINE__); #endif /* HAVE_SNPRINTF */ sm_str_clr(str); sm_strprintf(str, "%d%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%N", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_io_fprintf(&file, "%d%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%N", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d\r\n%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d\r\n%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%#T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d\n\r%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d\r%c", 0, '\0'); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "0\r"); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "0\n"); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "%d\r\n", 0); r = "0"; i = sm_snprintf(buf, sizeof(buf), "%#T", str); SM_TEST(i == 1); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "Too busy\r\n"); r = "Too busy"; i = sm_snprintf(buf, sizeof(buf), "%T", str); SM_TEST(i == 8); cmp(buf, r, __LINE__); sm_str_clr(str); sm_strprintf(str, "Too busy\r\n\0"); r = "Too busy"; i = sm_snprintf(buf, sizeof(buf), "%#T", str); SM_TEST(i == 8); cmp(buf, r, __LINE__); sm_str_clr(str); r = "1234567890abcdefghijklmnopqrstuvwxyz"; i = sm_str_scat(str, r); SM_TEST(i == SM_SUCCESS); i = sm_snprintf(buf, sizeof(buf), "%S", str); SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "-%S", str); SM_TEST(i == (int) strlen(r) + 1); cmp(buf + 1, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "0987654321%S", str); SM_TEST(i == (int) strlen(r) + 10); cmp(buf + 10, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%.10S", str); SM_TEST(i == 10); r = "1234567890"; cmp(buf, r, __LINE__); r = NULL; i = sm_snprintf(buf, sizeof(buf), "%p %d", r, 5); SM_TEST(i == 5); r = "0x0 5"; cmp(buf, r, __LINE__); r = NULL; i = sm_snprintf(buf, sizeof(buf), "%p %d %s", r, 5, "abc"); SM_TEST(i == 9); r = "0x0 5 abc"; r = NULL; i = sm_snprintf(buf, sizeof(buf), "test %p (%s:%d)", r, "abc", 5); SM_TEST(i == 16); r = "test 0x0 (abc:5)"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%r", 5); SM_TEST(i == 1); r = "5"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%r", 421); SM_TEST(i == 3); r = "421"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%r", (uint32_t) 0x80000001); SM_TEST(i == 10); r = "0x80000001"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%r", (uint32_t) 0x8030003a); SM_TEST(i == 10); r = "0x8030003a"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%A", ntohl(0x7F000001)); r = "127.0.0.1"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%A", ntohl(0xFF139DFE)); r = "255.19.157.254"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#s", "abc"); r = "abc"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#s", "ab\tc"); r = "ab%09c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#s", "ab%c"); r = "ab%25c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#s", "ab\tc\001"); r = "ab%09c%01"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#.3s", "ab\tc\001"); r = "ab_"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "abc"); r = "abc"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "ab\tc"); r = "ab%09c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "ab%c"); r = "ab%25c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "a bc"); r = "a bc"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "ab\t c"); r = "ab%09 c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "ab%c "); r = "ab%25c "; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@s", "ab, c"); r = "ab%2C c"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "f1=%@s, f2=%@s", "ab, c", "d\t, e"); r = "f1=ab%2C c, f2=d%09%2C e"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "f1=%@s, f2=%@s, f3=%@s", "ab, c", "d\t, e", "x,y,z ,,"); r = "f1=ab%2C c, f2=d%09%2C e, f3=x%2Cy%2Cz %2C%2C"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_clr(str); i = sm_str_scat(str, "ab%c"); SM_TEST(i == SM_SUCCESS); i = sm_snprintf(buf, sizeof(buf), "%#.3S", str); r = "ab_"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#.3N", str); SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_clr(str); i = sm_str_scat(str, "ab\tc\001"); i = sm_snprintf(buf, sizeof(buf), "%#S", str); r = "ab%09c%01"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, 2, "%s", "abcdef"); r = "a"; SM_TEST(i == 6); cmp(buf, r, __LINE__); SM_ASSERT(MAXL >= 10); i = sm_snprintf(buf, 10, "%#S", str); r = "ab%09c%01"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); SM_ASSERT(MAXL >= 8); i = sm_snprintf(buf, 8, "%#S", str); r = "ab%09c_"; SM_TEST(i == 9); cmp(buf, r, __LINE__); i = sm_snprintf(buf, 8, "%#S", str); r = "ab%09c_"; SM_TEST(i == 9); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#N", str); r = "ab%09c%01"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_clr(str); i = sm_str_scat(str, "ab%c"); SM_TEST(i == SM_SUCCESS); i = sm_snprintf(buf, sizeof(buf), "%@.3S", str); r = "ab_"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@.3N", str); SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_clr(str); i = sm_str_scat(str, "a b\tc "); i = sm_snprintf(buf, sizeof(buf), "%@S", str); r = "a b%09c "; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%@N", str); r = "a b%09c "; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_clr(str); i = sm_snprintf(buf, sizeof(buf), "%Y", 0); r = "0"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 1); r = "1"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 16); buf2[0] = SM_B64DIGS[16]; buf2[1] = '\0'; cmp(buf, buf2, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 31); buf2[0] = SM_B64DIGS[31]; buf2[1] = '\0'; cmp(buf, buf2, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 32); buf2[0] = SM_B64DIGS[32]; buf2[1] = '\0'; cmp(buf, buf2, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 63); buf2[0] = SM_B64DIGS[63]; buf2[1] = '\0'; cmp(buf, buf2, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 64); r = "10"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 127); i = sm_snprintf(buf, sizeof(buf), "%Y", 128); r = "20"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 255); i = sm_snprintf(buf, sizeof(buf), "%Y", 256); r = "40"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 1023); i = sm_snprintf(buf, sizeof(buf), "%Y", 1024); r = "G0"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 4095); i = sm_snprintf(buf, sizeof(buf), "%Y", 4096); r = "100"; cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%Y", 0x7FFFFFFF); SM_TEST(i == 6); i = sm_snprintf(buf, sizeof(buf), "%Y", 0xFFFFFFFF); SM_TEST(i == 6); #if 0 i = sm_asprintf(&s, "%r", 421); SM_TEST(i == 3); r = "421"; cmp(s, r, __LINE__); sm_free(s); r = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"; i = sm_asprintf(&s, "%s", r); cmp(s, r, __LINE__); sm_free(s); #endif i = sm_snprintf(buf, sizeof(buf), "%#c", '\t'); r = "%09"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); i = sm_snprintf(buf, sizeof(buf), "%#c", 't'); r = "t"; SM_TEST(i == (int) strlen(r)); cmp(buf, r, __LINE__); sm_str_free(str); } int main(int argc, char *argv[]) { sm_rpool_P rpool; sm_test_begin(argc, argv, "test printf"); test(NULL); rpool = sm_rpool_new(NULL); SM_TEST(rpool != NULL); if (rpool != NULL) { test(rpool); sm_rpool_delete(rpool); } return sm_test_end(); }