stdio: scanf tests

This commit is contained in:
Lephenixnoir 2024-01-14 22:03:25 +01:00
parent 12c89e7c46
commit ba626bf366
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
4 changed files with 683 additions and 1 deletions

View File

@ -37,6 +37,7 @@ set(SOURCES
# stdio
src/stdio/files.c
src/stdio/printf.c
src/stdio/scanf.c
# stdlib
src/stdlib/arith.c
src/stdlib/exit.c

View File

@ -38,6 +38,8 @@ extern ft_test ft_stdio_write_chars;
extern ft_test ft_stdio_read_chars;
extern ft_test ft_stdio_stdstreams;
extern ft_test ft_stdio_getdelim;
extern ft_test ft_stdio_sscanf;
extern ft_test ft_stdio_fscanf;
/* stdlib */
extern ft_test ft_stdlib_arith;

View File

@ -56,7 +56,9 @@ ft_list headers_libc[] = {
&ft_stdio_write_chars,
&ft_stdio_read_chars,
&ft_stdio_stdstreams,
&ft_stdio_getdelim,
&ft_stdio_getdelim,
&ft_stdio_sscanf,
&ft_stdio_fscanf,
NULL,
}},
{ _("stdlib.h", "<stdlib.h>"), (ft_test*[]){

677
src/stdio/scanf.c Normal file
View File

@ -0,0 +1,677 @@
#include <ft/test.h>
#include <ft/all-tests.h>
#include <gint/gint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define ASSERTFP(X, TARGET, EPS) \
((X) >= (TARGET)-(EPS) && (X) <= (TARGET)+(EPS))
/* Return value of *scanf() and total number of bytes read */
static int ret = -20;
static int n = -20;
/* Various strings... */
static char c[10] = ".........";
static char str[25] = "........................";
static char str2[25] = "........................";
/* unsigned integers... */
static unsigned long long ulli = 0;
static unsigned long uli = 0;
static unsigned int ui = 0;
static unsigned short usi = 0;
static unsigned char ussi = 0;
/* integers... */
static long long slli = 0;
static long sli = 0;
static int si = 0;
static short ssi = 0;
static char sssi = 0;
/* and floating-point numbers to test the formats. */
static float f1 = 0;
static float f2 = 0;
static double d1 = 0;
static double d2 = 0;
static long double ld1 = 0;
static long double ld2 = 0;
_Static_assert(sizeof(long long int) == 8);
_Static_assert(sizeof(long int) == 4);
_Static_assert(sizeof(int) == 4);
_Static_assert(sizeof(short) == 2);
_Static_assert(sizeof(char) == 1);
#define PRINT(FMT, ...) \
ft_log(t, FMT, ##__VA_ARGS__)
static void _ft_stdio_fscanf_switch(ft_test *t)
{
FILE *fp = fopen("input.txt", "w");
if(!ft_assert(t, fp != NULL))
return;
char const *data =
"123\n"
"3.14\n"
"Hello\n"
"A\n"
"10 3.14 20\n"
"This is a sentence with spaces.\n"
"1 2 3 4 5\n"
"Invalid Input Test\n";
fwrite(data, strlen(data), 1, fp);
fclose(fp);
fp = fopen("input.txt", "r");
if(!ft_assert(t, fp != NULL))
return;
// Test 1: Read an integer
int i;
fscanf(fp, "%d", &i);
PRINT("Test 1: Read integer: %d\n", i);
ft_assert(t, i == 123);
// Test 2: Read a floating-point number
float f;
fscanf(fp, "%f", &f);
PRINT("Test 2: Read floating-point number: %f\n", f);
ft_assert(t, ASSERTFP(f, 3.14, 1E-6));
// Test 3: Read a string with spaces
char s[20];
fscanf(fp, "%s", s);
PRINT("Test 3: Read string: '%s'\n", s);
ft_assert(t, !strcmp(s, "Hello"));
// Test 4: Read a character
char cc;
fscanf(fp, "%*c%c", &cc);
PRINT("Test 4: Read character: %c\n", cc);
ft_assert(t, cc == 'A');
// Test 5: Read multiple values
int a, b;
float c1;
fscanf(fp, "%d%f%d", &a, &c1, &b);
PRINT("Test 5: Read multiple values: %d, %f, %d\n", a, c1, b);
ft_assert(t, a == 10 && ASSERTFP(c1, 3.14, 1E-6) && b == 20);
// Test 6: Read a string with spaces using %[^\n]
char s1[50];
fscanf(fp, " %[^\n]", s1);
PRINT("Test 6: Read string with spaces: '%s'\n", s1);
ft_assert(t, !strcmp(s1, "This is a sentence with spaces."));
// Test 7: Read until EOF
int num, count = 0;
while (fscanf(fp, "%d", &num) == 1) {
count++;
ft_assert(t, num == count);
PRINT("Test 7: Read number: %d\n", num);
}
PRINT("Test 7: Total numbers read: %d\n", count);
ft_assert(t, count == 5);
// Test 8: Error handling - invalid input
int x;
int ret = fscanf(fp, "%d", &x);
if(ret == EOF)
PRINT("Test 8: End of file reached\n");
else if(ret == 0)
PRINT("Test 8: Invalid input\n");
else
PRINT("Test 8: Read number: %d\n", x);
ft_assert(t, ret == 0);
// Test 9: Error handling - end of file
fscanf(fp, "%*[^\n]");
int y = -1;
ret = fscanf(fp, "%d", &y);
if (ret == EOF)
PRINT("Test 9: End of file reached\n");
else
PRINT("Test 9: Read number: %d\n", y);
ft_assert(t, ret == EOF);
// TODO: Check EOF behavior a lot more thoroughly
fclose(fp);
}
static void _ft_stdio_fscanf(ft_test *t)
{
gint_world_switch(GINT_CALL(_ft_stdio_fscanf_switch, (void *)t));
}
ft_test ft_stdio_fscanf = {
.name = "scanf: File buffering",
.function = _ft_stdio_fscanf,
};
static void clear(void)
{
ret = -20;
n = -20;
strcpy(c, ".........");
strcpy(str, "........................");
strcpy(str2, "........................");
ulli = 0;
uli = 0;
ui = 0;
usi = 0;
ussi = 0;
slli = 0;
sli = 0;
si = 0;
ssi = 0;
sssi = 0;
f1 = 0;
f2 = 0;
d1 = 0;
d2 = 0;
ld1 = 0;
ld2 = 0;
}
static void _ft_stdio_sscanf(ft_test *t)
{
/******************************/
/* TESTS ON CHARS AND STRINGS */
/******************************/
clear();
ret = sscanf("abcdefghij", "%c%n", &c[0], &n);
PRINT("#1 : rd 1c : [%c] cn=%d rt=%d\n", c[0], n, ret);
ft_assert(t, ret==1 && c[0]=='a' && n==1);
clear();
ret = sscanf("abcdefghij", "%c%*c%c%n", &c[0], &c[2], &n);
PRINT("#2 : rd 1c + skp 1c + rd 1c : [%c][%c][%c] cn=%d rt=%d\n",
c[0], c[1], c[2], n, ret);
ft_assert(t, ret==2 && c[0]=='a' && c[1]=='.' && c[2]=='c' && n==3);
clear();
ret = sscanf("abcdefghij", "%3c%n", c, &n);
PRINT("#3 : rd 3c (w 3c) : [%c][%c][%c] cn=%d rt=%d\n",
c[0], c[1], c[2], n, ret);
ft_assert(t, ret==1 && c[0]=='a' && c[1]=='b' && c[2]=='c'
&& c[3] == '.' && n==3);
clear();
ret = sscanf("abcdefghij", "%*5c%n", &n);
PRINT("#4a : skp 5c : cn=%d rt=%d\n", n, ret);
ft_assert(t, ret==0 && n==5);
clear();
ret = sscanf("abcdefghij", "%*5c%c%n", &c[0], &n);
PRINT("#4b : skp 5c : [%c] cn=%d rt=%d\n", c[0], n, ret);
ft_assert(t, ret==1 && n==6 && c[0]=='f' && c[1]=='.');
clear();
ret = sscanf("abcdefghij", "%*5c%1c%n", &c[0], &n);
PRINT("#4c : skp 5c : [%c][%c] cn=%d rt=%d\n", c[0], c[1], n, ret);
ft_assert(t, ret==1 && n==6 && c[0]=='f' && c[1]=='.');
clear();
ret = sscanf("abcdefghij", "%*5c%2c%n", c, &n);
PRINT("#4d : skp 5c : [%c][%c][%c] cn=%d rt=%d\n",
c[0], c[1], c[2], n, ret);
ft_assert(t, ret==1 && n==7 && c[0]=='f' && c[1]=='g' && c[2]=='.');
clear();
ret = sscanf("abcdefghij", "%*5c%3c%n", c, &n);
PRINT("#4 : skp 5c + rd 3c (w 3c) : [%c][%c][%c] cn=%d rt=%d\n",
c[0], c[1], c[2], n, ret);
ft_assert(t, ret==1 && c[0]=='f' && c[1]=='g' && c[2]=='h' && n==8);
clear();
ret = sscanf("abcdefghij", "%n", &n);
PRINT("#5 : no char : cn=%d rt=%d\n", n, ret);
ft_assert(t, ret==0 && n==0);
clear();
ret = sscanf("abcdefghij", "%s%n", str, &n);
PRINT("#6 : rd 1s : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "abcdefghij")==0 && n==10);
clear();
ret = sscanf("abcde ghij", "%s%n", str, &n);
PRINT("#7 : rd 1s with space : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "abcde")==0 && n==5);
clear();
ret = sscanf("abcdefghij", "%*5c%s%n", str, &n);
PRINT("#8 : skp 5c + rd 1str : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "fghij")==0 && n==10);
clear();
ret = sscanf("", "%*5c%s%n", str, &n);
PRINT("#9 : empty str tst1 : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==-1 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("", "%c%s%n", &c[0], str, &n);
PRINT("#10 : empty str tst2 : [%c][%s] cn=%d rt=%d\n",
c[0], str, n, ret);
ft_assert(t, ret==-1 && c[0]=='.' &&
strcmp(str, "........................" )==0 && n==-20);
clear();
ret = sscanf("abcdef ghijkl", "%s%s%n", str, str2, &n);
PRINT("#11 : rd 1s + 1s : [%s][%s] cn=%d rt=%d\n", str, str2, n, ret);
ft_assert(t, ret==2 && strcmp( str, "abcdef")==0 &&
strcmp(str2, "ghijkl" )==0 && n==13);
clear();
ret = sscanf("abcdef ghijkl", "%s%c%s%n", str, &c[0], str2, &n);
PRINT("#12 : rd 1s + 1c + 1s : [%s][%c][%s] cn=%d rt=%d\n",
str, c[0], str2, n, ret);
ft_assert(t, ret==3 && strcmp( str, "abcdef")==0 && c[0]==' ' &&
strcmp(str2, "ghijkl" )==0 && n==13);
/******************************/
/* TESTS ON INTEGER NUMBERS */
/******************************/
clear();
ret = sscanf("1234567890", "%d%n", &si, &n);
PRINT("#13 : rd 1d : [%d] cn=%d rt=%d\n", si, n, ret);
ft_assert(t, ret==1 && si==1234567890 && n==10);
clear();
ret = sscanf("1234567890", "%d%n", &ui, &n);
PRINT("#14 : rd 1d : [%d] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==1234567890 && n==10);
clear();
ret = sscanf("-1234567890", "%d%n", &si, &n);
PRINT("#15 : rd 1d : [%d] cn=%d rt=%d\n", si, n, ret);
ft_assert(t, ret==1 && si==-1234567890 && n==11);
clear();
ret = sscanf("-1234567890", "%d%n", &ui, &n);
PRINT("#16 : rd 1d : [%d] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==(uint32_t)-1234567890 && n==11);
clear();
ret = sscanf("1234567890", "%hd%n", &ssi, &n);
PRINT("#17 : rd 1hd : [%hd] cn=%d rt=%d\n", ssi, n, ret);
ft_assert(t, ret==1 && ssi==722 && n==10);
clear();
ret = sscanf("1234567890", "%hhd%n", &sssi, &n);
PRINT("#18 : rd 1hhd : [%hhd] cn=%d rt=%d\n", sssi, n, ret);
ft_assert(t, ret==1 && sssi==-46 && n==10);
clear();
ret = sscanf("1234567890", "%ld%n", &sli, &n);
PRINT("#19 : rd 1ld : [%ld] cn=%d rt=%d\n", sli, n, ret);
ft_assert(t, ret==1 && sli==1234567890 && n==10);
clear();
ret = sscanf("1234567890", "%lld%n", &slli, &n);
PRINT("#20 : rd 1lld : [%lld] cn=%d rt=%d\n", slli, n, ret);
ft_assert(t, ret==1 && slli==1234567890 && n==10);
clear();
ret = sscanf("-1234567890", "%hd%n", &ssi, &n);
PRINT("#21 : rd 1hd : [%hd] cn=%d rt=%d\n", ssi, n, ret);
ft_assert(t, ret==1 && ssi==-722 && n==11);
clear();
ret = sscanf("-1234567890", "%hhd%n", &sssi, &n);
PRINT("#22 : rd 1hhd : [%hhd] cn=%d rt=%d\n", sssi, n, ret);
ft_assert(t, ret==1 && sssi==46 && n==11);
clear();
ret = sscanf("-1234567890", "%ld%n", &sli, &n);
PRINT("#23 : rd 1ld : [%ld] cn=%d rt=%d\n", sli, n, ret);
ft_assert(t, ret==1 && sli==-1234567890 && n==11);
clear();
ret = sscanf("-1234567890", "%lld%n", &slli, &n);
PRINT("#24 : rd 1lld : [%lld] cn=%d rt=%d\n", slli, n, ret);
ft_assert(t, ret==1 && slli==-1234567890 && n==11);
clear();
ret = sscanf("1234567890", "%u%n", &ui, &n);
PRINT("#25 : rd 1u : [%u] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==1234567890 && n==10);
clear();
ret = sscanf("1234567890", "%hhu%n", &ussi, &n);
PRINT("#26 : rd 1hhu : [%hhu] cn=%d rt=%d\n", ussi, n, ret);
ft_assert(t, ret==1 && ussi==210 && n==10);
clear();
ret = sscanf("-1234567890", "%lu%n", &uli, &n);
PRINT("#27 : rd 1lu : [%lu] cn=%d rt=%d\n", uli, n, ret);
ft_assert(t, ret==1 && uli==3060399406 && n==11);
clear();
ret = sscanf("-1234567890", "%llu%n", &ulli, &n);
PRINT("#28 : rd 1llu : [%llu] cn=%d rt=%d\n", ulli, n, ret);
ft_assert(t, ret==1 && ulli==18446744072474983726ull && n==11);
clear();
ret = sscanf("1234567890", "%3i%2c%4i%c%n", &ui, &c[0], &si, &c[3], &n);
PRINT("#29 : rd 1i+2c+4i+c : [%i][%c][%c][%i][%c] cn=%d rt=%d\n",
ui, c[0], c[1], si, c[3], n, ret);
ft_assert(t, ret==4 && ui==123 && c[0]=='4' && c[1]=='5' && si==6789
&& c[3]=='0' && n==10);
clear();
ret = sscanf("123", "%i%n", &ui, &n);
PRINT("#30 : rd 1i from decimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==123 && n==3);
clear();
ret = sscanf("0123", "%i%n", &ui, &n);
PRINT("#31 : rd 1i from octal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==83 && n==4);
clear();
ret = sscanf("0x123", "%i%n", &ui, &n);
PRINT("#32 : rd 1i from hexadecimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==291 && n==5);
/********************************************/
/* TESTS ON HEXADECIMAL AND OCTAL NUMBERS */
/********************************************/
clear();
ret = sscanf("0123", "%o%n", &ui, &n);
PRINT("#33 : rd 1o from decimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==83 && n==4);
clear();
ret = sscanf("0x123", "%x%n", &ui, &n);
PRINT("#34 : rd 1x from hexadecimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==291 && n==5);
clear();
ret = sscanf("0X123", "%x%n", &ui, &n);
PRINT("#35 : rd 1x from hexadecimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==291 && n==5);
clear();
ret = sscanf("0x123", "%X%n", &ui, &n);
PRINT("#36 : rd 1X from hexadecimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==291 && n==5);
clear();
ret = sscanf("0X123", "%X%n", &ui, &n);
PRINT("#37 : rd 1X from hexadecimal : [%i] cn=%d rt=%d\n", ui, n, ret);
ft_assert(t, ret==1 && ui==291 && n==5);
/*************************************/
/* TESTS ON FLOATING POINT NUMBERS */
/*************************************/
// read %a%e%f%g%A%E%F%G
clear();
ret = sscanf("0.123 -0.456", "%a%A%n", &f1, &f2, &n);
PRINT("#38 : rd 1a+1A: [%.3f][%.3f] cn=%d rt=%d\n", f1, f2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(f1,0.123,1E-7)
&& ASSERTFP(f2,-0.456,1E-7) && n==12);
clear();
ret = sscanf("0.0123E+1 -45.6E-2", "%f%F%n", &f1, &f2, &n);
PRINT("#39 : rd 1f+1F: [%.3f][%.3f] cn=%d rt=%d\n", f1, f2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(f1,0.123,1E-7)
&& ASSERTFP(f2,-0.456,1E-7) && n==18);
clear();
ret = sscanf("0.123 -0.456", "%g%G%n", &f1, &f2, &n);
PRINT("#40 : rd 1g+1G: [%.3f][%.3f] cn=%d rt=%d\n", f1, f2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(f1,0.123,1E-7)
&& ASSERTFP(f2,-0.456,1E-7) && n==12);
clear();
ret = sscanf("0.0123E+1 -45.6E-2", "%e%E%n", &f1, &f2, &n);
PRINT("#41 : rd 1e+1E: [%.3f][%.3f] cn=%d rt=%d\n", f1, f2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(f1,0.123,1E-7)
&& ASSERTFP(f2,-0.456,1E-7) && n==18);
clear();
ret = sscanf("0.123 -0.456", "%la%lA%n", &d1, &d2, &n);
PRINT("#42 : rd 1la+1lA: [%.3lf][%.3lf] cn=%d rt=%d\n",
d1, d2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(d1,0.123,1E-7)
&& ASSERTFP(d2,-0.456,1E-7) && n==12);
clear();
ret = sscanf("0.0123E+1 -45.6E-2", "%lf%lF%n", &d1, &d2, &n);
PRINT("#43 : rd 1lf+1lF: [%.3lf][%.3lf] cn=%d rt=%d\n",
d1, d2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(d1,0.123,1E-7)
&& ASSERTFP(d2,-0.456,1E-7) && n==18);
clear();
ret = sscanf("0.123 -0.456", "%La%LA%n", &ld1, &ld2, &n);
PRINT("#44 : rd 1La+1LA: [%.3Lf][%.3Lf] cn=%d rt=%d\n",
ld1, ld2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(ld1,0.123,1E-7)
&& ASSERTFP(ld2,-0.456,1E-7) && n==12);
clear();
ret = sscanf("0.0123E+1 -45.6E-2", "%Lf%LF%n", &ld1, &ld2, &n);
PRINT("#45 : rd 1Lf+1LF: [%.3Lf][%.3Lf] cn=%d rt=%d\n",
ld1, ld2, n, ret);
ft_assert(t, ret==2 && ASSERTFP(ld1,0.123,1E-7)
&& ASSERTFP(ld2,-0.456,1E-7) && n==18);
/***********************/
/* TESTS ON POINTERS */
/***********************/
int val;
char buf[30];
sprintf(buf, "%p", &val);
void *ptr;
sscanf(buf, "%p", &ptr);
ft_assert(t, ptr == &val);
PRINT("#46 : rd 1p : [in:%p][out:%p]\n", &val, ptr);
/**************************/
/* TESTS ON SET OF CHAR */
/**************************/
clear();
ret = sscanf("abcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#47 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "ab")==0 && n==2);
clear();
ret = sscanf("bcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#48 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "b")==0 && n==1);
clear();
ret = sscanf("1abcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#49 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "1ab")==0 && n==3);
clear();
ret = sscanf("Gabcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#50 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("6abcdefghij", "%[abdr-v0-5A-F]%n", str, &n);
PRINT("#51 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("uabcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#52 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "uab")==0 && n==3);
clear();
ret = sscanf("-abcdefghij", "%[abdr-v0-9A-F]%n", str, &n);
PRINT("#53 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("-abcdefghij", "%[abdr-v0-5A-F-]%n", str, &n);
PRINT("#54 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "-ab")==0 && n==3);
clear();
ret = sscanf("Gabcdefghij", "%[abdr-v0-9A-F-]%n", str, &n);
PRINT("#55 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("]abcdefghij", "%[abdr-v0-9A-F-]%n", str, &n);
PRINT("#56 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("]abcdefghij", "%3[]abdr-v0-9A-F-]%n", str, &n);
PRINT("#57 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "]ab")==0 && n==3);
clear();
ret = sscanf("Gabcdefghij", "%2[abdr-v0-9A-F-]%n", str, &n);
PRINT("#58 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("]abcdefghij", "%4[abdr-v0-9A-F-]%n", str, &n);
PRINT("#59 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("]abcdefghij", "%5[]a-z0-9A-Z-]%n", str, &n);
PRINT("#60 : rd 1[] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "]abcd")==0 && n==5);
clear();
ret = sscanf("abcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#61 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("bcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#62 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("1abcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#63 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("Gabcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#64 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "G")==0 && n==1);
clear();
ret = sscanf("6abcdefghij", "%[^abdr-v0-5A-F]%n", str, &n);
PRINT("#65 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "6")==0 && n==1);
clear();
ret = sscanf("uabcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#66 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("-abcdefghij", "%[^abdr-v0-9A-F]%n", str, &n);
PRINT("#67 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "-")==0 && n==1);
clear();
ret = sscanf("-abcdefghij", "%[^abdr-v0-5A-F-]%n", str, &n);
PRINT("#68 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("Gabcdefghij", "%[^abdr-v0-9A-F-]%n", str, &n);
PRINT("#69 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "G")==0 && n==1);
clear();
ret = sscanf("]GHIJabcdefghij", "%[^abdr-v0-9A-F-]%n", str, &n);
PRINT("#70 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "]GHIJ")==0 && n==5);
clear();
ret = sscanf("]abcdefghij", "%3[^]abdr-v0-9A-F-]%n", str, &n);
PRINT("#71 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
ret = sscanf("Gabcdefghij", "%2[^abdr-v0-9A-F-]%n", str, &n);
PRINT("#72 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "G")==0 && n==1);
clear();
ret = sscanf("]abcdefghij", "%4[^abdr-v0-9A-F-]%n", str, &n);
PRINT("#73 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==1 && strcmp(str, "]")==0 && n==1);
clear();
ret = sscanf("]abcdefghij", "%5[^]a-z0-9A-Z-]%n", str, &n);
PRINT("#74 : rd 1[^] : [%s] cn=%d rt=%d\n", str, n, ret);
ft_assert(t, ret==0 && strcmp(str, "........................")==0
&& n==-20);
clear();
char str3[50] = ".................................................";
ret = sscanf("Any combi: You can to use any combi.\n",
"%*[^:]%*2c%[^\n]%n", str3, &n);
PRINT("#75 : rd 1[^] : [%s] cn=%d rt=%d\n", str3, n, ret);
ft_assert(t, ret==1 && strcmp(str3, "You can to use any combi.")==0
&& n==36);
clear();
char str4[50] = ".................................................";
ret = sscanf(" This is a line with spaces.\n",
" %[^\n]%n", str4, &n);
PRINT("#76 : rd 1 [^] : [%s] cn=%d rt=%d\n", str4, n, ret);
ft_assert(t, ret==1 && strcmp(str4, "This is a line with spaces.")==0
&& n==33);
/* Check that leading whitespace isn't counted in field width */
clear();
ret = sscanf(" 123456", "%4d%n", &si, &n);
PRINT("#77: \"%%4d%%n\": [%d] cn=%d rt=%d\n", si, n, ret);
ft_assert(t, ret==1 && si==1234 && n==6);
/* Check that %d, %o, %x don't accept other bases */
/* Check that %f, etc. support size limits in the weirdest places */
}
ft_test ft_stdio_sscanf = {
.name = "scanf: All formats (string input)",
.function = _ft_stdio_sscanf,
};