static char *get_iname(char *fname, const char *mtpt) { char *iname; int fd, rc; struct stat buf; iname = malloc(INAME_LEN); CHECK_IT(iname, "malloc() failed"); fd = open(fname, O_CREAT, 0644); if (fd < 0 && errno != EISDIR) { fprintf(stderr, "%s:%d: open(%s) failed: %s\n", __FILE__, __LINE__, fname, strerror(errno)); exit(1); } if (fd >= 0) close(fd); rc = stat(fname, &buf); if (rc != 0) { fprintf(stderr, "%s:%d: stat(%s) failed: %s\n", __FILE__, __LINE__, fname, strerror(errno)); exit(1); } rc = snprintf(iname, INAME_LEN, "%s/__iopen__/%lu", mtpt, (unsigned long)buf.st_ino); CHECK_SNPRINTF(rc, INAME_LEN); return iname; }
void test_simple() { CHECK("%c", 'Z'); CHECK("%3c", 'Z'); CHECK("%s", "abc"); CHECK("%3s", "a"); CHECK("%3s", "abc"); CHECK("%3s", "abcde"); CHECK("%03s", "abc"); CHECK("%03s", "abcde"); CHECK("%*s", (size_t)3, "a"); CHECK("%*s", (size_t)3, "abc"); CHECK("%*s", (size_t)3, "abcde"); CHECK("%x_", 1); CHECK("%d%%", 10); CHECK("%%%d", 10); CHECK("%%d%d", 10); CHECK("%s%s", "a,b", "c"); CHECK("%s%d", "hi" /*hmm */, // test 3); CHECK("%s%d", "a\",b", 123); #define CHECK_MULTI(type, conv, min, max) \ CHECK(conv, (type)0); \ CHECK(conv, (type)12345); \ CHECK(conv, (type)-12345); \ CHECK(conv, (type)min); \ CHECK(conv, (type)max); CHECK_MULTI(short, "%hd", SHRT_MIN, SHRT_MAX); CHECK_MULTI(int, "%d", INT_MIN, INT_MAX); CHECK_MULTI(long, "%ld", LONG_MIN, LONG_MAX); CHECK_MULTI(long long, "%lld", LLONG_MIN, LLONG_MAX); CHECK_MULTI(short, "%hi", SHRT_MIN, SHRT_MAX); CHECK_MULTI(int, "%i", INT_MIN, INT_MAX); CHECK_MULTI(long, "%li", LONG_MIN, LONG_MAX); CHECK_MULTI(long long, "%lli", LLONG_MIN, LLONG_MAX); CHECK_MULTI(unsigned short, "%hu", 0, USHRT_MAX); CHECK_MULTI(unsigned , "%u", 0, UINT_MAX); CHECK_MULTI(unsigned long, "%lu", 0, ULONG_MAX); CHECK_MULTI(unsigned long long, "%llu", 0, ULLONG_MAX); CHECK_MULTI(size_t, "%zu", 0, SIZE_MAX); CHECK_MULTI(unsigned short, "%hx", 0, USHRT_MAX); CHECK_MULTI(unsigned , "%x", 0, UINT_MAX); CHECK_MULTI(unsigned long, "%lx", 0, ULONG_MAX); CHECK_MULTI(unsigned long long, "%llx", 0, ULLONG_MAX); CHECK_MULTI(size_t, "%zx", 0, SIZE_MAX); CHECK_MULTI(unsigned short, "%hX", 0, USHRT_MAX); CHECK_MULTI(unsigned , "%X", 0, UINT_MAX); CHECK_MULTI(unsigned long, "%lX", 0, ULONG_MAX); CHECK_MULTI(unsigned long long, "%llX", 0, ULLONG_MAX); CHECK_MULTI(size_t, "%zX", 0, SIZE_MAX); CHECK_MULTI(int, "%7d", INT_MIN, INT_MAX); CHECK_MULTI(int, "%07d", INT_MIN, INT_MAX); CHECK_MULTI(unsigned, "%7u", 0, UINT_MAX); CHECK_MULTI(unsigned, "%07u", 0, UINT_MAX); CHECK_MULTI(unsigned, "%7x", 0, UINT_MAX); CHECK_MULTI(unsigned, "%07x", 0, UINT_MAX); CHECK_SNPRINTF(8, "%s", "abcdef"); /* below the bounds */ CHECK_SNPRINTF(8, "1234%s", "abcdef"); /* partial write */ CHECK_SNPRINTF(8, "1234567890%s", "abcdef"); /* no write */ CHECK_SNPRINTF(3, "%d", 12345); CHECK_SNPRINTF(10, "%u.%u.%u.%u", 12, 34, 56, 78); CHECK_SNPRINTF(3, "%x", 0xffff); CHECK_SNPRINTF(3, "%hx", USHRT_MAX); CHECK_SNPRINTF(3, "%x", UINT_MAX); CHECK_SNPRINTF(3, "%lx", ULONG_MAX); CHECK_SNPRINTF(3, "%llx", ULLONG_MAX); }