Beispiel #1
0
int 
show_file(char *filename, int y, int lines, int mode)
{
  FILE *fp;
  char buf[512], *str, shift;
  int num;


  /*
   * hialan: shift 0: no control word 1: is control word 2: change line word
   */

  clrchyiuan(y, y + lines);
  move(y, 0);
  if ((fp = fopen(filename, "r")))
  {
    while (fgets(buf, 512, fp) && lines--)
    {
      Ptt_prints(buf, mode);
      for (str = buf, shift = num = 0; *str; str++)
      {
	if (str[0] == '\033' && str[1] == '[')
	  shift = 1;

	if (*str == '\n' || *str == '\r')
	  shift = 2;

	outc(*str);

	if (!shift)
	  num++;

	if (shift && *str == 'm')
	  shift = 0;

	if (num >= 80 || shift == 2)
	{
	  if (shift != 2)
	    outc('\n');
	  break;
	}
      }
    }
    fclose(fp);
  }
  else
    return 0;

  return 1;
}
Beispiel #2
0
/**
 * 從第 y 列開始 show 出 filename 檔案中的前 lines 行。
 * mode 為 output 的模式,參數同 strip_ansi。
 * @param filename: the file to show
 * @param y:	    starting line on screen
 * @param lines:    max lines to be displayed
 * @param mode:	    SHOWFILE_*, see modes.h
 * @return 失敗傳回 0,否則為 1。
 *         2 表示有 PttPrints 碼
 */
