mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
397 lines
11 KiB
397 lines
11 KiB
#include <stdio.h>
|
|
#include <malloc.h>
|
|
#include <string.h>
|
|
#include <memory.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include "list.h"
|
|
|
|
|
|
static char iniFlag = 0; /* If ini found, but not list change to 1 */
|
|
/* Will print a warning upon exit */
|
|
|
|
void PASCAL init_list ()
|
|
{
|
|
// unsigned rc;
|
|
// USHORT i;
|
|
LPVOID lpParameter = NULL;
|
|
DWORD dwThreadId;
|
|
|
|
// char c;
|
|
|
|
|
|
/*
|
|
* Init Misc
|
|
*/
|
|
DosSemSet (vSemSync);
|
|
DosSemSet (vSemMoreData);
|
|
|
|
|
|
|
|
/*
|
|
* Init screen parameters
|
|
*/
|
|
|
|
GetConsoleScreenBufferInfo( vStdOut,
|
|
&vConsoleOrigScrBufferInfo );
|
|
|
|
vConsoleOrigScrBufferInfo.dwSize.X=
|
|
vConsoleOrigScrBufferInfo.srWindow.Right-
|
|
vConsoleOrigScrBufferInfo.srWindow.Left + 1;
|
|
vConsoleOrigScrBufferInfo.dwSize.Y=
|
|
vConsoleOrigScrBufferInfo.srWindow.Bottom-
|
|
vConsoleOrigScrBufferInfo.srWindow.Top + 1;
|
|
vConsoleOrigScrBufferInfo.dwMaximumWindowSize=
|
|
vConsoleOrigScrBufferInfo.dwSize;
|
|
|
|
|
|
|
|
|
|
set_mode( 0, 0, 0 );
|
|
|
|
|
|
|
|
/*
|
|
* Start reading the first file. Displaying can't start until
|
|
* the ini file (if one is found) is processed.
|
|
*/
|
|
vReaderFlag = F_NEXT;
|
|
|
|
/*
|
|
* Init priority setting for display & reader thread.
|
|
*
|
|
* THREAD_PRIORITY_NORMAL = reader thread normal pri.
|
|
* THREAD_PRIORITY_ABOVE_NORMAL = display thread pri
|
|
* THREAD_PRIORITY_HIGHEST = reader thread in boosted pri.
|
|
*/
|
|
vReadPriNormal = THREAD_PRIORITY_NORMAL;
|
|
SetThreadPriority( GetCurrentThread(),
|
|
THREAD_PRIORITY_ABOVE_NORMAL );
|
|
vReadPriBoost = THREAD_PRIORITY_NORMAL;
|
|
|
|
|
|
/*
|
|
* Start reader thread
|
|
*/
|
|
CreateThread( NULL,
|
|
STACKSIZE,
|
|
(LPTHREAD_START_ROUTINE) ReaderThread,
|
|
NULL, // lpParameter,
|
|
0, // THREAD_ALL_ACCESS,
|
|
&dwThreadId );
|
|
|
|
|
|
/*
|
|
* Read INI information.
|
|
*/
|
|
vSetWidth = vWidth; /* Set defaults */
|
|
vSetLines = vLines + 2;
|
|
|
|
FindIni ();
|
|
if (vSetBlks < vMaxBlks)
|
|
vSetBlks = DEFBLKS;
|
|
|
|
vSetThres = (long) (vSetBlks/2-2) * BLOCKSIZE;
|
|
|
|
/*
|
|
* Must wait for reader thread to at least read in the
|
|
* first block. Also, if the file was not found and only
|
|
* one file was specifed the reader thread will display
|
|
* an error and exit... if we don't wait we could have
|
|
* changed the screen before this was possible.
|
|
*/
|
|
DosSemRequest (vSemMoreData, WAITFOREVER);
|
|
|
|
|
|
/*
|
|
* Now that ini file has been read. Set parameters.
|
|
* Pause reader thread while adjusting buffer size.
|
|
*/
|
|
SyncReader ();
|
|
|
|
vMaxBlks = vSetBlks;
|
|
vThreshold = vSetThres;
|
|
vReaderFlag = F_CHECK;
|
|
DosSemClear (vSemReader);
|
|
|
|
|
|
/*
|
|
* Now set to user's default video mode
|
|
*/
|
|
|
|
set_mode (vSetLines, vSetWidth, 0);
|
|
|
|
|
|
SetConsoleActiveScreenBuffer( vhConsoleOutput );
|
|
|
|
//
|
|
// davegi/jaimes - 08/26/91
|
|
//
|
|
// Make List think it has one less line than the screen buffer.
|
|
// This 'solves' the scrolling problem when Enter is pressed for a
|
|
// command.
|
|
// This is necessary because list uses the ReadFile() API to read
|
|
// a string. ReadFile() echoes the carriage return and line feed
|
|
// to the screen, and as the cursor is in the last line, the screen
|
|
// is scolled one line up. By leaving one empty line after the
|
|
// command line, this problem is eliminated.
|
|
//
|
|
|
|
// T-HeathH 06/23/94
|
|
//
|
|
// Moved the hack to set_mode, where it will be used whenever that
|
|
// code thinks it has resized the display.
|
|
//
|
|
// That change subsumed this onld one.
|
|
//
|
|
// vLines--;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
/***
|
|
* Warning: Reader thread must not be running when this routine
|
|
* is called.
|
|
*/
|
|
void PASCAL AddFileToList (char *fname)
|
|
{
|
|
// int rc;
|
|
unsigned rbLen;
|
|
HANDLE hDir;
|
|
// USHORT noE;
|
|
//
|
|
// NT - jaimes - 01/30/91
|
|
//
|
|
// struct {
|
|
// FILEFINDBUF rb;
|
|
// char overflow[256]; /* HACK! OS/2 1.2? longer */
|
|
// } x;
|
|
struct {
|
|
WIN32_FIND_DATA rb;
|
|
char overflow[256]; /* HACK! OS/2 1.2? longer */
|
|
} x;
|
|
struct Flist FAR *pOrig, FAR *pSort;
|
|
char *pTmp, FAR *fpTmp;
|
|
char s[256]; /* Max filename length */
|
|
BOOL fNextFile;
|
|
|
|
|
|
rbLen = sizeof (x); /* rb+tmp. For large fnames */
|
|
pOrig = NULL;
|
|
if (strpbrk (fname, "*?")) { /* Wildcard in filename? */
|
|
/* Yes, explode it */
|
|
hDir = FindFirstFile (fname, &x.rb);
|
|
fNextFile = ( hDir == INVALID_HANDLE_VALUE )? FALSE : TRUE;
|
|
pTmp = strrchr (fname, '\\');
|
|
if (pTmp == NULL) pTmp = strrchr (fname, ':');
|
|
if (pTmp) pTmp[1] = 0;
|
|
|
|
while (fNextFile) {
|
|
if( ( x.rb.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) {
|
|
//
|
|
// The file found is not a directory
|
|
//
|
|
if (pTmp) {
|
|
strcpy (s, fname); /* Was there a releative path? */
|
|
strcat (s, x.rb.cFileName); /* Yes, it's needed for Open */
|
|
AddOneName (s);
|
|
} else {
|
|
AddOneName (x.rb.cFileName);
|
|
}
|
|
}
|
|
fNextFile = FindNextFile (hDir, &x.rb);
|
|
if (pOrig == NULL)
|
|
pOrig = vpFlCur;
|
|
}
|
|
}
|
|
|
|
if (!pOrig) /* Did not explode, then add */
|
|
AddOneName (fname); /* original name to list */
|
|
else { /* Yes, then sort the new fnames*/
|
|
while (pOrig != vpFlCur) {
|
|
pSort = pOrig->next;
|
|
for (; ;) {
|
|
if (strcmp (pOrig->fname, pSort->fname) > 0) {
|
|
/*
|
|
* Can simply switch names at this time, since no
|
|
* other information has been stored into the new
|
|
* file structs
|
|
*/
|
|
fpTmp = pOrig->fname;
|
|
pOrig->fname = pSort->fname;
|
|
pSort->fname = fpTmp;
|
|
fpTmp = pOrig->rootname;
|
|
pOrig->rootname = pSort->rootname;
|
|
pSort->rootname = fpTmp;
|
|
}
|
|
if (pSort == vpFlCur)
|
|
break;
|
|
pSort = pSort->next;
|
|
}
|
|
pOrig = pOrig->next;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void PASCAL AddOneName (fname)
|
|
char *fname;
|
|
{
|
|
struct Flist FAR *npt;
|
|
char *pt;
|
|
char s[30];
|
|
int i;
|
|
|
|
// NT - jaimes - 01/27/90
|
|
// Was originally using Mem_Alloc and strdupf
|
|
//
|
|
// npt = (struct Flist FAR *) Mem_Alloc (sizeof (struct Flist));
|
|
// npt->fname = strdupf (fname);
|
|
npt = (struct Flist FAR *) malloc (sizeof (struct Flist));
|
|
npt->fname = _strdup (fname);
|
|
|
|
pt = strrchr (fname, '\\');
|
|
pt = pt == NULL ? fname : pt+1;
|
|
i = strlen (pt);
|
|
if (i > 20) {
|
|
memcpy (s, pt, 17);
|
|
strcpy (s+17, "...");
|
|
//
|
|
// NT - jaimes - 01/27/91
|
|
// strdupf removed from lmisc.c
|
|
//
|
|
// npt->rootname = strdupf (s);
|
|
// } else
|
|
// npt->rootname = strdupf (pt);
|
|
npt->rootname = _strdup (s);
|
|
} else
|
|
npt->rootname = _strdup (pt);
|
|
|
|
// npt->FileTime.DoubleSeconds = -1; /* Cause info to be invalid */
|
|
// npt->FileTime.Minutes = -1; /* Cause info to be invalid */
|
|
// npt->FileTime.Hours = -1; /* Cause info to be invalid */
|
|
npt->FileTime.dwLowDateTime = (unsigned)-1; /* Cause info to be invalid */
|
|
npt->FileTime.dwHighDateTime = (unsigned)-1; /* Cause info to be invalid */
|
|
npt->HighTop = -1;
|
|
npt->SlimeTOF = 0L;
|
|
npt->Wrap = 0;
|
|
npt->prev = vpFlCur;
|
|
npt->next = NULL;
|
|
//
|
|
// NT - jaimes - 01/28/91
|
|
// replaced memsetf and changed prgLineTable
|
|
//
|
|
// memsetf (npt->prgLineTable, 0, sizeof (long FAR *) * MAXTPAGE);
|
|
// memset (&(npt->prgLineTable[0]), 0, sizeof (PAGE_DESCRIPTOR) * MAXTPAGE);
|
|
memset (npt->prgLineTable, 0, sizeof (long FAR *) * MAXTPAGE);
|
|
|
|
if (vpFlCur) {
|
|
if (vpFlCur->next) {
|
|
npt->next = vpFlCur->next;
|
|
vpFlCur->next->prev = npt;
|
|
}
|
|
vpFlCur->next = npt;
|
|
}
|
|
vpFlCur = npt;
|
|
}
|
|
|
|
|
|
void PASCAL FindIni ()
|
|
{
|
|
static char Delim[] = " :=;\t\r\n";
|
|
FILE *fp;
|
|
char *env, *verb, *value;
|
|
char s [200];
|
|
long l;
|
|
|
|
|
|
env = getenv ("INIT");
|
|
if (env == NULL)
|
|
return;
|
|
|
|
strcpy (s, env);
|
|
strcat (s, "\\TOOLS.INI");
|
|
fp = fopen (s, "r");
|
|
if (fp == NULL)
|
|
return;
|
|
|
|
iniFlag = 1;
|
|
while (fgets (s, 200, fp) != NULL) {
|
|
if ((s[0] != '[')||(s[5] != ']'))
|
|
continue;
|
|
_strupr (s);
|
|
if (strstr (s, "LIST") == NULL)
|
|
continue;
|
|
/*
|
|
* ini file found w/ "list" keyword. Now read it.
|
|
*/
|
|
iniFlag = 0;
|
|
while (fgets (s, 200, fp) != NULL) {
|
|
if (s[0] == '[')
|
|
break;
|
|
if (s[0] == ';')
|
|
continue;
|
|
verb = strtok (s, Delim);
|
|
value = strtok (NULL, Delim);
|
|
if (verb == NULL)
|
|
continue;
|
|
if (value == NULL)
|
|
value = "";
|
|
|
|
_strupr (verb);
|
|
if (strcmp (verb, "TAB") == 0) vDisTab = (Uchar)atoi(value);
|
|
else if (strcmp (verb, "WIDTH") == 0) vSetWidth = atoi(value);
|
|
else if (strcmp (verb, "HEIGHT") == 0) vSetLines = atoi(value);
|
|
else if (strcmp (verb, "LCOLOR") == 0) vAttrList = (WORD)xtoi(value);
|
|
else if (strcmp (verb, "TCOLOR") == 0) vAttrTitle= (WORD)xtoi(value);
|
|
else if (strcmp (verb, "CCOLOR") == 0) vAttrCmd = (WORD)xtoi(value);
|
|
else if (strcmp (verb, "HCOLOR") == 0) vAttrHigh = (WORD)xtoi(value);
|
|
else if (strcmp (verb, "KCOLOR") == 0) vAttrKey = (WORD)xtoi(value);
|
|
else if (strcmp (verb, "BCOLOR") == 0) vAttrBar = (WORD)xtoi(value);
|
|
else if (strcmp (verb, "BUFFERS") == 0) {
|
|
l = atoi (value) * 1024L / ((long) BLOCKSIZE);
|
|
vSetBlks = (int)l;
|
|
}
|
|
else if (strcmp (verb, "HACK") == 0) vIniFlag |= I_SLIME;
|
|
else if (strcmp (verb, "NOBEEP") == 0) vIniFlag |= I_NOBEEP;
|
|
}
|
|
break;
|
|
}
|
|
fclose (fp);
|
|
}
|
|
|
|
|
|
|
|
/*** xtoi - Hex to int
|
|
*
|
|
* Entry:
|
|
* pt - pointer to hex number
|
|
*
|
|
* Return:
|
|
* value of hex number
|
|
*
|
|
*/
|
|
unsigned PASCAL xtoi (char *pt)
|
|
{
|
|
unsigned u;
|
|
char c;
|
|
|
|
u = 0;
|
|
while (c = *(pt++)) {
|
|
if (c >= 'a' && c <= 'f')
|
|
c -= 'a' - 'A';
|
|
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))
|
|
u = u << 4 | c - (c >= 'A' ? 'A'-10 : '0');
|
|
}
|
|
return (u);
|
|
}
|
|
|
|
|
|
|
|
|
|
void PASCAL CleanUp (void)
|
|
{
|
|
SetConsoleActiveScreenBuffer( vStdOut );
|
|
}
|