View of xos/tests/scanf.c


XOS | Parent Directory | View | Download

/* 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 <http://www.gnu.org/licenses/>. */
 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <stdarg.h>
 
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;
}