/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /*********************************************************************/ /* file: path.c - stuff for the path feature */ /* TINTIN III */ /* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */ /* coded by peter unold 1992 */ /* recoded by Jeremy C. Jack 1994 */ /*********************************************************************/ /* the path is implemented as a fix-sized queue. It gets a bit messy */ /* here and there, but it should work.... */ /*********************************************************************/ #ifdef HAVE_STRING_H #include <string.h> #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif #include "tintin.h" #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif #ifdef HAVE_UNISTD_H #include <unistd.h> #endif void check_insert_path(); void insert_path(); int return_flag = TRUE; extern char *get_arg_in_braces(); extern void prompt(); extern void kill_list(); extern struct listnode *search_node_with_wild(); extern struct listnode *searchnode_list(); extern struct listnode *init_list(); extern struct listnode *deletenode_list(); extern struct listnode *addnode_list(); extern char tintin_char; extern struct listnode *common_pathdirs; extern int pdnum; extern int mesvar[7]; void mark_command(ses) struct session *ses; { if (ses) { kill_list(ses->path); ses->path = init_list(ses->path); ses->path_length = 0; tintin_puts("#Beginning of path marked.", ses); } else tintin_puts("#No session active => NO PATH!", ses); } void map_command(arg, ses) char *arg; struct session *ses; { if (ses) { get_arg_in_braces(arg, arg, 1); check_insert_path(arg, ses); } else tintin_puts2("No session active => NO PATH!", ses); } void savepath_command(arg, ses) struct session *ses; char *arg; { if (ses) { get_arg_in_braces(arg, arg, 1); if ((strlen(arg)) && (ses->path_length)) { char result[BUFFER_SIZE]; struct listnode *ln = ses->path; int dirlen, len = 0; sprintf(result, "%calias {%s} {", tintin_char, arg); len = strlen(result); while (ln = ln->next) { dirlen = strlen(ln->left); if (dirlen + len < BUFFER_SIZE) { strcat(result, ln->left); len += dirlen + 1; if (ln->next) strcat(result, ";"); } else { tintin_puts("#Error - buffer too small to contain alias", ses); break; } } strcat(result, "}"); parse_input(result, ses); } else tintin_puts("#Error: no alias for savepath or no path", ses); } else tintin_puts2("No session active => NO PATH TO SAVE!", ses); } void path_command(ses) struct session *ses; { if (ses) { int x, len = 0, dirlen; struct listnode *ln = ses->path; char mypath[81]; strcpy(mypath, "#Path: "); while (ln = ln->next) { dirlen = strlen(ln->left); if (dirlen + len > 70) { tintin_puts(mypath, ses); strcpy(mypath, "#Path: "); len = 0; } strcat(mypath, ln->left); strcat(mypath, " "); len += dirlen + 1; } tintin_puts(mypath, ses); } else tintin_puts("No session active => NO PATH!", ses); } void return_command(ses) struct session *ses; { if (ses) { if (ses->path_length) { struct listnode *ln = ses->path; char command[BUFFER_SIZE]; ses->path_length--; while (ln->next) (ln = ln->next); strcpy(command, ln->right); return_flag = FALSE; /* temporarily turn off path tracking */ parse_input(command, ses); return_flag = TRUE; /* restore path tracking */ deletenode_list(ses->path, ln); } else tintin_puts("#No place to return from!", ses); } else tintin_puts("#No session active => NO PATH!", ses); } void unpath_command(ses) struct session *ses; { if (ses) if (ses->path_length) { struct listnode *ln = ses->path; ses->path_length--; while (ln->next) (ln = ln->next); deletenode_list(ses->path, ln); tintin_puts("#Ok. Forgot that move.", ses); } else tintin_puts("#No move to forget!", ses); else tintin_puts("#No session active => NO PATH!", ses); } void check_insert_path(command, ses) char *command; struct session *ses; { struct listnode *ln; if (!return_flag) return; if ((ln = searchnode_list(ses->pathdirs, command)) != NULL) { if (ses->path_length != MAX_PATH_LENGTH) ses->path_length++; else if (ses->path_length) deletenode_list(ses->path, ses->path->next); addnode_list(ses->path, ln->left, ln->right, "0"); } } void pathdir_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], right[BUFFER_SIZE], arg2[BUFFER_SIZE]; struct listnode *mypathdirs, *ln; mypathdirs = (ses) ? ses->pathdirs : common_pathdirs; arg = get_arg_in_braces(arg, left, 0); arg = get_arg_in_braces(arg, right, 1); if (!*left) { tintin_puts2("#These PATHDIRS have been defined:", ses); show_list(mypathdirs); prompt(ses); } else if (*left && !*right) { if ((ln = search_node_with_wild(mypathdirs, left)) != NULL) { do { shownode_list(ln); } while ((ln = search_node_with_wild(ln->next, left))); prompt(ses); } else if (mesvar[6]) tintin_puts2("#That PATHDIR is not defined.", ses); } else { if ((ln = searchnode_list(mypathdirs, left)) != NULL) deletenode_list(mypathdirs, ln); insertnode_list(mypathdirs, left, right, "0", ALPHA); if (mesvar[6]) { sprintf(arg2, "#Ok. {%s} is marked in #path. {%s} is it's #return.", left, right); tintin_puts2(arg2, ses); } pdnum++; } }