prntfile.cpp 5.15 KiB
/* prntfile.cpp */
/* Synchronet file print/display routines */
/* $Id$ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program 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 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
/****************************************************************************/
/* Prints a file remotely and locally, interpreting ^A sequences, checks */
/* for pauses, aborts and ANSI. 'str' is the path of the file to print */
/* Called from functions menu and text_sec */
/****************************************************************************/
void sbbs_t::printfile(char *str, long mode)
{
char HUGE16 *buf;
int file,wip=0,rip=0;
long length,savcon=console;
FILE *stream;
if(strstr(str,".WIP"))
wip=1;
if(strstr(str,".RIP"))
rip=1;
if(mode&P_NOABORT || wip || rip) {
if(online==ON_REMOTE && console&CON_R_ECHO) {
rioctl(IOCM|ABORT);
rioctl(IOCS|ABORT); }
sys_status&=~SS_ABORT; }
if(!tos && !wip && !rip)
CRLF;
if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
lprintf("File not found: %s",str);
bputs(text[FileNotFound]);
if(SYSOP) bputs(str);
CRLF;
return; }
if(mode&P_OPENCLOSE) {
length=filelength(file);
if((buf=(char*)MALLOC(length+1L))==NULL) {
close(file);
console=savcon;
errormsg(WHERE,ERR_ALLOC,str,length+1L);
return; }
buf[lread(file,buf,length)]=0;
fclose(stream);
putmsg(buf,mode);
FREE((char *)buf); }
else {
putmsg_fp(stream,filelength(file),mode);
fclose(stream); }
if((mode&P_NOABORT || wip || rip) && online==ON_REMOTE) {
SYNC;
rioctl(IOSM|ABORT); }
if(rip)
ansi_getlines();
console=savcon;
}
void sbbs_t::printtail(char *str, int lines, long mode)
{
char HUGE16 *buf,HUGE16 *p;
int file,cur=0;
ulong length,l;
if(mode&P_NOABORT) {
if(online==ON_REMOTE) {
rioctl(IOCM|ABORT);
rioctl(IOCS|ABORT); }
sys_status&=~SS_ABORT; }
if(!tos) {
CRLF; }
if((file=nopen(str,O_RDONLY))==-1) {
lprintf("File not found: %s",str);
bputs(text[FileNotFound]);
if(SYSOP) bputs(str);
CRLF;
return; }
length=filelength(file);
if((buf=(char*)MALLOC(length+1L))==NULL) {
close(file);
errormsg(WHERE,ERR_ALLOC,str,length+1L);
return; }
l=lread(file,buf,length);
buf[l]=0;
close(file);
p=(buf+l)-1;
if(*p==LF) p--;
while(*p && p>buf) {
if(*p==LF)
cur++;
if(cur>=lines) {
p++;
break; }
p--; }
putmsg(p,mode);
if(mode&P_NOABORT && online==ON_REMOTE) {
SYNC;
rioctl(IOSM|ABORT); }
FREE((char *)buf);
}
/****************************************************************************/
/* Prints the menu number 'menunum' from the text directory. Checks for ^A */
/* ,ANSI sequences, pauses and aborts. Usually accessed by user inputing '?'*/
/* Called from every function that has an available menu. */
/* The code definitions are as follows: */
/****************************************************************************/
void sbbs_t::menu(char *code)
{
char str[MAX_PATH+1],path[MAX_PATH+1];
sys_status&=~SS_ABORT;
if(menu_file[0])
strcpy(path,menu_file);
else {
sprintf(str,"%smenu/",cfg.text_dir);
if(menu_dir[0]) {
strcat(str,menu_dir);
strcat(str,"/"); }
strcat(str,code);
strcat(str,".");
sprintf(path,"%s%s",str,useron.misc&WIP ? "wip":"rip");
if(!(useron.misc&(RIP|WIP)) || !fexistcase(path)) {
sprintf(path,"%smon",str);
if((useron.misc&(COLOR|ANSI))!=ANSI || !fexistcase(path)) {
sprintf(path,"%sans",str);
if(!(useron.misc&ANSI) || !fexistcase(path))
sprintf(path,"%sasc",str);
}
}
}
printfile(path,P_OPENCLOSE);
}