/*********************************************************************/ /* 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.... */ /*********************************************************************/ #include <string.h> #include "tintin.h" #if IRIX #include <stdlib.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((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) { while ((mypathdirs=search_node_with_wild(mypathdirs, left))!=NULL) shownode_list(mypathdirs); 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++; } }