577 lines
14 KiB
C
577 lines
14 KiB
C
/*****************************************************************************
|
|
*
|
|
* $Id$
|
|
* Purpose ...............: Message line editor.
|
|
*
|
|
*****************************************************************************
|
|
* Copyright (C) 1997-2005
|
|
*
|
|
* Michiel Broek FIDO: 2:280/2802
|
|
* Beekmansbos 10
|
|
* 1971 BV IJmuiden
|
|
* the Netherlands
|
|
*
|
|
* This file is part of MBSE BBS.
|
|
*
|
|
* This BBS 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, or (at your option) any
|
|
* later version.
|
|
*
|
|
* MBSE BBS 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 MBSE BBS; see the file COPYING. If not, write to the Free
|
|
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
*****************************************************************************/
|
|
|
|
#include "../config.h"
|
|
#include "../lib/mbselib.h"
|
|
#include "../lib/mbse.h"
|
|
#include "../lib/users.h"
|
|
#include "mail.h"
|
|
#include "input.h"
|
|
#include "language.h"
|
|
#include "timeout.h"
|
|
#include "lineedit.h"
|
|
#include "term.h"
|
|
#include "ttyio.h"
|
|
|
|
|
|
extern int Line;
|
|
extern char *Message[];
|
|
|
|
|
|
/*
|
|
* Internal prototypes
|
|
*/
|
|
void Line_Edit_Append(void); /* Append lines */
|
|
void Line_Edit_Delete(void); /* Delete lines */
|
|
void Line_Edit_Edit(void); /* Edit lines */
|
|
void Line_Edit_Insert(void); /* Insert lines */
|
|
void Line_Edit_Replace(void); /* Replace lines */
|
|
void Line_Edit_Text(void); /* Edit (replace) text in line */
|
|
void Line_Edit_Center(void); /* Center a line */
|
|
|
|
|
|
|
|
|
|
void Line_Edit_Append()
|
|
{
|
|
char msg[41];
|
|
|
|
if ((Line - 1) == TEXTBUFSIZE) {
|
|
Enter(1);
|
|
/* Maximum message length exceeded */
|
|
pout(CYAN, BLACK, (char *) Language(166));
|
|
Enter(1);
|
|
return;
|
|
}
|
|
|
|
while (TRUE) {
|
|
snprintf(msg, 41, "%-2d : ", Line);
|
|
pout(LIGHTGREEN, BLACK, msg);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
alarm_on();
|
|
GetstrP(Message[Line], 72, 0);
|
|
|
|
if ((strcmp(Message[Line], "")) == 0)
|
|
return;
|
|
|
|
Line++;
|
|
if ((Line - 1) == TEXTBUFSIZE) {
|
|
Enter(1);
|
|
/* Maximum message length exceeded */
|
|
pout(LIGHTRED, BLACK, (char *) Language(166));
|
|
Enter(1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Delete()
|
|
{
|
|
int i, start, end = 0, total, Loop;
|
|
char temp[81];
|
|
|
|
while (TRUE) {
|
|
Enter(2);
|
|
/* Delete starting at line */
|
|
snprintf(temp, 81, "%s#(1 - %d): ", (char *) Language(176), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0) {
|
|
/* Aborted. */
|
|
pout(WHITE, BLACK, (char *) Language(177));
|
|
Enter(1);
|
|
return;
|
|
}
|
|
|
|
start = atoi(temp);
|
|
if (start > (Line - 1)) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d)", (char *) Language(178), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
while (TRUE) {
|
|
/* Delete ending at line */
|
|
snprintf(temp, 81, "%s# (1 - %d): ", (char *) Language(179), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0) {
|
|
/* Aborted. */
|
|
pout(WHITE, BLACK, (char *) Language(176));
|
|
Enter(1);
|
|
return;
|
|
}
|
|
|
|
end = atoi(temp);
|
|
|
|
if(end > (Line - 1)) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d)", (char *) Language(179), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
Enter(2);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
/* Get total by minusing the end line from the start line */
|
|
/* and + 1 will give you total lines between start and end */
|
|
total = (end - start) + 1;
|
|
|
|
/* Define loop by minusing total lines from end which will */
|
|
/* do a loop for only the amount of lines left after the */
|
|
/* end line */
|
|
Loop = Line - end++;
|
|
|
|
/* Minus the total amount of deleted lines from the current */
|
|
/* amount of lines to keep track of how many lines you are */
|
|
/* working with */
|
|
Line -= total;
|
|
|
|
/* Do loop to copy the current message over the deleted lines */
|
|
|
|
for (i = 0; i < Loop; i++)
|
|
strcpy(*(Message + start++), *(Message + end++));
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Edit()
|
|
{
|
|
int j, edit;
|
|
char temp[81];
|
|
|
|
while (TRUE) {
|
|
while (TRUE) {
|
|
Enter(1);
|
|
/* Enter line # to edit */
|
|
snprintf(temp, 81, "%s(1 - %d): ", (char *) Language(181), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0)
|
|
return;
|
|
|
|
edit = atoi(temp);
|
|
|
|
if (edit > Line) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d) ", (char *) Language(178), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
Enter(1);
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[edit]);
|
|
j = strlen(Message[edit]);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
alarm_on();
|
|
GetstrP(Message[edit], 80, j);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Insert()
|
|
{
|
|
int i, j, start, end = 0, total;
|
|
char temp[81];
|
|
|
|
if ((Line - 1) == TEXTBUFSIZE) {
|
|
Enter(1);
|
|
/* Maximum message length exceeded */
|
|
pout(CYAN, BLACK, (char *) Language(166));
|
|
Enter(1);
|
|
return;
|
|
}
|
|
|
|
while (TRUE) {
|
|
Enter(2);
|
|
/* Enter line # to insert text before */
|
|
snprintf(temp, 81, "%s(1 - %d): ", (char *) Language(183), (Line - 1));
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0) {
|
|
/* Aborted. */
|
|
pout(WHITE, BLACK, (char *) Language(177));
|
|
return;
|
|
}
|
|
|
|
start = atoi(temp);
|
|
|
|
if (start > (Line - 1)) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d)", (char *) Language(178), (Line - 1));
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
Enter(1);
|
|
j = start;
|
|
snprintf(temp, 81, "%-2d : ", start);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
GetstrC(temp, 80);
|
|
|
|
if ((strcmp(temp, "")) == 0)
|
|
return;
|
|
|
|
total = Line - start;
|
|
end = Line;
|
|
Line++;
|
|
start = Line;
|
|
|
|
for (i = 0; i < total + 1; i++) {
|
|
strcpy(Message[start], Message[end]);
|
|
start--;
|
|
end--;
|
|
}
|
|
|
|
strcpy(Message[j], temp);
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Replace()
|
|
{
|
|
int edit;
|
|
char temp[81];
|
|
|
|
while (TRUE) {
|
|
while (TRUE) {
|
|
Enter(2);
|
|
/* Enter line # to replace */
|
|
snprintf(temp, 81, "%s(1 - %d): ", (char *) Language(185), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0)
|
|
return;
|
|
|
|
edit = atoi(temp);
|
|
|
|
if (edit > Line) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d) ", (char *) Language(178), (Line - 1));
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
Enter(1);
|
|
/* Line reads: */
|
|
pout(WHITE, BLACK, (char *) Language(186));
|
|
Enter(1);
|
|
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[edit]);
|
|
Enter(2);
|
|
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0) {
|
|
Enter(1);
|
|
/* Unchanged. */
|
|
pout(WHITE, BLACK, (char *) Language(187));
|
|
Enter(1);
|
|
} else
|
|
strcpy(Message[edit], temp);
|
|
|
|
Enter(1);
|
|
/* Line now reads: */
|
|
pout(WHITE, BLACK, (char *) Language(188));
|
|
Enter(1);
|
|
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[edit]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Text()
|
|
{
|
|
int edit;
|
|
char temp[81], temp1[81];
|
|
|
|
while (TRUE) {
|
|
while (TRUE) {
|
|
Enter(2);
|
|
/* Enter line # to edit */
|
|
snprintf(temp, 81, "%s(1 - %d): ", (char *) Language(194), (Line - 1));
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0)
|
|
return;
|
|
|
|
edit = atoi(temp);
|
|
|
|
if (edit > Line) {
|
|
Enter(1);
|
|
/* Please enter a number in the range of */
|
|
snprintf(temp, 81, "%s(1 - %d) ", (char *) Language(178), (Line - 1) );
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
} else
|
|
break;
|
|
}
|
|
|
|
Enter(1);
|
|
/* Line reads: */
|
|
pout(WHITE, BLACK, (char *) Language(186));
|
|
Enter(1);
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[edit]);
|
|
Enter(2);
|
|
|
|
/* Text to replace: */
|
|
pout(LIGHTGREEN, BLACK, (char *) Language(195));
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp, 80);
|
|
/* Replacement text: */
|
|
pout(LIGHTGREEN, BLACK, (char *) Language(196));
|
|
colour(CFG.InputColourF, CFG.InputColourB);
|
|
GetstrC(temp1, 80);
|
|
|
|
strreplace(Message[edit], temp, temp1);
|
|
|
|
Enter(1);
|
|
/* Line now reads: */
|
|
pout(WHITE, BLACK, (char *) Language(197));
|
|
Enter(1);
|
|
snprintf(temp, 81, "%d : ", edit);
|
|
pout(LIGHTGREEN, BLACK, temp);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[edit]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Line_Edit_Center()
|
|
{
|
|
int i, j, z, center, maxlen = 78;
|
|
char *CEnter, temp[81];
|
|
|
|
Enter(2);
|
|
/* Enter line # to center */
|
|
snprintf(temp, 81, "%s(1 - %d): ", (char *) Language(203), (Line - 1));
|
|
pout(WHITE, BLACK, temp);
|
|
GetstrC(temp, 80);
|
|
if ((strcmp(temp, "")) == 0)
|
|
return;
|
|
|
|
CEnter = calloc(81, sizeof(char));
|
|
center = atoi(temp);
|
|
j = strlen(Message[center]);
|
|
if (j >= maxlen) {
|
|
Enter(1);
|
|
/* Line is maximum length and cannot be centered */
|
|
pout(LIGHTGREEN, BLACK, (char *) Language(204));
|
|
Enter(1);
|
|
} else {
|
|
z = 35 - (j / 2);
|
|
|
|
for (i = 0; i < z; i++)
|
|
strcat(CEnter," ");
|
|
strcat(CEnter, Message[center]);
|
|
strcpy(Message[center], CEnter);
|
|
}
|
|
|
|
Enter(1);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[center]);
|
|
Enter(1);
|
|
free(CEnter);
|
|
}
|
|
|
|
|
|
|
|
int Line_Edit()
|
|
{
|
|
int i, j;
|
|
char msg[81];
|
|
|
|
clear();
|
|
colour(LIGHTRED, BLACK);
|
|
/* Begin your message now, Blank line to end */
|
|
Center((char *) Language(164));
|
|
/* Maximum of TEXTBUFSIZE lines, 73 chars per line */
|
|
Center((char *) Language(165));
|
|
colour(YELLOW, BLACK);
|
|
PUTSTR((char *)" (");
|
|
for (i = 0; i < 74; i++)
|
|
PUTSTR((char *)"-");
|
|
PUTSTR((char *)")");
|
|
Enter(1);
|
|
|
|
Line_Edit_Append();
|
|
|
|
while (TRUE) {
|
|
Enter(1);
|
|
/* Functions available: (Current Message: */ /* Lines) */
|
|
snprintf(msg, 81, "%s%d %s", (char *) Language(167), (Line - 1), (char *) Language(168));
|
|
pout(YELLOW, BLACK, msg);
|
|
Enter(2);
|
|
|
|
/* L - List message S - Save message C - Continue message */
|
|
pout(LIGHTCYAN, BLACK, (char *) Language(169));
|
|
Enter(1);
|
|
|
|
/* Q - Quit message D - Delete line I - Insert line */
|
|
pout(LIGHTCYAN, BLACK, (char *) Language(170));
|
|
Enter(1);
|
|
|
|
/* T - Text edit E - Edit line R - Replace line */
|
|
pout(LIGHTCYAN, BLACK, (char *) Language(171));
|
|
Enter(1);
|
|
|
|
/* Z - Center line */
|
|
pout(LIGHTCYAN, BLACK, (char *) Language(172));
|
|
Enter(2);
|
|
|
|
snprintf(msg, 81, "%s [", (char *) Language(173));
|
|
pout(WHITE, BLACK, msg);
|
|
for (i = 0; i < 10; i++)
|
|
PUTCHAR(Keystroke(172, i));
|
|
PUTSTR((char *)"]: ");
|
|
|
|
alarm_on();
|
|
j = toupper(Readkey());
|
|
|
|
if (j == Keystroke(172, 2)) {
|
|
/* Continue */
|
|
pout(WHITE, BLACK, (char *) Language(174));
|
|
Enter(1);
|
|
Line_Edit_Append();
|
|
} else if (j == Keystroke(172, 4)) {
|
|
/* Delete */
|
|
pout(WHITE, BLACK, (char *) Language(175));
|
|
Enter(1);
|
|
Line_Edit_Delete();
|
|
} else if (j == Keystroke(172, 7)) {
|
|
/* Edit */
|
|
pout(WHITE, BLACK, (char *) Language(180));
|
|
Enter(1);
|
|
Line_Edit_Edit();
|
|
} else if (j == Keystroke(172, 5)) {
|
|
/* Insert */
|
|
pout(WHITE, BLACK, (char *) Language(182));
|
|
Enter(1);
|
|
Line_Edit_Insert();
|
|
} else if (j == Keystroke(172, 0)) {
|
|
pout(WHITE, BLACK, (char *) Language(184));
|
|
Enter(2);
|
|
|
|
for (i = 1; i < Line; i++) {
|
|
snprintf(msg, 81, "%d: ", i);
|
|
pout(LIGHTGREEN, BLACK, msg);
|
|
colour(CFG.MsgInputColourF, CFG.MsgInputColourB);
|
|
PUTSTR(Message[i]);
|
|
Enter(1);
|
|
}
|
|
} else if (j == Keystroke(172, 8)) {
|
|
/* Replace */
|
|
pout(WHITE, BLACK, (char *) Language(362));
|
|
Enter(1);
|
|
Line_Edit_Replace();
|
|
} else if (j == Keystroke(172, 3)) {
|
|
/* Quit */
|
|
pout(WHITE, BLACK, (char *) Language(189));
|
|
Enter(2);
|
|
|
|
/* Are you sure [y/N] */
|
|
PUTSTR((char *) Language(190));
|
|
alarm_on();
|
|
|
|
if (toupper(Readkey()) == Keystroke(190, 0)) {
|
|
/* Yes */
|
|
pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(356));
|
|
Enter(1);
|
|
/* Message aborted. */
|
|
pout(WHITE, BLACK, (char *) Language(191));
|
|
Enter(2);
|
|
|
|
sleep(1);
|
|
return FALSE;
|
|
}
|
|
|
|
/* No */
|
|
pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(192));
|
|
Enter(1);
|
|
} else if (j == Keystroke(172, 6)) {
|
|
/* Text Edit */
|
|
pout(WHITE, BLACK, (char *) Language(193));
|
|
Line_Edit_Text();
|
|
} else if (j == Keystroke(172, 1)) {
|
|
/* Save */
|
|
pout(WHITE, BLACK, (char *) Language(198));
|
|
Enter(1);
|
|
|
|
if (Line > 1)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
} else if (j == Keystroke(172, 9)) {
|
|
/* Center */
|
|
pout(WHITE, BLACK, (char *) Language(376));
|
|
Enter(1);
|
|
Line_Edit_Center();
|
|
}
|
|
}
|
|
}
|
|
|
|
|