/***************************************************************************/ /* */ /* */ /* Read from Stdin, Write to Stdout, using specified Blocksize */ /* Copyright (c) 1994-2012 by Hamilton Laboratories. All rights reserved. */ /* */ /* */ /***************************************************************************/ /* blksize.c: Accepts just one (optional) argument, the blocksize desired, in bytes. */ #include <windows.h> #include <stdlib.h> void main( int argc, char **argv ) { HANDLE Stdin = GetStdHandle(STD_INPUT_HANDLE), Stdout = GetStdHandle(STD_OUTPUT_HANDLE); char *buffer, *p; DWORD length, blocksize, remaining; SYSTEM_INFO sysinfo; /* First arg is blocksize. If missing, default to 512 bytes. */ blocksize = argc > 1 ? atoi(argv[1]) : 512; /* Allocate the buffer, ensuring that it's page-aligned so we won't have problems doing i/o to/from a device such as a tape or diskette. */ GetSystemInfo(&sysinfo); buffer = (char *)(((ULONG)malloc(blocksize + sysinfo.dwPageSize) + sysinfo.dwPageSize) & ~(sysinfo.dwPageSize - 1)); while (ReadFile(Stdin, buffer, blocksize, &length, NULL) && length) { if (remaining = blocksize - length) { /* Apparently reading from a pipe or the console and getting less than a full blocksize number of characters. Keep reading until we have enough to for a whole blocksize to output (or until End-Of-File). */ p = buffer + length; while (remaining && ReadFile(Stdin, p, remaining, &length, NULL) && length) { remaining -= length; p += length; } length = blocksize - remaining; } WriteFile(Stdout, buffer, length, &length, NULL); } CloseHandle(Stdin); CloseHandle(Stdout); ExitProcess(0); } |