/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */
/*********************************************************************/
/* file: files.c - funtions for logfile and reading/writing comfiles */
/* TINTIN + + */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/* New code by Bill Reiss 1993 */
/*********************************************************************/
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
#include "tintin.h"
struct listnode *common_aliases, *common_actions, *common_subs, *common_myvars;
struct listnode *common_highs, *common_antisubs, *common_pathdirs;
struct completenode *complete_head;
void prepare_for_write();
int mygets();
extern int puts_echoing;
extern int alnum, acnum, subnum, hinum, varnum, antisubnum;
extern int verbose;
extern char tintin_char;
extern struct session *parse_input();
/**********************************/
/* load a completion file */
/**********************************/
void read_complete()
{
FILE *myfile;
char buffer[BUFFER_SIZE], *cptr;
char message[80];
int flag;
struct completenode *tcomplete, *tcomp2;
flag = TRUE;
if ((complete_head = (struct completenode *) (malloc(sizeof(struct completenode)))) == NULL) {
fprintf(stderr, "couldn't alloc completehead\n");
exit(1);
}
tcomplete = complete_head;
if ((myfile = fopen("tab.txt", "r")) == NULL) {
if ((cptr = (char *) getenv("HOME"))) {
strcpy(buffer, cptr);
strcat(buffer, "/.tab.txt");
myfile = fopen(buffer, "r");
}
}
if (myfile == NULL) {
tintin_puts("no tab.txt file, no completion list\n", (struct session *) NULL);
return;
}
while (fgets(buffer, sizeof(buffer), myfile)) {
for (cptr = buffer; *cptr && *cptr != '\n'; cptr++);
*cptr = '\0';
if ((tcomp2 = (struct completenode *) (malloc(sizeof(struct completenode)))) == NULL) {
fprintf(stderr, "couldn't alloc comletehead\n");
exit(1);
}
if ((cptr = (char *) (malloc(strlen(buffer) + 1))) == NULL) {
fprintf(stderr, "couldn't alloc memory for string in complete\n");
exit(1);
}
strcpy(cptr, buffer);
tcomp2->strng = cptr;
tcomplete->next = tcomp2;
tcomplete = tcomp2;
}
tcomplete->next = NULL;
fclose(myfile);
tintin_puts("tab.txt file loaded.\n", (struct session *) NULL);
prompt(NULL);
tintin_puts("\n", (struct session *) NULL);
}
/********************/
/* the #log command */
/********************/
void log_command(arg, ses)
char *arg;
struct session *ses;
{
if (ses) {
if (!ses->logfile) {
if (*arg) {
if ((ses->logfile = fopen(arg, "w")))
tintin_puts("#OK. LOGGING.....", 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);
prompt(NULL);
}
/***********************************/
/* read and execute a command file */
/***********************************/
struct session *read_command(filename, ses)
char *filename;
struct session *ses;
{
FILE *myfile;
char buffer[BUFFER_SIZE], *cptr;
char message[80];
int flag;
flag = TRUE;
get_arg_in_braces(filename, filename, 1);
if ((myfile = fopen(filename, "r")) == NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
prompt(NULL);
return ses;
}
if (!verbose)
puts_echoing = FALSE;
alnum = 0;
acnum = 0;
subnum = 0;
varnum = 0;
hinum = 0;
antisubnum = 0;
/* @@@changed -- perry */
while (mygets(buffer, sizeof(buffer), myfile)) {
if (flag) {
char_command(buffer, ses);
flag = FALSE;
}
for (cptr = buffer; *cptr && *cptr != '\n'; cptr++);
*cptr = '\0';
if (*buffer)
ses = parse_input(buffer, ses);
}
if (!verbose) {
/* @@@changed -- perry */
puts_echoing = TRUE;
tintin_puts2("#Ok. File has been loaded.", ses);
}
fclose(myfile);
prompt(NULL);
return ses;
}
/************************/
/* write a command file */
/************************/
struct session *write_command(filename, ses)
char *filename;
struct session *ses;
{
FILE *myfile;
char buffer[BUFFER_SIZE];
struct listnode *nodeptr;
get_arg_in_braces(filename, filename, 1);
if (*filename == '\0') {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
prompt(NULL);
return (0); /* added zero return */
}
if ((myfile = fopen(filename, "w")) == NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
prompt(NULL);
return (0); /* added zero return */
}
nodeptr = (ses) ? ses->aliases : common_aliases;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("alias", nodeptr->left, nodeptr->right, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->actions : common_actions;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("action", nodeptr->left, nodeptr->right, nodeptr->pr,
buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->antisubs : common_antisubs;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("antisubstitute", nodeptr->left,
nodeptr->right, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->subs : common_subs;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("substitute", nodeptr->left, nodeptr->right, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->myvars : common_myvars;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("variable", nodeptr->left, nodeptr->right, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->highs : common_highs;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("highlight", nodeptr->right, nodeptr->left, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->pathdirs : common_pathdirs;
while ((nodeptr = nodeptr->next)) {
prepare_for_write("pathdir", nodeptr->right, nodeptr->left, "\0", buffer);
fputs(buffer, myfile);
}
fclose(myfile);
tintin_puts("#COMMANDO-FILE WRITTEN.", ses);
return ses;
}
/************************/
/* write a command file */
/************************/
struct session *writesession_command(filename, ses)
char *filename;
struct session *ses;
{
FILE *myfile;
char buffer[BUFFER_SIZE], fn[BUFFER_SIZE];
struct listnode *nodeptr;
get_arg_in_braces(filename, filename, 1);
if (*filename == '\0') {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
prompt(NULL);
return (0); /* added zero return */
}
if ((myfile = fopen(filename, "w")) == NULL) {
tintin_puts("#ERROR - COULDN'T OPEN THAT FILE.", ses);
prompt(NULL);
return (0); /* added zero 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, "\0", 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, nodeptr->pr,
buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->antisubs : common_antisubs;
while ((nodeptr = nodeptr->next)) {
if (ses && searchnode_list(common_antisubs, nodeptr->left))
continue;
prepare_for_write("antisubstitute", nodeptr->left, "", "\0", 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, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->myvars : common_myvars;
while ((nodeptr = nodeptr->next)) {
if (ses && searchnode_list(common_myvars, nodeptr->left))
continue;
prepare_for_write("variable", nodeptr->left, nodeptr->right, "\0", buffer);
fputs(buffer, myfile);
}
nodeptr = (ses) ? ses->highs : common_highs;
while ((nodeptr = nodeptr->next)) {
if (ses && searchnode_list(common_highs, nodeptr->left))
continue;
prepare_for_write("highlight", nodeptr->right, nodeptr->left, "\0", buffer);
fputs(buffer, myfile);
}
fclose(myfile);
tintin_puts("#COMMANDO-FILE WRITTEN.", ses);
return ses;
}
void prepare_for_write(command, left, right, pr, result)
char *command;
char *left;
char *right;
char *pr;
char *result;
{
/* char tmpbuf[BUFFER_SIZE]; */
*result = tintin_char;
*(result + 1) = '\0';
strcat(result, command);
strcat(result, " {");
strcat(result, left);
strcat(result, "}");
if (strlen(right) != 0) {
strcat(result, " {");
strcat(result, right);
strcat(result, "}");
}
if (strlen(pr) != 0) {
strcat(result, " {");
strcat(result, pr);
strcat(result, "}");
}
strcat(result, "\n");
}
void prepare_quotes(string)
char *string;
{
char s[BUFFER_SIZE], *cpsource, *cpdest;
int nest = FALSE;
strcpy(s, string);
cpsource = s;
cpdest = string;
while (*cpsource) {
if (*cpsource == '\\') {
*cpdest++ = *cpsource++;
if (*cpsource)
*cpdest++ = *cpsource++;
}
else if (*cpsource == '\"' && nest == FALSE) {
*cpdest++ = '\\';
*cpdest++ = *cpsource++;
}
else if (*cpsource == '{') {
nest = TRUE;
*cpdest++ = *cpsource++;
}
else if (*cpsource == '}') {
nest = FALSE;
*cpdest++ = *cpsource++;
}
else
*cpdest++ = *cpsource++;
}
*cpdest = '\0';
}