diff --git a/reactos/apps/testsets/msvcrt/fileio/_tfileio.c b/reactos/apps/testsets/msvcrt/fileio/_tfileio.c new file mode 100644 index 00000000000..fdc5f7a2f62 --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/_tfileio.c @@ -0,0 +1,257 @@ +/* + * ReactOS test program - + * + * _tfileio.c + * + * Copyright (C) 2002 Robert Dickenson + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include + + +#ifdef UNICODE + +#define _tfopen _wfopen +#define _tunlink _wunlink +#define _TEOF WEOF +#define _gettchar getwchar +#define _puttchar putwchar +#define _THEX_FORMAT _T("0x%04x ") +#define TEST_B1_FILE_SIZE 85 +#define TEST_B2_FILE_SIZE 332 +#define TEST_B3_FILE_SIZE 83 +#define TEST_B4_FILE_SIZE 324 + +#else /*UNICODE*/ + +#define _tfopen fopen +#define _tunlink _unlink +#define _TEOF EOF +#define _gettchar getchar +#define _puttchar putchar +#define _THEX_FORMAT "0x%02x " +#define TEST_B1_FILE_SIZE 170 +#define TEST_B2_FILE_SIZE 162 +#define TEST_B3_FILE_SIZE 166 +#define TEST_B4_FILE_SIZE 162 + +#endif /*UNICODE*/ + + +#define TEST_BUFFER_SIZE 200 + +extern BOOL verbose_flagged; +extern TCHAR test_buffer[TEST_BUFFER_SIZE]; + + +static TCHAR dos_data[] = _T("line1: this is a bunch of readable text.\r\n")\ + _T("line2: some more printable text and punctuation !@#$%^&*()\r\n")\ + _T("line3: followed up with some numerals 1234567890\r\n")\ + _T("line4: done.\r\n"); + +static TCHAR nix_data[] = _T("line1: this is a bunch of readable text.\n")\ + _T("line2: some more printable text and punctuation !@#$%^&*()\n")\ + _T("line3: followed up with some numerals 1234567890\n")\ + _T("line4: done.\n"); + + +static BOOL create_output_file(TCHAR* file_name, TCHAR* file_mode, TCHAR* file_data) +{ + BOOL result = FALSE; + FILE *file = _tfopen(file_name, file_mode); + if (file == NULL) { + _tprintf(_T("ERROR: Can't open file \"%s\" for writing\n"), file_name); + return FALSE; + } + if (_fputts(file_data, file) != _TEOF) { + result = TRUE; + } else { + _tprintf(_T("ERROR: failed to write to file \"%s\"\n"), file_name); + } + fclose(file); + return result; +} + +static BOOL verify_output_file(TCHAR* file_name, TCHAR* file_mode, TCHAR* file_data) +{ + int offset = 0; + int line_num = 0; + BOOL result = FALSE; + FILE* file = _tfopen(file_name, file_mode); + if (file == NULL) { + _tprintf(_T("ERROR: Can't open file \"%s\" for reading\n"), file_name); + return FALSE; + } + while (_fgetts(test_buffer, TEST_BUFFER_SIZE, file)) { + int length = _tcslen(test_buffer); + _tprintf(_T("STATUS: Verifying %d bytes read from line %d\n"), length, ++line_num); + if (_tcsncmp(test_buffer, file_data+offset, length) == 0) { + result = TRUE; + } else { + _tprintf(_T("WARNING: failed to verify data from file \"%s\"\n"), file_name); + } + offset += length; + } + if (!line_num) { + _tprintf(_T("ERROR: failed to read from file \"%s\"\n"), file_name); + } + fclose(file); + return result; +} + +static int test_A(TCHAR* file_name, TCHAR* write_mode, TCHAR* read_mode, TCHAR* file_data) +{ + _tprintf(_T("STATUS: Attempting to create output file %s\n"), file_name); + if (create_output_file(file_name, write_mode, file_data)) { + _tprintf(_T("STATUS: Attempting to verify output file %s\n"), file_name); + if (verify_output_file(file_name, read_mode, file_data)) { + _tprintf(_T("SUCCESS: %s verified ok\n"), file_name); + } else { + _tprintf(_T("ERROR: Can't verify output file %s\n"), file_name); + return 2; + } + } else { + _tprintf(_T("ERROR: Can't create output file %s\n"), file_name); + return 1; + } + return 0; +} + +static int test_B(TCHAR* file_name, TCHAR* file_mode, int expected) +{ + int count = 0; + FILE* file; + TCHAR ch; + + _tprintf(_T("STATUS: checking %s in %s mode\n"), file_name, _tcschr(file_mode, _T('b')) ? _T("binary") : _T("text")); + + file = _tfopen(file_name, file_mode); + if (file == NULL) { + _tprintf(_T("ERROR: Can't open file \"%s\" for reading\n"), file_name); + return 1; + } + while ((ch = _fgettc(file)) != _TEOF) { + if (verbose_flagged) { + _tprintf(_THEX_FORMAT, ch); + } + ++count; + } + if (verbose_flagged) { + _puttchar(_T('\n')); + } + fclose(file); + if (count == expected) { + _tprintf(_T("PASSED: read %d bytes from %s as expected\n"), count, file_name); + } else { + _tprintf(_T("ERROR: read %d bytes from %s, expected %d\n"), count, file_name, expected); + } + return count; +} + +static int test_C(void) +{ + TCHAR buffer[81]; + TCHAR ch; + int i; + + _tprintf(_T("Enter a line: ")); + for (i = 0; (i < 80) && ((ch = _gettchar()) != _TEOF) && (ch != _T('\n')); i++) { + buffer[i] = (TCHAR)ch; + } + buffer[i] = _T('\0'); + _tprintf(_T("%s\n"), buffer); + return 0; +} + +static int test_D(void) +{ + int result = 0; + TCHAR ch; + + while ((ch = _gettchar()) != _TEOF) { + _tprintf(_THEX_FORMAT, ch); + } + return result; +} + +static int clean_files(void) +{ + int result = 0; + + result |= _tunlink(_T("binary.dos")); + result |= _tunlink(_T("binary.nix")); + result |= _tunlink(_T("text.dos")); + result |= _tunlink(_T("text.nix")); + return result; +} + +static int test_files(int test_num, char* type) +{ + int result = 0; + + printf("performing test: %d (%s)\n", test_num, type); + + switch (test_num) { + case 1: + result = test_A(_T("text.dos"), _T("w"), _T("r"), dos_data); + break; + case 2: + result = test_A(_T("binary.dos"), _T("wb"), _T("rb"), dos_data); + break; + case 3: + result = test_A(_T("text.nix"), _T("w"), _T("r"), nix_data); + break; + case 4: + result = test_A(_T("binary.nix"), _T("wb"), _T("rb"), nix_data); + break; + + case 5: + result = test_B(_T("text.dos"), _T("r"), 166); + result = test_B(_T("text.dos"), _T("rb"), TEST_B1_FILE_SIZE); + break; + case 6: + result = test_B(_T("binary.dos"), _T("r"), TEST_B2_FILE_SIZE); + result = test_B(_T("binary.dos"), _T("rb"), 166); + break; + case 7: + result = test_B(_T("text.nix"), _T("r"), 162); + result = test_B(_T("text.nix"), _T("rb"), TEST_B3_FILE_SIZE); + break; + case 8: + result = test_B(_T("binary.nix"), _T("r"), TEST_B4_FILE_SIZE); + result = test_B(_T("binary.nix"), _T("rb"), 162); + break; + + case 9: + result = test_C(); + break; + case 0: + result = test_D(); + break; + case -1: + result = clean_files(); + break; + default: + _tprintf(_T("no test number selected\n")); + break; + } + return result; +} diff --git a/reactos/apps/testsets/msvcrt/fileio/fileio.c b/reactos/apps/testsets/msvcrt/fileio/fileio.c new file mode 100644 index 00000000000..743d98861e2 --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/fileio.c @@ -0,0 +1,31 @@ +/* + * ReactOS test program - + * + * _fileio.c + * + * Copyright (C) 2002 Robert Dickenson + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#undef UNICODE +#undef _UNICODE +#include "_tfileio.c" + + +int test_ansi_files(int test_num) +{ + return test_files(test_num, "ANSI"); +} diff --git a/reactos/apps/testsets/msvcrt/fileio/main.c b/reactos/apps/testsets/msvcrt/fileio/main.c new file mode 100644 index 00000000000..367154ae299 --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/main.c @@ -0,0 +1,95 @@ +/* + * ReactOS test program - + * + * main.c + * + * Copyright (C) 2002 Robert Dickenson + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include + +#include "main.h" + + +#define VERSION "1.00" +#ifdef UNICODE +#define TARGET "UNICODE" +#else +#define TARGET "MBCS" +#endif + + +#define TEST_BUFFER_SIZE 200 + +TCHAR test_buffer[TEST_BUFFER_SIZE]; +BOOL verbose_flagged = 0; + + +int usage(char* argv0) +{ + printf("USAGE:\n"); + printf("\t%s clean - delete test output files\n", argv0); + printf("\t%s test_number [unicode][ansi]\n", argv0); + return 0; +} + +int __cdecl main(int argc, char* argv[]) +{ + int test_num = 0; + int result = 0; + + printf("%s test application - build %s (%s)\n", argv[0], VERSION, TARGET); + if (argc < 2) { + return usage(argv[0]); + } + if (argc > 1) { + if (strstr(argv[1], "clean") || strstr(argv[1], "clean")) { +#ifdef UNICODE + return test_unicode_files(-1); +#else + return test_ansi_files(-1); +#endif + } + test_num = atoi(argv[1]); + } + if (argc > 2) { + if (argc > 3) { + verbose_flagged = 1; + } + if (strstr(argv[2], "ansi") || strstr(argv[2], "ANSI")) { + result = test_ansi_files(test_num); + } else if (strstr(argv[2], "unicode") || strstr(argv[2], "UNICODE")) { + result = test_unicode_files(test_num); + } else { + result = test_ansi_files(test_num); + result = test_unicode_files(test_num); + } + } else { +#ifdef UNICODE + result = test_unicode_files(test_num); +#else + result = test_ansi_files(test_num); +#endif + } + printf("finished\n"); + return result; +} + diff --git a/reactos/apps/testsets/msvcrt/fileio/main.h b/reactos/apps/testsets/msvcrt/fileio/main.h new file mode 100644 index 00000000000..ee20fbe151d --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/main.h @@ -0,0 +1,42 @@ +/* + * ReactOS test program - + * + * main.h + * + * Copyright (C) 2002 Robert Dickenson + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +int app_main(int argc, char* argv[]); +DWORD GetInput(char* Buffer, int buflen); + +int test_ansi_files(int test_num); +int test_unicode_files(int test_num); + + +#ifdef __cplusplus +}; +#endif + +#endif // __MAIN_H__ diff --git a/reactos/apps/testsets/msvcrt/fileio/makefile b/reactos/apps/testsets/msvcrt/fileio/makefile new file mode 100644 index 00000000000..40ed64b2aac --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/makefile @@ -0,0 +1,24 @@ +# +# $Id: makefile,v 1.0 + +PATH_TO_TOP = ../../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = fileio + +TARGET_CFLAGS = -DDBG + +TARGET_SDKLIBS = ntdll.a kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o wfileio.o main.o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/reactos/apps/testsets/msvcrt/fileio/wfileio.c b/reactos/apps/testsets/msvcrt/fileio/wfileio.c new file mode 100644 index 00000000000..3b7ca4a9d56 --- /dev/null +++ b/reactos/apps/testsets/msvcrt/fileio/wfileio.c @@ -0,0 +1,31 @@ +/* + * ReactOS test program - + * + * wfileio.c + * + * Copyright (C) 2002 Robert Dickenson + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define UNICODE +#define _UNICODE +#include "_tfileio.c" + + +int test_unicode_files(int test_num) +{ + return test_files(test_num, "UNICODE"); +}