(root)/
glibc-2.38/
stdio-common/
scanf18.c
       1  /* Copyright (C) 2007-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  /* This test exercises the deprecated GNU %as, %aS, and %a[...] scanf
      19     modifiers, which are not available to programs compiled as C99
      20     anymore; therefore, this file is compiled with -std=gnu89 and C99
      21     syntax must not be used.  */
      22  
      23  #include <stdio.h>
      24  #include <stdlib.h>
      25  #include <string.h>
      26  #include <wchar.h>
      27  
      28  #if !__GLIBC_USE_DEPRECATED_SCANF
      29  # error "This file should be compiled with deprecated scanf"
      30  #endif
      31  
      32  
      33  #define FAIL() \
      34    do {							\
      35      result = 1;						\
      36      printf ("test at line %d failed\n", __LINE__);	\
      37    } while (0)
      38  
      39  int
      40  main (void)
      41  {
      42    wchar_t *lsp;
      43    char *sp;
      44    float f;
      45    double d;
      46    char c[8];
      47    int result = 0;
      48  
      49    if (sscanf (" 0.25s x", "%e%3c", &f, c) != 2)
      50      FAIL ();
      51    else if (f != 0.25 || memcmp (c, "s x", 3) != 0)
      52      FAIL ();
      53    if (sscanf (" 1.25s x", "%as%2c", &sp, c) != 2)
      54      FAIL ();
      55    else
      56      {
      57        if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
      58  	FAIL ();
      59        memset (sp, 'x', sizeof "1.25s");
      60        free (sp);
      61      }
      62    if (sscanf (" 2.25s x", "%las%2c", &d, c) != 2)
      63      FAIL ();
      64    else if (d != 2.25 || memcmp (c, " x", 2) != 0)
      65      FAIL ();
      66    if (sscanf (" 3.25S x", "%4aS%3c", &lsp, c) != 2)
      67      FAIL ();
      68    else
      69      {
      70        if (wcscmp (lsp, L"3.25") != 0 || memcmp (c, "S x", 3) != 0)
      71  	FAIL ();
      72        memset (lsp, 'x', sizeof L"3.25");
      73        free (lsp);
      74      }
      75    if (sscanf ("4.25[0-9.] x", "%a[0-9.]%8c", &sp, c) != 2)
      76      FAIL ();
      77    else
      78      {
      79        if (strcmp (sp, "4.25") != 0 || memcmp (c, "[0-9.] x", 8) != 0)
      80  	FAIL ();
      81        memset (sp, 'x', sizeof "4.25");
      82        free (sp);
      83      }
      84    if (sscanf ("5.25[0-9.] x", "%la[0-9.]%2c", &d, c) != 2)
      85      FAIL ();
      86    else if (d != 5.25 || memcmp (c, " x", 2) != 0)
      87      FAIL ();
      88  
      89    const char *tmpdir = getenv ("TMPDIR");
      90    if (tmpdir == NULL || tmpdir[0] == '\0')
      91      tmpdir = "/tmp";
      92  
      93    char fname[strlen (tmpdir) + sizeof "/tst-scanf14.XXXXXX"];
      94    sprintf (fname, "%s/tst-scanf14.XXXXXX", tmpdir);
      95  
      96    /* Create a temporary file.   */
      97    int fd = mkstemp (fname);
      98    if (fd == -1)
      99      FAIL ();
     100  
     101    FILE *fp = fdopen (fd, "w+");
     102    if (fp == NULL)
     103      FAIL ();
     104    else
     105      {
     106        if (fputs (" 1.25s x", fp) == EOF)
     107  	FAIL ();
     108        if (fseek (fp, 0, SEEK_SET) != 0)
     109  	FAIL ();
     110        if (fscanf (fp, "%as%2c", &sp, c) != 2)
     111  	FAIL ();
     112        else
     113  	{
     114  	  if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
     115  	    FAIL ();
     116  	  memset (sp, 'x', sizeof "1.25s");
     117  	  free (sp);
     118  	}
     119  
     120        if (freopen (fname, "r", stdin) == NULL)
     121  	FAIL ();
     122        else
     123  	{
     124  	  if (scanf ("%as%2c", &sp, c) != 2)
     125  	    FAIL ();
     126  	  else
     127  	    {
     128  	      if (strcmp (sp, "1.25s") != 0 || memcmp (c, " x", 2) != 0)
     129  		FAIL ();
     130  	      memset (sp, 'x', sizeof "1.25s");
     131  	      free (sp);
     132  	    }
     133  	}
     134  
     135        fclose (fp);
     136      }
     137  
     138    remove (fname);
     139  
     140    return result;
     141  }