/* 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;
}