/* Copyright (C) 2008 Emmanuel Varoquaux This file is part of XOS. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include static int nr = 1; struct vars { int i1, i2, i3; unsigned int u1, u2, u3; long l1; short s1; unsigned long ul1; char buf1[256], buf2[256]; void *p1, *p2, *p3; }; static void clear_vars(struct vars *vars) { vars->i1 = vars->i2 = vars->i3 = 393573246; vars->u1 = vars->u2 = vars->u3 = 393573246; vars->l1 = 735713713; vars->s1 = 1798; vars->ul1 = 167567354; strcpy(vars->buf1, "çççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççç"); strcpy(vars->buf2, "çççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççç"); vars->p1 = vars->p2 = vars->p3 = (void *)0xdeadbeef; } struct vars vars; static void test(const char *strs, const char *strformat, const char *strargs, const char *s, const char *format, ...) { va_list ap; int retval; int errno1; struct vars vars1; char *p; clear_vars(&vars); va_start(ap, format); errno = 0; retval = vsscanf(s, format, ap); errno1 = errno; va_end(ap); printf("Test %d: sscanf(%s, %s%s%s)\n", nr, strs, strformat, strargs[0] ? ", " : "", strargs); printf(" return value: %d", retval); if (retval >= 0) { printf("\n"); clear_vars(&vars1); if (vars.i1 != vars1.i1) printf(" i1=%d\n", vars.i1); if (vars.i2 != vars1.i2) printf(" i2=%d\n", vars.i2); if (vars.i3 != vars1.i3) printf(" i3=%d\n", vars.i3); if (vars.u1 != vars1.u1) printf(" u1=%u\n", vars.u1); if (vars.u2 != vars1.u2) printf(" u2=%u\n", vars.u2); if (vars.u3 != vars1.u3) printf(" u3=%u\n", vars.u3); if (vars.l1 != vars1.l1) printf(" l1=%ld\n", vars.l1); if (vars.s1 != vars1.s1) printf(" s1=%hd\n", vars.s1); if (vars.ul1 != vars1.ul1) printf(" ul1=%lu\n", vars.ul1); p = strchr(vars.buf1, 'ç'); if (p != vars.buf1) printf(" buf1=\"%.*s\"\n", p - vars.buf1, vars.buf1); p = strchr(vars.buf2, 'ç'); if (p != vars.buf2) printf(" buf2=\"%.*s\"\n", p - vars.buf2, vars.buf2); if (vars.p1 != vars1.p1) printf(" p1=%p\n", vars.p1); if (vars.p2 != vars1.p2) printf(" p2=%p\n", vars.p2); if (vars.p3 != vars1.p3) printf(" p3=%p\n", vars.p3); } else if (errno) printf(" (errno=%d [%s])\n", errno1, strerror(errno1)); else printf("\n"); nr++; } #define TEST(s, format, ...) test(#s, #format, #__VA_ARGS__, s, format, ## __VA_ARGS__) int main() { TEST("Hey !", "Hey !"); TEST("", "%n", &vars.i1); TEST("Hey !", "Hey !%n", &vars.i1); TEST("Hey!", "Hey\f!%n", &vars.i1); TEST("Hey!", "Hey\n\t!%n", &vars.i1); TEST("Hey ! %n", "Hey ! %n", &vars.i1); TEST("Hey\n\t \f!", "Hey\r \t!%n", &vars.i1); TEST("Hey ", "Hey !%n", &vars.i1); TEST("Hey", "Hey\f!%n", &vars.i1); TEST("Hey", "Hey\n\t!%n", &vars.i1); TEST("Hey\n\t \f", "Hey\r \t!%n", &vars.i1); puts("\n----------------------------------------\n"); TEST("1234", "%d", &vars.i1); TEST(" 1234", "%d", &vars.i1); TEST(" 1234", "%d%n", &vars.i1, &vars.i2); TEST("27/09/1981", "%d/%d/%d", &vars.i1, &vars.i2, &vars.i3); TEST(" \t12\r\n 34\n", "%d%d", &vars.i1, &vars.i2); TEST("ab12cd 34", "ab%dcd%d", &vars.i1, &vars.i2); TEST("ab12 cd 34", "ab%dcd%d", &vars.i1, &vars.i2); TEST("12 34", "%*d %d", &vars.i1); TEST("a 1234", "a%3d", &vars.i1); TEST("a 1234", "a%3d", &vars.i1); TEST("a 1234", "a%ld", &vars.l1); TEST("a 1234%5678", "a%*3d4%%%3ld", &vars.l1); puts("\n----------------------------------------\n"); TEST("65535", "%hd", &vars.s1); TEST("65536", "%hd", &vars.s1); TEST("70000", "%hd", &vars.s1); TEST("", "%d", &vars.i1); TEST("a", "%d", &vars.i1); puts("\n----------------------------------------\n"); TEST("0", "%x%n", &vars.u1, &vars.i2); TEST("00", "%x%n", &vars.u1, &vars.i2); TEST("010", "%x%n", &vars.u1, &vars.i2); TEST("0x1f", "%x%n", &vars.u1, &vars.i2); TEST("0x", "%x%n", &vars.u1, &vars.i2); TEST("0x1234", "%4x%n", &vars.u1, &vars.i2); TEST("01234", "%4x%n", &vars.u1, &vars.i2); TEST("0xg", "%x%n", &vars.u1, &vars.i2); TEST("+", "%x%n", &vars.u1, &vars.i2); TEST("-1", "%x%n", &vars.u1, &vars.i2); puts("\n----------------------------------------\n"); TEST("1234 0X1234 01234", "%i %i %i", &vars.i1, &vars.i2, &vars.i3); TEST("100 100 100", "%o %u %x", &vars.u1, &vars.u2, &vars.u3); TEST("1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("0x1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("+1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("+0x1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("-1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("-0x1234aFg", "%x%n", &vars.u1, &vars.i2); TEST("1789afg", "%ld%n", &vars.l1, &vars.i1); TEST("1789afg", "%lx%n", &vars.ul1, &vars.i1); TEST("1789afg", "%lo%n", &vars.ul1, &vars.i1); TEST("1789afg", "%li%n", &vars.l1, &vars.i1); puts("\n----------------------------------------\n"); TEST("0x1789afg", "%li%n", &vars.l1, &vars.i1); TEST("01789afg", "%li%n", &vars.l1, &vars.i1); TEST(" \t +1789afg", "%ld%n", &vars.l1, &vars.i1); TEST(" \t -1789afg", "%ld%n", &vars.l1, &vars.i1); TEST("0x1789afg", "%lx%n", &vars.ul1, &vars.i1); TEST("01789afg", "%ld%n", &vars.l1, &vars.i1); TEST("1789Afg", "%lx%n", &vars.ul1, &vars.i1); TEST("8", "%lo%n", &vars.ul1, &vars.i1); TEST("", "%ld%n", &vars.l1, &vars.i1); puts("\n----------------------------------------\n"); TEST("-1789afg", "%lx%n", &vars.ul1, &vars.i1); TEST("-1789afg", "%lo%n", &vars.ul1, &vars.i1); TEST("111111111111111111111111", "%ld%n", &vars.l1, &vars.i1); TEST("-111111111111111111111111", "%ld%n", &vars.l1, &vars.i1); TEST("2147483647", "%ld%n", &vars.l1, &vars.i1); TEST("-2147483648", "%ld%n", &vars.l1, &vars.i1); TEST("2147483648", "%ld%n", &vars.l1, &vars.i1); TEST("-2147483649", "%ld%n", &vars.l1, &vars.i1); TEST(" 111111111111111111111111", "%ld%n", &vars.l1, &vars.i1); TEST("111111111111111111111111", "%hd%n", &vars.s1, &vars.i1); TEST("111111111111111111111111 1", "%d%n%d", &vars.i1, &vars.i2, &vars.i3); puts("\n----------------------------------------\n"); TEST("0", "%ld%n", &vars.l1, &vars.i1); TEST("+0", "%ld%n", &vars.l1, &vars.i1); TEST("-0", "%ld%n", &vars.l1, &vars.i1); TEST("+0x0", "%lx%n", &vars.ul1, &vars.i1); TEST("-0x0", "%lx%n", &vars.ul1, &vars.i1); TEST("+0", "%lo%n", &vars.ul1, &vars.i1); TEST("-0", "%lo%n", &vars.ul1, &vars.i1); TEST("+0", "%li%n", &vars.l1, &vars.i1); TEST("-0", "%li%n", &vars.l1, &vars.i1); TEST("+0x0", "%li%n", &vars.l1, &vars.i1); TEST("-0x0", "%li%n", &vars.l1, &vars.i1); TEST("1", "%ld%n", &vars.ul1, &vars.i1); TEST("-1", "%ld%n", &vars.ul1, &vars.i1); puts("\n----------------------------------------\n"); TEST("1234", "%ld%n", &vars.ul1, &vars.i1); TEST("-1234", "%ld%n", &vars.ul1, &vars.i1); TEST("2147483647", "%ld%n", &vars.ul1, &vars.i1); TEST("-2147483648", "%ld%n", &vars.ul1, &vars.i1); TEST("2147483648", "%ld%n", &vars.ul1, &vars.i1); TEST("-2147483649", "%ld%n", &vars.ul1, &vars.i1); TEST("4294967295", "%ld%n", &vars.ul1, &vars.i1); TEST("-4294967295", "%ld%n", &vars.ul1, &vars.i1); TEST("4294967296", "%ld%n", &vars.ul1, &vars.i1); TEST("-4294967296", "%ld%n", &vars.ul1, &vars.i1); puts("\n----------------------------------------\n"); TEST("Hello, world", "%s %s", vars.buf1, vars.buf2); TEST("Hello, world", "%10s%2s", vars.buf1, vars.buf2); TEST("", "%s", vars.buf1); TEST("Hello, ", "%s%s", vars.buf1, vars.buf2); TEST("Caroline", "%*s%n", &vars.i1); TEST("A BC EFG HI", "%c%3c %3c%3c %2c", vars.buf1, vars.buf1 + 8, vars.buf1 + 16, vars.buf1 + 24, vars.buf1 + 32); TEST("A", "%0c", vars.buf1); TEST("0 0x1234 1234", "%p %p %p", &vars.p1, &vars.p2, &vars.p3); TEST("(nil) 123123123123 (nile)", "%p %p %p", &vars.p1, &vars.p2, &vars.p3); TEST("-1", "%p", &vars.p1); TEST("12 34 56 78 90 %n", "%d %n %d", &vars.i1, &vars.i2, &vars.i3); puts("\n----------------------------------------\n"); TEST(" Hello, world!", "%[ edHlorw,]", vars.buf1); TEST("Hello, world!", "%[^!.]", vars.buf1); TEST("Hello, world!", "%[A-z, ]", vars.buf1); TEST("Hello, world!", "%[^!-+.-@-]", vars.buf1); TEST("Hello, world-", "%[^0-9\"-]", vars.buf1); TEST("Hello, world!", "%12[ edHlorw,!]", vars.buf1); TEST("Hello, world!", "%*12[ edHlorw,!]%n%c%n", vars.buf1, &vars.i1, vars.buf1 + 128, &vars.i2); TEST("Hello, world!", "%[ edHlorw,!]%n", vars.buf1, &vars.i1); TEST("Hello, world!", "%0[ edHlorw,!]%n", vars.buf1, &vars.i1); TEST("Hello, world!", "%[Ha-z,-, ]%n", vars.buf1, &vars.i1); puts("\n----------------------------------------\n"); TEST("A", "%[a]", vars.buf1); TEST("", "%[a]", vars.buf1); TEST(" ba 123456789A] ]]]]]", "%[ab ] %[^]a-z]] %3[]]", vars.buf1, vars.buf1 + 16, vars.buf1 + 32); TEST("%", "%[%]%n", vars.buf1, &vars.i1); TEST("]", "%[]]%n", vars.buf1, &vars.i1); TEST("]", "%[^]]%n", vars.buf1, &vars.i1); TEST("%", "%[^]]%n", vars.buf1, &vars.i1); TEST("-", "%[]2-]%n", vars.buf1, &vars.i1); TEST("[2", "%[^]0-9-]%d%n", vars.buf1, &vars.i1, &vars.i2); TEST("]2", "%[^]0-9-]%d%n", vars.buf1, &vars.i1, &vars.i2); TEST("ab", "%[^]0-9-]%c%n", vars.buf1, vars.buf2, &vars.i2); TEST("ab9", "%[^]0-9-]%c%n", vars.buf1, vars.buf2, &vars.i2); TEST("ab]", "%[^]0-9-]%c%n", vars.buf1, vars.buf2, &vars.i2); TEST("ab-", "%[^]0-9-]%c%n", vars.buf1, vars.buf2, &vars.i2); TEST("12%34", "%[^]%d]%%%d%n", vars.buf1, &vars.i1); TEST("123456789", "%*7ld%n", &vars.i1); TEST(" ", "\t%n\n", &vars.i1); puts("\n----------------------------------------\n"); TEST("", "%l"); TEST("123456", "12%n34%n56%n", &vars.i1, &vars.i2, &vars.i3); TEST("123456", "12%n34%y56%n", &vars.i1, &vars.i2, &vars.i3); TEST("ab", ""); TEST("a2c4e", "a%dd%de", &vars.i1, &vars.i2); TEST("a", "a"); TEST("", "a"); TEST("b", "a"); TEST("1", "%*da%n", &vars.i1); TEST("1", "%*ya%n", &vars.i1); TEST("1", "%da", &vars.i1); TEST("1", "%ya"); puts("\n----------------------------------------\n"); TEST(" ", " %n", &vars.i1); TEST(" %1", "%%%n%d", &vars.i1, &vars.i2); TEST("123456789", "%3d%3d%3c", &vars.i1, &vars.i2, vars.buf1); TEST("", "%d", &vars.i1); TEST("", "%0s%n", vars.buf1, &vars.i1); TEST("AB", "%0s%n", vars.buf1, &vars.i1); TEST(" ", "%%"); TEST("", " %n", &vars.i1); TEST("a", " %n", &vars.i1); TEST("", "%*n", &vars.i1); TEST("0x1234", "%*p%n", &vars.p1, &vars.i1); TEST("0x1234", "%4p%n", &vars.p1, &vars.i1); TEST("(nil)", "%2p%n", &vars.p1, &vars.i1); TEST("", NULL); puts("\n----------------------------------------\n"); TEST("2147483647", "%d", &vars.i1); TEST("2147483647", "%u", &vars.u1); TEST("2147483648", "%d", &vars.i1); TEST("2147483648", "%u", &vars.u1); TEST("4294967295", "%d", &vars.i1); TEST("4294967295", "%u", &vars.u1); TEST("4294967296", "%d", &vars.i1); TEST("4294967296", "%u", &vars.u1); TEST("-1", "%d", &vars.i1); TEST("-1", "%u", &vars.u1); TEST("-2147483648", "%d", &vars.i1); TEST("-2147483648", "%u", &vars.u1); TEST("-2147483649", "%d", &vars.i1); TEST("-2147483649", "%u", &vars.u1); return EXIT_SUCCESS; }