diff --git a/reactos/base/applications/cmdutils/more/more.c b/reactos/base/applications/cmdutils/more/more.c index 6024c8d4411..7ce956d28b3 100644 --- a/reactos/base/applications/cmdutils/more/more.c +++ b/reactos/base/applications/cmdutils/more/more.c @@ -1,139 +1,169 @@ -#include -#include -#include -#include +/* $Id$ + * + * MORE.C - external command. + * + * clone from 4nt more command + * + * 26 Sep 1999 - Paolo Pantaleo + * started + * Oct 2003 - Timothy Schepens + * use window size instead of buffer size. + */ -#define rdtscll(val) __asm__ __volatile__ ("rdtsc" : "=A" (val)) +#include +#include +#include -const int SELECTMODE = 14; -const int BIGDATA = 10000; // Relying on int = long -const int MHZ = 2160; -int *data; -void SelectionSort(int data[], int left, int right) { - int i, j; - for(i = left; i < right; i++) { - int min = i; - for(j=i+1; j <= right; j++) - if(data[j] < data[min]) min = j; - int temp = data[min]; - data[min] = data[i]; - data[i] = temp; - } +DWORD len; +LPTSTR msg = _T("--- continue ---"); + + +/*handle for file and console*/ +HANDLE hStdIn; +HANDLE hStdOut; +HANDLE hStdErr; +HANDLE hKeyboard; + + +static VOID +GetScreenSize (PSHORT maxx, PSHORT maxy) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hStdOut, &csbi); + *maxx = (csbi.srWindow.Right - csbi.srWindow.Left) + 1; + *maxy = (csbi.srWindow.Bottom - csbi.srWindow.Top) - 4; + } -int Partition( int d[], int left, int right) -{ - int val =d[left]; - int lm = left-1; - int rm = right+1; - for(;;) { - do - rm--; - while (d[rm] > val); - - do - lm++; - while( d[lm] < val); - if(lm < rm) { - int tempr = d[rm]; - d[rm] = d[lm]; - d[lm] = tempr; +static +VOID ConOutPuts (LPTSTR szText) +{ + DWORD dwWritten; + + WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), szText, _tcslen(szText), &dwWritten, NULL); + WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), "\n", 1, &dwWritten, NULL); +} + + +static VOID +ConInKey (VOID) +{ + INPUT_RECORD ir; + DWORD dwRead; + + do + { + ReadConsoleInput (hKeyboard, &ir, 1, &dwRead); + if ((ir.EventType == KEY_EVENT) && + (ir.Event.KeyEvent.bKeyDown == TRUE)) + return; + } + while (TRUE); +} + + +static VOID +WaitForKey (VOID) +{ + DWORD dwWritten; + + WriteFile (hStdErr,msg , len, &dwWritten, NULL); + + ConInKey(); + + WriteFile (hStdErr, _T("\n"), 1, &dwWritten, NULL); + +// FlushConsoleInputBuffer (hConsoleIn); +} + + +//INT CommandMore (LPTSTR cmd, LPTSTR param) +int main (int argc, char **argv) +{ + SHORT maxx,maxy; + SHORT line_count=0,ch_count=0; + DWORD i, last; + HANDLE hFile = INVALID_HANDLE_VALUE; + TCHAR szFullPath[MAX_PATH]; + + /*reading/writing buffer*/ + TCHAR *buff; + + /*bytes written by WriteFile and ReadFile*/ + DWORD dwRead,dwWritten; + + /*ReadFile() return value*/ + BOOL bRet; + + len = _tcslen (msg); + hStdIn = GetStdHandle(STD_INPUT_HANDLE); + hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + hStdErr = GetStdHandle(STD_ERROR_HANDLE); + + if (argc > 1 && _tcsncmp (argv[1], _T("/?"), 2) == 0) + { + ConOutPuts(_T("Help text still missing!!")); + return 0; + } + + hKeyboard = CreateFile (_T("CONIN$"), GENERIC_READ, + 0,NULL,OPEN_ALWAYS,0,0); + + GetScreenSize(&maxx,&maxy); + + buff=malloc(4096); + + FlushConsoleInputBuffer (hKeyboard); + + if(argc > 1) + { + GetFullPathName(argv[1], MAX_PATH, szFullPath, NULL); + hFile = CreateFile (szFullPath, GENERIC_READ, + 0,NULL,OPEN_ALWAYS,0,0); + } + + do + { + if(hFile != INVALID_HANDLE_VALUE) + { + bRet = ReadFile(hFile,buff,4096,&dwRead,NULL); + } + else + { + bRet = ReadFile(hStdIn,buff,4096,&dwRead,NULL); + } + + for(last=i=0;i0 && bRet); - rdtscll(timeReadLoopStart); - - i = 0; - while (!feof(randfile)) { - fscanf(randfile,"%d",&thisInt); - if (feof(randfile)) { break; } - data[i] = thisInt; - sumUnsorted += thisInt; - //fprintf(stdout,"[%d] Read item: %d\n",i,thisInt); - i++; - if (i >= BIGDATA) { - break; - } - } - fclose(randfile); - dataSize = i; - - rdtscll(timeReadLoopEnd); - rdtscll(timeSortLoopStart); - - Quicksort(data, 0, dataSize-1); - - rdtscll(timeSortLoopEnd); - rdtscll(timeWriteLoopStart); - - int last = -1; - for(j = 0; j < dataSize; j++) { - if (data[j] < last) { - fprintf(stderr,"The data is not in order\n"); - fprintf(stderr,"Noticed the problem at j = %d\n",j); - fclose(sortfile); - return 1; - } else { - fprintf(sortfile,"%d\n",data[j]); - } - } - fclose(sortfile); - - rdtscll(timeWriteLoopEnd); - - rdtscll(timeEnd); - - fprintf(stdout,"Sorted %d items.\n",dataSize); - fprintf(stdout,"Open Files : %ldt.\n",(long)timeReadLoopStart - (long)timeStart); - fprintf(stdout,"Read Data : %ldt.\n",(long)timeReadLoopEnd - (long)timeReadLoopStart); - fprintf(stdout,"Sort Data : %ldt.\n",(long)timeSortLoopEnd - (long)timeSortLoopStart); - fprintf(stdout,"Write Data : %ldt.\n",(long)timeWriteLoopEnd - (long)timeWriteLoopStart); - fprintf(stdout,"Total Time : %ldt.\n",(long)timeEnd - (long)timeStart); + free (buff); + CloseHandle (hKeyboard); + CloseHandle (hFile); return 0; } + +/* EOF */