/*********************************************************************/
/* file: files.c - funtions for logfile and reading/writing comfiles */
/* TINTIN III */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/*********************************************************************/
#include <stdio.h>
#include <string.h>
#include "tintin.h"
struct listnode *common_aliases, *common_actions, *common_subs;
/********************/
/* the #log command */
/********************/
void log_command(char *arg, struct session *ses)
{
if(ses) {
if(!ses->logfile) {
if(*arg) {
if(ses->logfile=fopen(arg, "w"))
tintin_puts("#OK. LOGING.....", ses);
else
tintin_puts("#COULDN'T OPEN FILE.", ses);
}
else
tintin_puts("#SPECIFY A FILENAME.", ses);
}
else {
fclose(ses->logfile);
ses->logfile=NULL;
tintin_puts("#OK. LOGGING TURNED OFF.", ses);
}
}
else
tintin_puts("#THERE'S NO SESSION TO LOG.", ses);
}
/***********************************/
/* read and execute a command file */
/***********************************/
struct session *read_command(char *filename, struct session *ses)
{
FILE *myfile;
char buffer[BUFFER_SIZE], *cptr;
if((myfile=fopen(filename, "rt"))==NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
return ses;
}
while(fgets(buffer, sizeof(buffer), myfile)) {
for(cptr=buffer; *cptr && *cptr!='\n'; cptr++);
*cptr='\0';
ses=parse_input(buffer, ses);
}
fclose(myfile);
return ses;
}
/************************/
/* write a command file */
/************************/
struct session *write_command(char *filename, struct session *ses)
{
FILE *myfile;
char buffer[BUFFER_SIZE];
struct listnode *nodeptr;
if((myfile=fopen(filename, "w"))==NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
return;
}
nodeptr=(ses) ? ses->aliases : common_aliases;
while(nodeptr=nodeptr->next) {
prepare_for_write("#alias", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
nodeptr=(ses) ? ses->actions : common_actions;
while(nodeptr=nodeptr->next) {
prepare_for_write("#action", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
nodeptr=(ses) ? ses->subs : common_subs;
while(nodeptr=nodeptr->next) {
prepare_for_write("#substitute", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
fclose(myfile);
tintin_puts("#COMMANDO-FILE WRITTEN.", ses);
return ses;
}
/************************/
/* write a command file */
/************************/
struct session *writesession_command(char *filename, struct session *ses)
{
FILE *myfile;
char buffer[BUFFER_SIZE];
struct listnode *nodeptr;
if((myfile=fopen(filename, "w"))==NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
return;
}
nodeptr=(ses) ? ses->aliases : common_aliases;
while(nodeptr=nodeptr->next) {
if(ses && searchnode_list(common_aliases, nodeptr->left))
continue;
prepare_for_write("#alias", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
nodeptr=(ses) ? ses->actions : common_actions;
while(nodeptr=nodeptr->next) {
if(ses && searchnode_list(common_actions, nodeptr->left))
continue;
prepare_for_write("#action", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
nodeptr=(ses) ? ses->subs : common_subs;
while(nodeptr=nodeptr->next) {
if(ses && searchnode_list(common_subs, nodeptr->left))
continue;
prepare_for_write("#substitute", nodeptr->left, nodeptr->right, buffer);
fputs(buffer, myfile);
}
fclose(myfile);
tintin_puts("#COMMANDO-FILE WRITTEN.", ses);
return ses;
}
void prepare_for_write(char *command, char *left, char *right, char *result)
{
char tmpbuf[BUFFER_SIZE];
strcpy(result, command);
strcat(result, " ");
if(*get_arg_stop_spaces(left, tmpbuf)) {
strcat(result, "\"");
prepare_quotes(left);
strcat(result, left);
strcat(result, "\"");
}
else
strcat(result, left);
strcat(result, " ");
if(*get_arg_stop_spaces(right, tmpbuf)) {
strcat(result, "\"");
prepare_quotes(right);
strcat(result, right);
strcat(result, "\"");
}
else
strcat(result, right);
strcat(result, "\n");
}
void prepare_quotes(char *string)
{
char s[BUFFER_SIZE], *cpsource, *cpdest;
strcpy(s, string);
cpsource=s;
cpdest=string;
while(*cpsource) {
if(*cpsource=='\\') {
*cpdest++=*cpsource++;
if(*cpsource)
*cpdest++=*cpsource++;
}
else if(*cpsource=='\"') {
*cpdest++='\\';
*cpdest++=*cpsource++;
}
else
*cpdest++=*cpsource++;
}
*cpdest='\0';
}