|
|
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: 5560 (0x15b8)
Types: TextFile
Names: »cmds.pick.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z«
└─⟦dcb95597f⟧
└─⟦this⟧ »cmds.pick.c«
#ifndef lint
static char rcsid[] =
"$Header: cmds.pick.c,v 1.5 88/01/13 18:58:22 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
/*
* $Source: /c/support/deboor/usr/src/old/vmh/RCS/cmds.pick.c,v $
* $Revision: 1.5 $ $Date: 88/01/13 18:58:22 $
* $Author: deboor $
*
* Routines for handling the pick, find and next_pat commands.
*
* FUNCTIONS:
* cmdPick implements the 'pick' command
* cmdFindF implements the '/' (find forward) command
* cmdFindB implements the '?' (find backward) command
* cmdNext_pat implements the 'n' (find next pattern) command
* cmdPrev_pat implements the 'N' (find next pattern in other
* direction) command
*/
#include "vmh.h"
#include "pick.h"
char *seqName; /* name of sequence to fill */
char *Cmd; /* command to do on sequence when done */
/*
* cmdPick()
* performs a full 'pick' with the ability to execute a command on
* the resulting sequence. The sequence is a public sequence and is
* kept with the folder until deleted.
*/
cmdPick()
{
char cmdline[256];
int *select;
*cmdline = '\0';
Cmd = (char *) NULL;
if (!terse)
prt_action (" Enter 'pick' criteria ");
infomsg (":", 1);
if (mywgetstr (cmdWin, cmdline, TRUE) == 0)
return;
seqName = def_sequence ? def_sequence : "select";
mvcur(0, COLS - 1, LINES - 1, 0); /* Move to bottom of scr */
if ((select = doPick (cmdline)) == (int *) NULL)
return;
if (Cmd) {
CurSequence = select;
UseSequence = TRUE;
sim_cmd (Cmd);
} else {
Free (select); /* unneeded */
}
}
/*
* structure for implementing '/', '?', 'n', and 'N' commands
*/
static struct {
NODE *critRoot;
int direction;
} expression = {
(NODE *) NULL, 0
};
/*
* cmdFindF(count)
* find messages matching a given set of criteria and advance to the
* nearest one forward (if count >0) or backward (if count < 0).
* if autoprint set, the message is printed.
*/
cmdFindF (count)
Reg3 int count;
{
char cmdline[256];
Reg1 int argc;
Reg2 char **argv;
if (! terse)
prt_action (" Enter 'find' criteria ");
infomsg (count < 0 ? "?" : "/", 1);
*cmdline = '\0';
if (mywgetstr (cmdWin, cmdline, TRUE) == 0)
return;
if (*cmdline && ((count < 0 && *cmdline != '?') ||
(count > 0 && *cmdline != '/'))) {
argv = brkstring (cmdline, " \t", "\n");
for (argc = 0; argv[argc]; argc++)
;
if (! parseExpr (argc, argv))
return;
if (expression.critRoot != (NODE *) NULL) {/* free old tree */
freeTree (expression.critRoot);
}
expression.critRoot = expRoot;
}
expression.direction = (count < 0) ? -1 : 1;
cmdNext_pat (count * expression.direction, TRUE);
}
/*
* cmdFindB (count)
* find backwards. just like find forwards but with negative count.
* that's how it's implemented.
*/
cmdFindB (count)
int count;
{
cmdFindF (-count);
}
/*
* cmdNext_pat (count, nomessage)
* advance to the count'th next matching message from previous find
* if 'nomessage' is true, then the cursor is simply moved to the
* lower left corner during the search. otherwise the appropriate
* search character is printed, the command window is cleared and
* the cursor placed in the lower left corner.
*/
cmdNext_pat (count, nomessage)
int count;
int nomessage;
{
Reg2 int dir = expression.direction;
Reg1 int cur;
char msgName[PATHLENGTH];
Reg3 char *msgNum;
int begCur;
Reg4 FILE *msgf;
if (count < 0)
dir = - dir, count = -count;
if (expression.critRoot == (NODE *) NULL) {
errormsg ("no previous expression", 1);
return;
}
if (! nomessage ) {
mvwaddch (cmdWin, 0, 0, dir < 0 ? '?' : '/');
wclrtoeol (cmdWin);
wrefresh (cmdWin);
}
mvcur (0, COLS-1, LINES-1, 0);
/*
* initialize loop variables to be one more than current in the
* proper direction
*/
cur = CurrentMsgNum() + dir;
if (cur > F->f_msgs.m_hghmsg)
cur = F->f_msgs.m_lowmsg;
if (cur < F->f_msgs.m_lowmsg)
cur = F->f_msgs.m_hghmsg;
begCur = cur;
(void) sprintf (msgName, "%s/", F->f_name);
msgNum = &msgName[strlen(msgName)];
/* set tree to evaluate from previous expression */
expRoot = expression.critRoot;
do {
if (Exists (cur, &F->f_msgs)) {
(void) sprintf (msgNum, "%d", cur);
if ((msgf = fopen (msgName, "r")) == (FILE *) NULL)
goto advance;
if (evalMsg (msgf) == TRUE && ! --count) {
(void) fclose (msgf);
/*
* set begCur not equal to cur so that, when
* we break out, if this was the first message
* we searched, we don't get an error message
*/
begCur = cur - 1;
cleanTree (expRoot);
break;
}
(void) fclose (msgf);
cleanTree (expRoot); /* set for next eval */
}
advance:
cur += dir;
if (cur > F->f_msgs.m_hghmsg)
cur = F->f_msgs.m_lowmsg;
if (cur < F->f_msgs.m_lowmsg)
cur = F->f_msgs.m_hghmsg;
} while (cur != begCur);
/*
* we're back where we started, so didn't find anything
*/
if (cur == begCur) {
if (!terse)
infomsg ("Pattern not found", 1);
else
infomsg ("Fail", 1);
return;
}
scroll_to (cur); /* make it the new current message */
if (autoprint) {
int oldUS = UseSequence; /* save old value */
int *oldCS = CurSequence;
UseSequence = 0;
cmdType (1, 0, 0, (char **) NULL);
Free ((char *) CurSequence); /* free sequence we just made */
UseSequence = oldUS;
CurSequence = oldCS;
}
}
/*
* cmdPrev_pat (count)
* like next_pat but in the opposite direction. Just negate the count.
*/
cmdPrev_pat (count)
int count;
{
cmdNext_pat (-count, FALSE);
}