Exemplo n.º 1
0
/*
 * Reposition by a given number of lines
 */
static int
JumpBackwards(int *infile, int jump)
{
    int savejump;
    int blank;
    int n;
    int page = NumP(1);

    savejump = jump = page - jump;
    n = TopOfPage(*infile, &blank);

    /* jump the requested number of lines */
    if (jump > 0) {
	if (n == 0) {
	    while ((blank = LineAt[n].blank) != 0) {
		n++;
	    }
	}
	while (jump > 0) {
	    if (++n >= max_lines) {
		return (-1);
	    }
	    if (blank && LineAt[n].blank)
		continue;
	    blank = LineAt[n].blank;
	    jump--;
	}
    } else {
	while (jump < 0) {
	    if (--n < 0) {
		*infile = 0;	/* take what we can get */
		(void) JumpToLine(*infile);
		return (-1);
	    }
	    if (blank && LineAt[n].blank)
		continue;
	    blank = LineAt[n].blank;
	    jump++;
	}
    }
#if defined(HAVE_WSCRL) && defined(HAVE_WSETSCRREG)
    if (jump != savejump
	&& (n + NumP(1) < max_lines)
	&& (jump - savejump) < NumP(1)
	&& (savejump - jump) < NumP(1)) {
	int y, x;
	getyx(stdscr, y, x);
	move(LINES - 2, 0);
	setscrreg(mark_W + 1, LINES - 2);
	scrl(savejump - jump);
	setscrreg(0, LINES - 1);
	move(y, x);
    }
#endif
    *infile = n;
    return JumpToLine(*infile);
}
Exemplo n.º 2
0
/*
 * Find the top line in a page, given the bottom line-number
 */
