|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 7008 (0x1b60) Types: TextFile Names: »cmds.stack.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« └─⟦dcb95597f⟧ └─⟦this⟧ »cmds.stack.c«
#ifndef lint static char rcsid[] = "$Header: cmds.stack.c,v 1.7 86/10/09 15:59:15 deboor Exp $"; static char notice[] = "This program is in the public domain and is available for unlimited \ distribution as long as this notice is enclosed."; #endif lint /* * Commands for playing with the folder stack. * * $Source: /c/support/deboor/usr/src/old/vmh/RCS/cmds.stack.c,v $ * $Revision: 1.7 $ * $Author: deboor $ * * FUNCTIONS: * cmdList_stack print out current folder stack * cmdPop remove folder from folder stack * cmdPush push a folder onto the folder stack * cmdSwitch switch to a different folder * init_stack initialize folder stack */ #include "vmh.h" /* * cmdSwitch (count, undo, argc, argv) int count, undo, argc; char **argv; * cmdSwitch simply switches the current folder to be either the first * argument, if any, in the argv vector or to the folder for which it * prompts. Because people don't give counts when switching folders * (unless they're weird), cmdPush calls cmdSwitch with a count of * 0 if cmdSwitch should prompt for a folder to which to push, rather * than switch. Knowing this, if you think it's neat to fool a program, * feel free to give a 0 count when switching folders. */ /*ARGSUSED*/ cmdSwitch(count, undo, argc, argv) int count, undo, argc; char **argv; { char folder[PATHLENGTH]; int t; if (count) prt_action (" Switch folders "); if (!argc) { if (!count) t = getfolderpath("Push to folder ",folder, sizeof(folder), 0); else t = getfolderpath("Switch to folder ", folder, sizeof(folder), 0); } else { (void) strcpy (folder, argv[0]); t = getpath (folder, folder, sizeof(folder)); } if (t == 0) /* If ok folder . . . */ { wclear(cmdWin); wrefresh(cmdWin); /* Clear cmd line */ dofolder(folder); /* Do new folder */ return (0); } else if (t!=2) { errormsg("No such folder", 0); } return (1); } /* * the folder stack structure. f_name is the folder name. f_prv points to the * previous element in the "stack." f_nxt points to the next one. Admittedly, * you don't see a doubly linked stack too often, but tough. --ardeb */ struct foldstack { char *fs_name; /* the name */ struct foldstack *fs_prv, /* the previous element */ *fs_nxt; /* the next element */ } *StackHead = NULL; /* ** initstack() ** called from initstuff(), this function initializes the top of the ** stack to be the passed folder . This way, the stack is never ** empty, sort of like some bars I've never been to. --ardeb ** ** Sigh. it's still doubly linked, but it starts out empty. */ init_stack () { StackHead = NULL; /* mark stack as empty */ } /* ** cmdPush (levels) int levels; ** if levels is 1, calls cmdSwitch to change folders and then pushes ** the gotten one on the stack. If levels is greater than 1, then the ** levels'th folder is brought to the top of the stack and the folder ** changed to it. */ /*ARGSUSED*/ cmdPush (levels, undo, argc, argv) int levels, undo, argc; char **argv; { register struct foldstack *tmp; register i; if (levels < 0) { cmdList_stack(); return; } if (levels == 1) { prt_action (" Push folder "); /* Create a new element for the stack */ tmp = (struct foldstack *) Malloc (sizeof (struct foldstack)); /* put in a new copy of the folder name */ tmp->fs_name = (char *) Malloc (strlen (F->f_name) + 1); (void) strcpy (tmp->fs_name, F->f_name); /* add the new folder to the top */ if (StackHead) StackHead->fs_prv = tmp; tmp->fs_nxt = StackHead; tmp->fs_prv = NULL; StackHead = tmp; if (cmdSwitch(0,undo,argc,argv)) { /* unsuccessful change, so... */ cmdPop (1); /* pop it off again */ } cmdList_stack(); return; } else { char *tname; char num[20]; /* exorbitant */ prt_action (" Push the %s folder ", sprintf (num, (levels % 10 == 2 ? "%dnd" : levels % 10 == 3 ? "%drd" : "%dth"), levels)); /* get to the desired level */ for (tmp = StackHead, i = 2; tmp && i < levels; i++, tmp = tmp->fs_nxt) ; if (tmp == NULL) { errormsg ("not that many levels in stack!", 1); return; } tname = tmp->fs_name; tmp->fs_name = (char *) Malloc (strlen (F->f_name) + 1); (void) strcpy (tmp->fs_name, F->f_name); /* change to this folder */ dofolder (tname); /* then free up the string */ Free ((char *)tname); /* and list the stack for the user's sake...as usual */ cmdList_stack(); } } /* ** cmdPop (levels) int levels; ** pops the level'th folder off the stack. i.e. if 1 is given, ** simply pops the first folder. If 3 is given, travels down the ** stack to the third level and (void) unlinks that folder. */ cmdPop (levels) int levels; { register struct foldstack *tmp; register i; char num[20]; if (levels < 0) { cmdList_stack(); return; } if (levels == 1) { prt_action ("Pop the current folder"); if (StackHead == NULL) { errormsg ("not that many levels in stack!", 1); return; } tmp = StackHead; /* save head */ StackHead = StackHead->fs_nxt; /* pop the thing */ if (StackHead) StackHead->fs_prv = NULL; /* for the hell of it */ dofolder (tmp->fs_name); /* switch to the folder */ Free ((char *)tmp->fs_name); /* free up the folder name */ Free ((char *)tmp); /* then the structure */ cmdList_stack(); /* list the current stack */ return; } prt_action ("Pop the %s folder", sprintf (num, (levels % 10 == 2 ? "%dnd" : levels % 10 == 3 ? "%drd" : "%dth"), levels)); /* * move down the stack levels levels or until NULL is hit */ for (i = 2, tmp = StackHead; tmp && i < levels; i++, tmp = tmp->fs_nxt) ; /* if it's NULL, bitch. */ if (tmp == NULL) { errormsg ("not that many levels in stack!", 1); return; } if (tmp->fs_prv) tmp->fs_prv->fs_nxt = tmp->fs_nxt; /* link prev to next */ if (tmp->fs_nxt) tmp->fs_nxt->fs_prv = tmp->fs_prv; /* then next to prev */ if (tmp == StackHead) /* if that was the top */ StackHead = StackHead->fs_nxt; /* advance StackHead */ Free ((char *)tmp->fs_name); /* free the foldername! */ Free ((char *)tmp); /* then the structure! */ /* Vive la Revolucion!! */ cmdList_stack(); } /* ** cmdList_stack() ** takes no arguments. Lists the current folder stack in ** the bottom window. Called by cmdPush and cmdPop if they are ** given negative levelss. */ cmdList_stack () { register struct foldstack *tmp; static char *stackStr = (char *)0; register char *cp, *sEnd; if (stackStr == (char *) 0) stackStr = (char *) Malloc (COLS); /* first the current folder */ (void) snprintf (stackStr, COLS, " +%s ", &F->f_name[rootlen+1]); cp = stackStr + strlen (&F->f_name[rootlen+1]) + 3; sEnd = cp + COLS; /* then the stack */ for (tmp = StackHead; tmp; tmp = tmp->fs_nxt) { (void) snprintf (cp, sEnd - cp, "+%s ", &tmp->fs_name[rootlen + 1]); cp += strlen (&tmp->fs_name[rootlen + 1]) + 2; if (sEnd - cp < 0) break; } dotitle (botHdr, stackStr); }