277 lines
5.8 KiB
C
277 lines
5.8 KiB
C
#include <stdio.h>
|
|
#include <malloc.h>
|
|
#include <windows.h>
|
|
#include "list.h"
|
|
|
|
|
|
void
|
|
UpdateHighLighted (
|
|
int dlen,
|
|
int end
|
|
)
|
|
{
|
|
int i;
|
|
long l;
|
|
|
|
ScrLock (1);
|
|
if (vHighLen + dlen == 0 && vHighLen) {
|
|
i = vAttrHigh;
|
|
vAttrHigh = vAttrList;
|
|
vHLBot = vHLTop;
|
|
UpdateHighNoLock ();
|
|
vAttrHigh = (WORD) i;
|
|
}
|
|
vHighLen += dlen;
|
|
UpdateHighNoLock ();
|
|
ScrUnLock ();
|
|
|
|
switch (end) {
|
|
case 1:
|
|
l = vHighTop + (vHighLen < 0 ? vHighLen : 0);
|
|
if (l < vTopLine) {
|
|
vTopLine = l;
|
|
SetUpdate (U_ALL);
|
|
}
|
|
break;
|
|
case 2:
|
|
l = vHighTop + (vHighLen > 0 ? vHighLen : 0);
|
|
if (l > vTopLine+vLines-1) {
|
|
vTopLine = l - vLines + 1;
|
|
SetUpdate (U_ALL);
|
|
}
|
|
break;
|
|
case 3:
|
|
l = vHighTop + vHighLen;
|
|
if (l < vTopLine) {
|
|
vTopLine = l;
|
|
SetUpdate (U_ALL);
|
|
} else if (l > vTopLine+vLines-1) {
|
|
vTopLine = l - vLines + 1;
|
|
SetUpdate (U_ALL);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
UpdateHighClear ()
|
|
{
|
|
int i;
|
|
|
|
ScrLock (1);
|
|
|
|
if (vHLTop)
|
|
for (i=vHLTop; i <= vHLBot; i++)
|
|
if (i >= 1 && i <= vLines)
|
|
setattr1 (i, (char) vAttrList);
|
|
|
|
vHLTop = vHLBot = 0;
|
|
vHighTop = -1L;
|
|
|
|
ScrUnLock ();
|
|
}
|
|
|
|
|
|
void
|
|
MarkSpot ()
|
|
{
|
|
UpdateHighClear ();
|
|
vHighTop = vTopLine + vLines / 2;
|
|
if (vHighTop >= vLastLine)
|
|
vHighTop = vLastLine - 1;
|
|
vHighLen = 0;
|
|
UpdateHighLighted (0, 0);
|
|
}
|
|
|
|
|
|
void
|
|
UpdateHighNoLock ()
|
|
{
|
|
int TopLine, BotLine;
|
|
int i;
|
|
|
|
if (vHighLen == 0) {
|
|
if (vHLTop)
|
|
setattr1 (vHLTop, (char) vAttrList);
|
|
if (vHighTop < vTopLine || vHighTop > vTopLine+vLines-1) {
|
|
vHLTop = vHLBot = 0;
|
|
return;
|
|
}
|
|
vHLTop = vHLBot = (char)(vHighTop - vTopLine + 1);
|
|
setattr1 (vHLTop, (char)vAttrHigh);
|
|
return;
|
|
}
|
|
|
|
|
|
if (vHighLen < 0) {
|
|
TopLine = (int)(vHighTop + vHighLen - vTopLine);
|
|
BotLine = (int)(vHighTop - vTopLine);
|
|
} else {
|
|
TopLine = (int)(vHighTop - vTopLine);
|
|
BotLine = (int)(vHighTop + vHighLen - vTopLine);
|
|
}
|
|
|
|
TopLine ++;
|
|
BotLine ++;
|
|
|
|
for (i=1; i <= vLines; i++) {
|
|
if (i >= TopLine && i <= BotLine) {
|
|
if (i < vHLTop || i > vHLBot)
|
|
setattr1 (i, (char)vAttrHigh);
|
|
} else
|
|
if (i >= vHLTop && i <= vHLBot)
|
|
setattr1 (i, (char)vAttrList);
|
|
}
|
|
|
|
vHLTop = (char)(TopLine < 1 ? 1 : TopLine);
|
|
vHLBot = (char)(BotLine > vLines ? (int)vLines : BotLine);
|
|
}
|
|
|
|
|
|
void
|
|
FileHighLighted ()
|
|
{
|
|
char *data;
|
|
char s[50];
|
|
char c, lastc;
|
|
FILE *fp;
|
|
|
|
long hTopLine;
|
|
long CurLine, BotLine;
|
|
long LastOffset, CurOffset;
|
|
|
|
|
|
if (vHighTop < 0L) // || vHighLen == 0
|
|
return;
|
|
|
|
GetInput ("File As> ", s, 40);
|
|
if (s[0] == 0) {
|
|
SetUpdate (U_HEAD);
|
|
return;
|
|
}
|
|
fp = fopen( s, "a+b" );
|
|
ckerr (fp == NULL, "Could not create or open file");
|
|
|
|
DisLn (0, (Uchar)vLines+1, "Saving...");
|
|
|
|
if (vHighLen < 0) {
|
|
CurLine = vHighTop + vHighLen;
|
|
BotLine = vHighTop;
|
|
} else {
|
|
CurLine = vHighTop;
|
|
BotLine = vHighTop + vHighLen;
|
|
}
|
|
|
|
hTopLine = vTopLine;
|
|
vTopLine = CurLine;
|
|
QuickRestore (); /* Jump to starting line */
|
|
while (InfoReady () == 0) { /* Set extern values */
|
|
ResetEvent (vSemMoreData);
|
|
SetEvent (vSemReader);
|
|
WaitForSingleObject(vSemMoreData, WAITFOREVER);
|
|
ResetEvent(vSemMoreData);
|
|
}
|
|
|
|
lastc = 0;
|
|
BotLine ++;
|
|
CurOffset = vpBlockTop->offset + vOffTop;
|
|
LastOffset = vprgLineTable[BotLine/PLINES][BotLine%PLINES];
|
|
|
|
while (CurOffset++ < LastOffset) {
|
|
data = vpBlockTop->Data;
|
|
data += vOffTop;
|
|
c = *data;
|
|
if (c == '\n' || c == '\r') {
|
|
if ((c == '\n' && lastc == '\r') || (c == '\r' && lastc == '\n'))
|
|
lastc = 0;
|
|
else {
|
|
lastc = c;
|
|
fputc ('\r', fp);
|
|
fputc ('\n', fp);
|
|
}
|
|
} else fputc (lastc=c, fp);
|
|
|
|
vOffTop++;
|
|
if (vOffTop >= BLOCKSIZE) {
|
|
ckdebug (vpBlockTop->flag == F_EOF, "internal error");
|
|
while (vpBlockTop->next == NULL) {
|
|
vpCur = vpBlockTop;
|
|
vReaderFlag = F_DOWN;
|
|
SetEvent (vSemReader);
|
|
WaitForSingleObject(vSemMoreData, WAITFOREVER);
|
|
ResetEvent(vSemMoreData);
|
|
}
|
|
vOffTop = 0;
|
|
vpBlockTop = vpBlockTop->next;
|
|
}
|
|
}
|
|
|
|
fclose (fp);
|
|
vTopLine = hTopLine;
|
|
QuickRestore ();
|
|
SetUpdate (U_ALL);
|
|
}
|
|
|
|
|
|
void
|
|
HUp ()
|
|
{
|
|
if (vHighTop < 0L)
|
|
MarkSpot ();
|
|
|
|
if (vHighTop > 0L && vHighTop+vHighLen > 0L)
|
|
UpdateHighLighted (-1, 3);
|
|
}
|
|
|
|
void
|
|
HDn ()
|
|
{
|
|
if (vHighTop < 0L)
|
|
MarkSpot ();
|
|
|
|
if (vHighTop+vHighLen < vLastLine)
|
|
UpdateHighLighted (+1, 3);
|
|
}
|
|
|
|
|
|
void
|
|
HPgDn ()
|
|
{
|
|
if (vHighTop < 0L)
|
|
MarkSpot ();
|
|
|
|
if (vHighTop+vHighLen+vLines < vLastLine)
|
|
UpdateHighLighted (+vLines, 3);
|
|
}
|
|
|
|
void
|
|
HPgUp ()
|
|
{
|
|
if (vHighTop < 0L)
|
|
MarkSpot ();
|
|
|
|
if (vHighTop > 0L && vHighTop+vHighLen-vLines > 0L)
|
|
UpdateHighLighted (-vLines, 3);
|
|
}
|
|
|
|
|
|
void
|
|
HSDn () /* Highlight Slide dn 1 */
|
|
{
|
|
if (vHighTop < vLastLine && vHighTop >= 0L &&
|
|
vHighTop+vHighLen < vLastLine) {
|
|
vHighTop++;
|
|
UpdateHighLighted (0, 2);
|
|
}
|
|
}
|
|
|
|
void
|
|
HSUp() /* Highlight Slike up 1 */
|
|
{
|
|
if (vHighTop > 0L && vHighTop+vHighLen > 0L) {
|
|
vHighTop--;
|
|
UpdateHighLighted (0, 1);
|
|
}
|
|
}
|