static int
TopOfPage(int infile, int *blank)
{
    int page = NumP(1);

    *blank = FALSE;
    if (infile > 0) {		/* this was the bottom line; it should be nonzero */
	while (page > 0) {
	    if (--infile <= 0)
		break;
	    if (*blank && LineAt[infile].blank)
		continue;
	    *blank = LineAt[infile].blank;
	    page--;
	}
	if (*blank) {
	    while (infile > 0 && LineAt[infile - 1].blank) {
		infile--;
	    }
	} else if (infile > 0
		   && infile == LineAt[infile - 1].blank) {
	    infile = 0;
	    *blank = TRUE;
	}
    }
    return infile;
}
Exemplo n.º 3
0
CChainElement_Rtf* CRTF_SummaryBuilder::InsertAtBookmark (LPCSTR szName, CChainElement_Rtf* pDoc, CRTF_CharacterProperties* pChProps, int iNum, bool bIsPercentage)
{
	return InsertAtBookmark(szName, pDoc, pChProps, bIsPercentage ? NumP(iNum) : Num(iNum));
}
Exemplo n.º 4
0
void
dedtype(RING * gbl,
	char *name,
	int inlist,
	int binary,
	int stripped,
	int isdir)
{
    int had_eof;
    int c;
    int count,			/* ...and repeat-count */
      y,			/* current line-in-screen */
      shift = COLS / 4,		/* amount of left/right shift */
      done = FALSE, shown = FALSE, infile = -1;		/* # of lines processed */
    OFF_T skip = 0;

    tabstop = 8;
    Shift = 0;
    UsePattern = FALSE;
    OptBinary = binary;
    OptStripped = stripped;

    if (isdir && !OptBinary) {
	DIR *dp;
	DirentT *de;
	char bfr[MAXPATHLEN];
# define INO_FMT "%5lu"
	if ((InFile = tmpfile()) == 0) {
	    warn(gbl, "tmp-file");
	    return;
	}
	if ((dp = opendir(name)) != 0) {
	    while ((de = readdir(dp)) != NULL) {
		(void) ded2string(gbl, bfr,
				  (int) NAMLEN(de),
				  de->d_name,
				  FALSE);
		FPRINTF(InFile, INO_FMT, (unsigned long) de->d_ino);
		FPRINTF(InFile, " %s\n", bfr);
	    }
	    (void) closedir(dp);
	    rewind(InFile);
	} else {
	    warn(gbl, "opendir");
	    FCLOSE(InFile);
	    return;
	}
    } else
	InFile = fopen(name, "r");

    in_dedtype = TRUE;		/* disable clearing of workspace via A/a cmd */

    if (InFile) {
	int jump = 0;

	dlog_comment("type \"%s\" (%s %s)\n",
		     name,
		     OptBinary ? "binary" : "text",
		     isdir ? "directory" : "file");
	to_work(gbl, FALSE);

	dyn_init(&my_text, BUFSIZ);
	dyn_init(&my_over, BUFSIZ);

	max_lines = -1;
	MarkLine(&infile);

	while (!done) {

	    if (jump) {
#if defined(HAVE_WSCRL) && defined(HAVE_WSETSCRREG)
		/*
		 * If we're doing single-line scrolling past
		 * the point we've read in the file, try to
		 * cache pointers so that the scrolling logic
		 * will go more smoothly.
		 */
		if (jump > 0
		    && jump < NumP(1)
		    && infile + NumP(1) >= max_lines) {
		    int line = infile;
		    (void) StartPage(&line, TRUE, &had_eof);
		}
#endif
		(void) JumpBackwards(&infile, jump);
		jump = 0;
	    }

	    markC(gbl, TRUE);
	    y = StartPage(&infile, (int) skip, &had_eof);
	    if (skip && !was_interrupted) {
		if (feof(InFile)) {
		    skip = 0;
		    jump = NumP(1);
		} else {
		    IgnorePage(infile);
		    skip--;
		}
		continue;
	    }
	    if (had_eof) {
		int blank;
		infile = TopOfPage(infile, &blank);
		(void) JumpToLine(infile);
		y = StartPage(&infile, 0, &had_eof);
	    }
	    shown |= FinishPage(gbl, inlist, infile, y);
	    jump = NumP(1);

	    reset_catcher();
	    switch (c = dlog_char(gbl, &count, 1)) {
	    case CTL('K'):
		deddump(gbl);
		break;
	    case 'w':
		retouch(gbl, 0);
		break;
	    case '\t':
		if (OptBinary) {
		    beep();
		} else {
		    tabstop = (count <= 1)
			? (tabstop == 8 ? 4 : 8)
			: count;
		}
		break;

	    case 'q':
		done = TRUE;
		break;

	    case KEY_HOME:
	    case '^':
		jump = infile;
		break;

	    case KEY_END:
	    case '$':
		infile = max_lines;
		skip = MaxP();
		break;

	    case KEY_PPAGE:
	    case '\b':
	    case 'b':
		if (AtTop(infile)) {
		    beep();
		} else {
		    jump += NumP(count);
		}
		break;
	    case KEY_NPAGE:
	    case '\n':
	    case ' ':
	    case 'f':
		jump = 0;
		skip = count - 1;
		break;

	    case '<':
	    case CTL('L'):
		LeftOrRight(-shift * count);
		break;
	    case '>':
	    case CTL('R'):
		LeftOrRight(shift * count);
		break;

	    case KEY_LEFT:
	    case 'h':
		LeftOrRight(-count);
		break;
	    case KEY_DOWN:
	    case 'j':
		jump = NumP(1) - count;
		if ((infile - jump) > max_lines) {
		    skip = (-jump + NumP(1) - 1) / NumP(1);
		    jump = 0;
		}
		break;
	    case KEY_UP:
	    case 'k':
		if (AtTop(infile)) {
		    beep();
		} else {
		    jump += count;
		}
		break;
	    case KEY_RIGHT:
	    case 'l':
		LeftOrRight(count);
		break;

		/* move work-area marker */
	    case 'A':
		count = -count;
		jump -= count;
		/*FALLTHRU */
	    case 'a':
		markset(gbl, (unsigned) (mark_W + count));
		break;

	    case '/':
	    case '?':
	    case 'n':
	    case 'N':
		FindPattern(gbl, &infile, c);
		break;
	    default:
		beep();
	    }
	}
	FCLOSE(InFile);
	if (shown)
	    (void) reshow(gbl, (unsigned) inlist);
	showMARK(gbl->Xbase);

	showC(gbl);
    } else
	warn(gbl, name);
    in_dedtype = FALSE;
}
Exemplo n.º 5
0
static void
FindPattern(RING * gbl,
	    int *infile,
	    int key)
{
    int foo;
    char *s;
    int next, save = *infile;
    static DYN *text;
    static HIST *History;
    static int order;		/* saves last legal search order */
    static int ok_expr;

    if (key == '/' || key == '?') {

	dyn_init(&text, BUFSIZ);
	if (!(s = dlog_string(gbl, "Target: ", LINES - 1, &text, (DYN **) 0,
			      &History, EOS, BUFSIZ))
	    || !*s) {
	    UsePattern = FALSE;
	    return;
	}
	if (key == '/')
	    order = 1;
	if (key == '?')
	    order = -1;
	next = order;

    } else if (order && (s = dyn_string(text))) {
	next = (key == 'n') ? order : -order;
    } else {
	waitmsg("No previous regular expression");
	return;
    }

    if (ok_expr)
	OLD_REGEX(ToFind);
    if ((ok_expr = NEW_REGEX(ToFind, s)) != 0) {

	UsePattern = TRUE;
	if (SamePattern(s)) {
	    if (ispunct(key))
		return;
	} else {
	    if (next < 0) ;
	    else if (JumpBackwards(infile, NumP(1)) < 0)
		return;
	}

	if (next < 0) {
	    while (JumpBackwards(infile, NumP(2)) >= 0) {
		if (FoundPattern(infile))
		    return;
	    }
	} else {
	    while (!feof(InFile)) {
		if (FoundPattern(infile))
		    return;
	    }
	}

	*infile = TopOfPage(save, &foo);
	if (JumpToLine(*infile) >= 0)
	    (void) StartPage(infile, FALSE, &foo);
	waitmsg("Expression not found");

    } else {
	order = 0;
	UsePattern = FALSE;
	BAD_REGEX(ToFind);
	showC(gbl);
    }
}