int
show_file(const char *filename, int y, int lines, int mode)
{
    FILE *fp;
    char buf[ANSILINELEN];
    int  ret = 1;
    int  strpmode = STRIP_ALL;

    if (mode & SHOWFILE_ALLOW_COLOR)
	strpmode = ONLY_COLOR;
    if (mode & SHOWFILE_ALLOW_MOVE)
	strpmode = NO_RELOAD;

    if (y >= 0)
	move(y, 0);
    clrtoln(lines + y);
    if ((fp = fopen(filename, "r"))) {
	while (fgets(buf, sizeof(buf), fp) && lines--)
	{
	    move(y++, 0);
	    if (mode == SHOWFILE_RAW)
	    {
		outs(buf);
	    }
	    else if ((mode & SHOWFILE_ALLOW_STAR) && (strstr(buf, ESC_STR "*") != NULL))
	    {
		// because Ptt_prints escapes are not so often,
		// let's try harder to detect it.
		outs(Ptt_prints(buf, sizeof(buf), strpmode));
		ret = 2;
	    } else {
		// ESC is very common...
		strip_ansi(buf, buf, strpmode);
		outs(buf);
	    }
	}
	fclose(fp);
	outs(ANSI_RESET); // prevent some broken Welcome file
    } else
	return 0;
    return ret;
}
Beispiel #3
0
int 
more(char *fpath, int promptend)
{
  extern char *strcasestr();
  static char *head[4] = {"§@ªÌ", "¼ÐÃD", "®É¶¡", "Âà«H"};
  char *ptr, *word, buf[1024], *ch1;
  struct stat st;
  FILE *fp;
  usint pagebreak[MAXPAGES], pageno, lino;
  int line, ch, viewed, pos, numbytes;
  int header = 0;
  int local = 0;
  char search_char0 = 0;
  static char search_str[81] = "";
  typedef char *(*FPTR) ();
  static FPTR fptr;
  int searching = 0;
  int scrollup = 0;
  char *http[80] = {
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  /* Ptt */
  char pagemode = 0;
  char pagecount = 0;

  inmore = 1;
  memset(pagebreak, 0, sizeof(pagebreak));
  if (*search_str)
    search_char0 = *search_str;
  *search_str = 0;
  if (!(fp = fopen(fpath, "r")))
  {
    inmore = 0;
    return -1;
  }

  if (fstat(fileno(fp), &st))
  {
    inmore = 0;
    fclose(fp);
    return -1;
  }

  pagebreak[0] = pageno = viewed = line = pos = 0;
  clear();

  while ((numbytes = readln(fp, buf)) || (line == t_lines))
  {
    if (scrollup)
    {
      rscroll();
      move(0, 0);
    }
    if (numbytes)		/* ¤@¯ë¸ê®Æ³B²z */
    {
      if (!viewed)		/* begin of file */
      {
	if (showansi)		/* header processing */
	{
	  if (!strncmp(buf, str_author1, LEN_AUTHOR1))
	  {
	    line = 3;
	    word = buf + LEN_AUTHOR1;
	    local = 1;
	  }
	  else if (!strncmp(buf, str_author2, LEN_AUTHOR2))
	  {
	    line = 4;
	    word = buf + LEN_AUTHOR2;
	  }

	  while (pos < line)
	  {
	    if (!local)
	      str_decode(word);

	    if (!pos && ((ptr = strstr(word, str_post1)) ||
			 (ptr = strstr(word, str_post2))))
	    {
	      ptr[-1] = '\0';

	      /* hialan §ïÃC¦â */
	      clrtoeol();
	      prints("¢~\033[46;37m%s\033[m%-55.55s%.4s\033[1;33m%-13s\033[36m¢¡\n", head[0], word, ptr, ptr + 5);
	    }
	    else if (pos < (local ? 3 : 4))
	    {
	      clrtoeol();
	      prints("¢x\033[46;37m%s\033[m%-72.72s¢x\033[m\n", head[pos], word);
	    }

	    viewed += numbytes;
	    numbytes = readln(fp, buf);

	    if (!pos && viewed >= 79)	/* ²Ä¤@¦æ¤Óªø¤F */
	    {
	      if (memcmp(buf, head[1], 2))	/* ²Ä¤G¦æ¤£¬O [¼Ð....] */
	      {
		viewed += numbytes;	/* Ū¤U¤@¦æ¶i¨Ó³B²z */
		numbytes = readln(fp, buf);
	      }
	    }

	    pos++;
	  }
	  if (pos)
	  {
	    header = 1;

	    outs("¢¢¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w\033[0;30;47m y)¦^À³  /)·j´M¤å¦r  =[]<>)¥DÃD¦¡¾\\Ū \033[0;1;36m¢£\n");

	    line = pos = (local ? 4 : 5);
	  }
	}
	lino = pos;
	word = NULL;
      }
      /* ¡°³B²z¤Þ¥ÎªÌ & ¤Þ¨¥ */

      if ((buf[1] == ' ') && (buf[0] == ':' || buf[0] == '>'))
	word = "";
      if ((buf[1] == ' ') && (buf[0] == ':' || buf[0] == '>') && (buf[2] == ':' || buf[2] == '>'))
	word = "";
      if ((buf[0] == '¡' && buf[1] == '°') || !strncmp(buf, "==>", 3))
	word = "";

      ch1 = buf;
      while (1)			/* Ptt */
      {
	int i;
	char e, *ch2;
	if (ch2 = strstr(ch1, "gopher://"));
	else if (ch2 = strstr(ch1, "mailto:"));
	else if (ch2 = strstr(ch1, "board://"));	/* ¤ä´©ª½±µ¶i¤J¬ÝªO */
	else
	  break;

	for (e = 0; ch2[e] != ' ' && ch2[e] != '\n' && ch2[e] != '\0'
	     && ch2[e] != '"' && ch2[e] != ';' && ch2[e] != ']'; e++);
	for (i = 0; http[i] && i < 80; i++)
	  if (!strncmp(http[i], ch2, e) && http[e] == 0)
	    break;
	if (!http[i])
	{
	  http[i] = (char *)malloc(e + 1);
	  strncpy(http[i], ch2, e);
	  http[i][e] = 0;
	  pagecount++;
	}
	ch1 = &ch2[7];
      }

      if (word)
	outs(word);
      {
	char msg[500], *pos;

	if (*search_str && (pos = fptr(buf, search_str)))
	{
	  char SearchStr[41];
	  char buf1[100], *pos1;

	  strncpy(SearchStr, pos, strlen(search_str));
	  SearchStr[strlen(search_str)] = 0;
	  searching = 0;
	  sprintf(msg, "%.*s%s", pos - buf, buf,
		  SearchStr);
	  while (pos = fptr(pos1 = pos + strlen(search_str), search_str))
	  {
	    sprintf(buf1, "%.*s%s", pos - pos1, pos1, SearchStr);
	    strcat(msg, buf1);
	  }
	  strcat(msg, pos1);
	  outs(Ptt_prints(msg, NO_RELOAD));
	}
	else
	{
	  outs(Ptt_prints(buf, NO_RELOAD));
	}
      }
      if (word)
      {
	outs("");
	word = NULL;
      }
      outc('\n');

      if (beep)
      {
	bell();
	beep = 0;
      }

      if (line < b_lines)	/* ¤@¯ë¸ê®ÆŪ¨ú */
	line++;

      if (line == b_lines && searching == -1)
      {
	if (pageno > 0)
	  fseek(fp, (off_t) (viewed = pagebreak[--pageno]), SEEK_SET);
	else
	  searching = 0;
	lino = pos = line = 0;
	clear();
	continue;
      }

      if (scrollup)
      {
	move(line = b_lines, 0);
	clrtoeol();
	for (pos = 1; pos < b_lines; pos++)
	  viewed += readln(fp, buf);
      }
      else if (pos == b_lines)	/* ±²°Ê¿Ã¹õ */
	scroll();
      else
	pos++;


      if (!scrollup && ++lino >= b_lines && pageno < MAXPAGES - 1)
      {
	pagebreak[++pageno] = viewed;
	lino = 1;
      }

      if (scrollup)
      {
	lino = scrollup;
	scrollup = 0;
      }
      viewed += numbytes;	/* ²Ö­pŪ¹L¸ê®Æ */
    }
    else
      line = b_lines;		/* end of END */


    if (promptend && (!searching && line == b_lines || viewed == st.st_size))
    {
      move(b_lines, 0);
      if (viewed == st.st_size)
      {
	if (searching == 1)
	  searching = 0;
      }
      else if (pageno == 1 && lino == 1)
      {
	if (searching == -1)
	  searching = 0;
      }
      prints("%s  ÂsÄý P.%d(%d%%)  ", COLOR2, pageno, (viewed * 100) / st.st_size);
      prints("%s                 ¡ö¡ô¡õ¡÷|PgUp|PgDn|Home|End)¾ÉÄý  h)»¡©ú \033[m", COLOR3);

      move(b_lines, 0);		/* ¸Ñ¨Mª½±µ¸õ¨ì¬ÝªOªºBug */
      while (line == b_lines || (line > 0 && viewed == st.st_size))
      {
	switch (ch = igetkey())
	{
	case 'h':
	case 'H':
	case '?':
	  show_file("etc/help/MORE.help", 0, 24, ONLY_COLOR);
	  pressanykey_old(NULL);
	  if (pageno)
	    pageno--;
	  lino = line = 0;
	  break;
	case ':':
	  {
	    char buf[10];
	    int i = 0;

	    getdata(b_lines - 1, 0, "Goto Page: ", buf, 5, DOECHO, 0);
	    sscanf(buf, "%d", &i);
	    if (0 < i && i < MAXPAGES && (i == 1 || pagebreak[i - 1]))
	      pageno = i - 1;
	    else if (pageno)
	      pageno--;
	    lino = line = 0;
	    break;
	  }

	case '/':
	  {
	    char ans[4] = "n";
	    *search_str = search_char0;
	    getdata(b_lines - 1, 0, "[·j´M]ÃöÁä¦r:", search_str, 40, DOECHO, 0);
	    if (*search_str)
	    {
	      searching = 1;
	      if (getdata(b_lines - 1, 0, "°Ï¤À¤j¤p¼g(Y/N/Q)? [N] ", ans, 4, LCECHO, 0) && *ans == 'y')
		fptr = strstr;
	      else
		fptr = strcasestr;
	    }
	    if (*ans == 'q')
	      searching = 0;
	    if (pageno)
	      pageno--;
	    lino = line = 0;
	    break;
	  }
	case 'n':
	  if (*search_str)
	  {
	    searching = 1;
	    if (pageno)
	      pageno--;
	    lino = line = 0;
	  }
	  break;
	case 'N':
	  if (*search_str)
	  {
	    searching = -1;
	    if (pageno)
	      pageno--;
	    lino = line = 0;
	  }
	  break;
	case 'r':
	case 'R':
	case 'Y':
	case 'y':
	case 'A':
	case 'a':
	case 'F':
	case 'B':
	case KEY_LEFT:
	case 'q':
	case 'b':
	case 'f':
	case ']':		/* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */
	case '[':		/* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */
	case '=':		/* Kaede ¬°¤F¥DÃD¾\Ū¤è«K */
	  fclose(fp);
	  inmore = 0;
	  return ch;
	  
	case Ctrl('F'):
	case KEY_PGDN:
	  line = 1;
	  break;
	case 't':
	  if (viewed == st.st_size)
	  {			/* ch ']' */
	    fclose(fp);
	    inmore = 0;
	    return ']';
	  }
	  line = 1;
	  break;
	case ' ':
	  if (viewed == st.st_size)
	  {			/* ch 'f' */
	    fclose(fp);
	    inmore = 0;
	    return 'f';
	  }
	  line = 1;
	  break;
	case KEY_RIGHT:
	  if (viewed == st.st_size)
	  {			/* ch 'q' */
	    fclose(fp);
	    inmore = 0;
	    return 'q';
	  }
	  line = 1;
	  pagemode = 0;
	  break;
	case '\r':
	case '\n':
	  if (pagemode)
	  {
	    more_web(http[pagemode - 1], YEA);
	    /* pagebreak[0] = pageno = viewed = line = pos = 0; */
	    pagemode = 0;
	    *search_str = 0;
	    if (pageno)
	      pageno--;
	    lino = line = 0;
	    break;
	  }

	case KEY_DOWN:
	  if (viewed == st.st_size ||
	      promptend == 2 && (ch == '\r' || ch == '\n'))
	  {					/* ch 'f' */
	    fclose(fp);		
	    inmore = 0;
	    return 'f';
	  }
	  line = t_lines - 2;
	  break;

	case '$':
	case 'G':
	case KEY_END:
	  line = t_lines;
	  break;

	case '0':
	case 'g':
	case KEY_HOME:
	  pageno = line = 0;
	  break;

	case 'E':
	  if (strcmp(fpath, "etc/ve.hlp"))
	  {			/* ch 'q' */
	    fclose(fp);
	    inmore = 0;
	    vedit(fpath, HAS_PERM(PERM_SYSOP) ? 0 : 2);
	    return 'q';
	  }
	  break;

	case KEY_ESC:
	  if (KEY_ESC_arg == 'n')
	  {
	    edit_note();
	    if (pageno)
	      pageno--;
	    lino = line = 0;
	  }
	  else if (KEY_ESC_arg == 'c')
	    capture_screen();
	  break;

	case Ctrl('I'):
	  if (!pagecount)
	    break;
	  pagemode = (pagemode % pagecount) + 1;
	  strcpy(search_str, http[pagemode - 1]);
	  fptr = strstr;
	  if (pageno)
	    pageno--;
	  lino = line = 0;
	  break;

	case KEY_UP:
	  line = -1;
	  break;

	case Ctrl('B'):
	case KEY_PGUP:
	  if (pageno > 1)
	  {
	    if (lino < 2)
	      pageno -= 2;
	    else
	      pageno--;
	    lino = line = 0;
	  }
	  else if (pageno && lino > 1)
	    pageno = line = 0;
	  break;
	case Ctrl('H'):
	  if (pageno > 1)
	  {
	    if (lino < 2)
	      pageno -= 2;
	    else
	      pageno--;
	    lino = line = 0;
	  }
	  else if (pageno && lino > 1)
	    pageno = line = 0;
	  else
	  {			/* ch 'b' */
	    fclose(fp);
	    inmore = 0;
	    return 'b';
	  }
	}
      }

      if (line > 0)
      {
	move(b_lines, 0);
	clrtoeol();
	refresh();
      }
      else if (line < 0)
      {				/* Line scroll up */
	if (pageno <= 1)
	{
	  if (lino == 1 || !pageno)
	  {			/* ch 'b' */
	    fclose(fp);
	    inmore = 0;
	    return 'b';
	  }

	  /* ­¶¤º¤W±² sheng 20020113 */
	  if (header && lino <= 6 - local)
	  {
	    fseek(fp, (off_t) (viewed = pagebreak[scrollup = lino = pageno = 0] = 0), SEEK_SET);
	    clear();
	  }
	}

	if (pageno && lino > 1)
	{
	  line = lino - 2;
	  if (pageno == 1 && header)
	    line = lino - 3;

	  scrollup = lino - 1;
	  fseek(fp, (off_t) (viewed = pagebreak[pageno - 1]), SEEK_SET);
	  while (line--)
	    viewed += readln(fp, buf);
	}
	else if (pageno > 1)
	{
	  scrollup = b_lines - 1;

	  line = b_lines - 2;
	  if (pageno == 2 && header)
	    line = b_lines - 3;

	  fseek(fp, (off_t) (viewed = pagebreak[--pageno - 1]), SEEK_SET);
	  while (line--)
	    viewed += readln(fp, buf);
	}
	line = pos = 0;
      }
      else
      {
	pos = 0;
	fseek(fp, (off_t) (viewed = pagebreak[pageno]), SEEK_SET);
	clear();
      }
    }
  }

  fclose(fp);
  if (promptend)
  {
    pressanykey(NULL);
    clear();
  }
  else
    outs(reset_color);

  inmore = 0;
  return 'q';		/* ch 'q'*/
}