tst-unlockedio.c

来自「绝对正真的stdio.h的实现」· C语言 代码 · 共 158 行

C
158
字号
/* Test for some *_unlocked stdio interfaces.   Copyright (C) 2004 Free Software Foundation, Inc.   This file is part of the GNU C Library.   Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.   The GNU C Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public   License as published by the Free Software Foundation; either   version 2.1 of the License, or (at your option) any later version.   The GNU C Library 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   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; if not, write to the Free   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307 USA.  */#include <stdlib.h>#include <stdio.h>#include <string.h>int fd;static void do_prepare (void);static int do_test (void);#define PREPARE(argc, argv) do_prepare ()#define TEST_FUNCTION do_test ()#include "../test-skeleton.c"static intdo_test (void){  const char blah[] = "BLAH";  char buf[strlen (blah) + 1];  FILE *fp, *f;  const char *cp;  char *wp;  if ((fp = fdopen (fd, "w+")) == NULL)    exit (1);  flockfile (fp);  f = fp;  cp = blah;  if (ftello (fp) != 0      || fwrite_unlocked (blah, blah - blah, strlen (blah), f++) != 0      || f != fp + 1      || fwrite_unlocked ("", 5.0, 0, --f) != 0      || f != fp      || fwrite_unlocked (cp++, 16, 0.25, fp) != 0      || cp != blah + 1      || fwrite_unlocked (--cp, 0.25, 16, fp) != 0      || cp != blah      || fwrite_unlocked (blah, 0, -0.0, fp) != 0      || ftello (fp) != 0)    {      puts ("One of fwrite_unlocked tests failed");      exit (1);    }  if (fwrite_unlocked (blah, 1, strlen (blah) - 2, fp) != strlen (blah) - 2)    {      puts ("Could not write string into file");      exit (1);    }  if (putc_unlocked ('A' + 0x1000000, fp) != 'A')    {      puts ("putc_unlocked failed");      exit (1);    }  f = fp;  cp = blah + strlen (blah) - 1;  if (putc_unlocked (*cp++, f++) != 'H'      || f != fp + 1      || cp != strchr (blah, '\0'))    {      puts ("fputc_unlocked failed");      exit (1);    }  if (ftello (fp) != (off_t) strlen (blah))    {      printf ("Failed to write %zd bytes to temporary file", strlen (blah));      exit (1);    }  rewind (fp);  f = fp;  wp = buf;  memset (buf, ' ', sizeof (buf));  if (ftello (fp) != 0      || fread_unlocked (buf, buf - buf, strlen (blah), f++) != 0      || f != fp + 1      || fread_unlocked (buf, 5.0, 0, --f) != 0      || f != fp      || fread_unlocked (wp++, 16, 0.25, fp) != 0      || wp != buf + 1      || fread_unlocked (--wp, 0.25, 16, fp) != 0      || wp != buf      || fread_unlocked (buf, 0, -0.0, fp) != 0      || ftello (fp) != 0      || memcmp (buf, "     ", sizeof (buf)) != 0)    {      puts ("One of fread_unlocked tests failed");      exit (1);    }  if (fread_unlocked (buf, 1, strlen (blah) - 2, fp) != strlen (blah) - 2)    {      puts ("Could not read string from file");      exit (1);    }  if (getc_unlocked (fp) != 'A')    {      puts ("getc_unlocked failed");      exit (1);    }  f = fp;  if (fgetc_unlocked (f++) != 'H'      || f != fp + 1      || fgetc_unlocked (--f) != EOF      || f != fp)    {      puts ("fgetc_unlocked failed");      exit (1);    }  if (ftello (fp) != (off_t) strlen (blah))    {      printf ("Failed to read %zd bytes from temporary file", strlen (blah));      exit (1);    }  funlockfile (fp);  fclose (fp);  return 0;}static voiddo_prepare (void){  fd = create_temp_file ("tst-unlockedio.", NULL);  if (fd == -1)    {      printf ("cannot create temporary file: %m\n");      exit (1);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?