summaryrefslogtreecommitdiffstats
path: root/mbbsd/pmore.c
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-15 22:18:55 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-03-15 22:18:55 +0800
commitea9c870ae1208a0b6032102591dcecc76a897b2f (patch)
treed4ab8a91388390332849c6026bd46bcd0ccc4390 /mbbsd/pmore.c
parent7edce5f16e016665ada2d55aa5528ea947907fab (diff)
downloadpttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar.gz
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar.bz2
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar.lz
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar.xz
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.tar.zst
pttbbs-ea9c870ae1208a0b6032102591dcecc76a897b2f.zip
- Happy r4000!
- source code retab. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4000 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/pmore.c')
-rw-r--r--mbbsd/pmore.c4484
1 files changed, 2242 insertions, 2242 deletions
diff --git a/mbbsd/pmore.c b/mbbsd/pmore.c
index ea460ea4..fde26f3a 100644
--- a/mbbsd/pmore.c
+++ b/mbbsd/pmore.c
@@ -58,24 +58,24 @@
/* These are default values.
* You may override them in your bbs.h or config.h etc etc.
*/
-#define PMORE_PRELOAD_SIZE (64*1024L) // on busy system set smaller or undef
-
-#define PMORE_USE_PTT_PRINTS // support PTT or special printing
-#define PMORE_USE_OPT_SCROLL // optimized scroll
-#define PMORE_USE_DBCS_WRAP // safe wrap for DBCS.
-#define PMORE_USE_ASCII_MOVIE // support ascii movie
-//#define PMORE_RESTRICT_ANSI_MOVEMENT // user cannot use ANSI escapes to move
-#define PMORE_ACCURATE_WRAPEND // try more harder to find file end in wrap mode
-#define PMORE_TRADITIONAL_PROMPTEND // when prompt=NA, show only page 1
-#define PMORE_TRADITIONAL_FULLCOL // to work with traditional ascii arts
-#define PMORE_LOG_SYSOP_EDIT // log whenever sysop uses E
-#define PMORE_OVERRIDE_TIME // override time format if possible
+#define PMORE_PRELOAD_SIZE (64*1024L) // on busy system set smaller or undef
+
+#define PMORE_USE_PTT_PRINTS // support PTT or special printing
+#define PMORE_USE_OPT_SCROLL // optimized scroll
+#define PMORE_USE_DBCS_WRAP // safe wrap for DBCS.
+#define PMORE_USE_ASCII_MOVIE // support ascii movie
+//#define PMORE_RESTRICT_ANSI_MOVEMENT // user cannot use ANSI escapes to move
+#define PMORE_ACCURATE_WRAPEND // try more harder to find file end in wrap mode
+#define PMORE_TRADITIONAL_PROMPTEND // when prompt=NA, show only page 1
+#define PMORE_TRADITIONAL_FULLCOL // to work with traditional ascii arts
+#define PMORE_LOG_SYSOP_EDIT // log whenever sysop uses E
+#define PMORE_OVERRIDE_TIME // override time format if possible
// if you are working with a terminal without ANSI control,
// you are using a poor term (define PMORE_USING_POOR_TERM).
-#ifndef USE_PFTERM // pfterm is a good terminal system.
+#ifndef USE_PFTERM // pfterm is a good terminal system.
#define PMORE_USING_POOR_TERM
-#define PMORE_WORKAROUND_CLRTOEOL // try to work with poor terminal sys
+#define PMORE_WORKAROUND_CLRTOEOL // try to work with poor terminal sys
#endif // USE_PFTERM
// -------------------------------------------------------------- </FEATURES>
@@ -190,9 +190,9 @@ int debug = 0;
#endif
/* DBCS users tend to write unsigned char. let's make compiler happy */
-#define ustrlen(x) strlen((char*)x)
-#define ustrchr(x,y) (unsigned char*)strchr((char*)x, y)
-#define ustrrchr(x,y) (unsigned char*)strrchr((char*)x, y)
+#define ustrlen(x) strlen((char*)x)
+#define ustrchr(x,y) (unsigned char*)strchr((char*)x, y)
+#define ustrrchr(x,y) (unsigned char*)strrchr((char*)x, y)
// --------------------------------------------- <Defines and constants>
@@ -212,13 +212,13 @@ int debug = 0;
#define ESC_CHR '\x1b'
// Common ANSI commands.
-#define ANSI_RESET ESC_STR "[m"
-#define ANSI_COLOR(x) ESC_STR "[" #x "m"
-#define ANSI_CLRTOEND ESC_STR "[K"
+#define ANSI_RESET ESC_STR "[m"
+#define ANSI_COLOR(x) ESC_STR "[" #x "m"
+#define ANSI_CLRTOEND ESC_STR "[K"
#define ANSI_MOVETO(y,x) ESC_STR "[" #y ";" #x "H"
#define ANSI_IN_ESCAPE(x) (((x) >= '0' && (x) <= '9') || \
- (x) == ';' || (x) == ',' || (x) == '[')
+ (x) == ';' || (x) == ',' || (x) == '[')
#endif /* PMORE_STYLE_ANSI */
@@ -245,7 +245,7 @@ pmore_clrtoeol(int y, int x)
int i;
move(y, x);
for (i = x; i < t_columns; i++)
- outc(' ');
+ outc(' ');
clrtoeol();
move(y, x); // this is required, due to outc().
#else
@@ -260,44 +260,44 @@ pmore_clrtoeol(int y, int x)
typedef struct
{
unsigned char
- *start, *end, // file buffer
- *disps, *dispe, // displayed content start/end
- *maxdisps; // a very special pointer,
- // consider as "disps of last page"
- off_t len; // file total length
- long lineno, // lineno of disps
- oldlineno, // last drawn lineno, < 0 means full update
- xpos, // starting x position
- //
- wraplines, // wrapped lines in last display
- trunclines, // truncated lines in last display
- dispedlines, // how many different lines displayed
- // usually dispedlines = PAGE-wraplines,
- // but if last line is incomplete(wrapped),
- // dispedlines = PAGE-wraplines + 1
- lastpagelines,// lines of last page to show
- // this indicates how many lines can
- // maxdisps(maxlinenoS) display.
- maxlinenoS; // lineno of maxdisps, "S"!
- // What does the magic "S" mean?
- // Just trying to notify you that it's
- // NOT REAL MAX LINENO NOR FILELENGTH!!!
- // You may consider "S" of "Start" (disps).
+ *start, *end, // file buffer
+ *disps, *dispe, // displayed content start/end
+ *maxdisps; // a very special pointer,
+ // consider as "disps of last page"
+ off_t len; // file total length
+ long lineno, // lineno of disps
+ oldlineno, // last drawn lineno, < 0 means full update
+ xpos, // starting x position
+ //
+ wraplines, // wrapped lines in last display
+ trunclines, // truncated lines in last display
+ dispedlines, // how many different lines displayed
+ // usually dispedlines = PAGE-wraplines,
+ // but if last line is incomplete(wrapped),
+ // dispedlines = PAGE-wraplines + 1
+ lastpagelines,// lines of last page to show
+ // this indicates how many lines can
+ // maxdisps(maxlinenoS) display.
+ maxlinenoS; // lineno of maxdisps, "S"!
+ // What does the magic "S" mean?
+ // Just trying to notify you that it's
+ // NOT REAL MAX LINENO NOR FILELENGTH!!!
+ // You may consider "S" of "Start" (disps).
} MmappedFile;
MmappedFile mf = {
0, 0, 0, 0, 0, 0L,
0, -1L, 0, 0, -1L, -1L, -1L,-1L
-}; // current file
+}; // current file
/* mf_* navigation commands return value meanings */
enum MF_NAV_COMMANDS {
- MFNAV_OK, // navigation ok
- MFNAV_EXCEED, // request exceeds buffer
+ MFNAV_OK, // navigation ok
+ MFNAV_EXCEED, // request exceeds buffer
};
/* Navigation units (dynamic, so not in enum const) */
-#define MFNAV_PAGE (t_lines-2) // when navigation, how many lines in a page to move
+#define MFNAV_PAGE (t_lines-2) // when navigation, how many lines in a page to move
/* Display system */
enum MF_DISP_CONST {
@@ -333,9 +333,9 @@ enum MF_DISP_CONST {
#define MFDISP_DIRTY() { mf.oldlineno = -1; }
/* Indicators */
-#define MFDISP_TRUNC_INDICATOR ANSI_COLOR(0;1;37) ">" ANSI_RESET
-#define MFDISP_WRAP_INDICATOR ANSI_COLOR(0;1;37) "\\" ANSI_RESET
-#define MFDISP_WNAV_INDICATOR ANSI_COLOR(0;1;37) "<" ANSI_RESET
+#define MFDISP_TRUNC_INDICATOR ANSI_COLOR(0;1;37) ">" ANSI_RESET
+#define MFDISP_WRAP_INDICATOR ANSI_COLOR(0;1;37) "\\" ANSI_RESET
+#define MFDISP_WNAV_INDICATOR ANSI_COLOR(0;1;37) "<" ANSI_RESET
// --------------------------- </Main Navigation>
// --------------------------- <Aux. Structures>
@@ -344,13 +344,13 @@ typedef struct
{
/* mode flags */
unsigned char
- wrapmode, // wrap?
- separator, // separator style
- wrapindicator, // show wrap indicators
+ wrapmode, // wrap?
+ separator, // separator style
+ wrapindicator, // show wrap indicators
- oldwrapmode, // traditional wrap
- oldstatusbar, // traditional statusbar
- rawmode; // show file as-is.
+ oldwrapmode, // traditional wrap
+ oldstatusbar, // traditional statusbar
+ rawmode; // show file as-is.
} MF_BrowsingPreference;
MF_BrowsingPreference bpref =
@@ -366,7 +366,7 @@ static const char *_fh_disp_heads[FH_HEADERS] =
typedef struct
{
- int lines; // header lines
+ int lines; // header lines
unsigned char *headers[FH_HEADERS];
unsigned char *floats [FH_FLOATS];
} MF_PrettyFormattedHeader;
@@ -378,7 +378,7 @@ typedef struct
{
int len;
int (*cmpfunc) (const char *, const char *, size_t);
- unsigned char *search_str; // maybe we can change to dynamic allocation
+ unsigned char *search_str; // maybe we can change to dynamic allocation
} MF_SearchRecord;
MF_SearchRecord sr = { 0, strncmp, NULL};
@@ -395,11 +395,11 @@ enum MFSEARCH_DIRECTION {
fh.lines = -1; }
// Artwork
-#define OPTATTR_NORMAL ANSI_COLOR(0;34;47)
+#define OPTATTR_NORMAL ANSI_COLOR(0;34;47)
#define OPTATTR_NORMAL_KEY ANSI_COLOR(0;31;47)
#define OPTATTR_SELECTED ANSI_COLOR(0;1;37;46)
#define OPTATTR_SELECTED_KEY ANSI_COLOR(0;31;46)
-#define OPTATTR_BAR ANSI_COLOR(0;1;30;47)
+#define OPTATTR_BAR ANSI_COLOR(0;1;30;47)
// --------------------------- </Aux. Structures>
@@ -420,22 +420,22 @@ typedef struct {
struct timeval frameclk;
struct timeval synctime;
unsigned char *options,
- *optkeys;
+ *optkeys;
unsigned char mode,
- compat24,
- interactive,
- pause;
+ compat24,
+ interactive,
+ pause;
} MF_Movie;
MF_Movie mfmovie;
-#define STOP_MOVIE() { \
+#define STOP_MOVIE() { \
mfmovie.options = NULL; \
mfmovie.pause = 0; \
if (mfmovie.mode == MFDISP_MOVIE_PLAYING) \
- mfmovie.mode = MFDISP_MOVIE_YES; \
+ mfmovie.mode = MFDISP_MOVIE_YES; \
if (mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD) \
- mfmovie.mode = MFDISP_MOVIE_NO; \
+ mfmovie.mode = MFDISP_MOVIE_NO; \
mf_determinemaxdisps(MFNAV_PAGE, 0); \
mf_forward(0); \
}
@@ -446,7 +446,7 @@ MF_Movie mfmovie;
mfmovie.optkeys = NULL; \
mfmovie.compat24 = 1; \
mfmovie.pause = 0; \
- mfmovie.interactive = 0; \
+ mfmovie.interactive = 0; \
mfmovie.synctime.tv_sec = mfmovie.synctime.tv_usec = 0; \
mfmovie.frameclk.tv_sec = 1; mfmovie.frameclk.tv_usec = 0; \
}
@@ -496,13 +496,13 @@ mf_attach(const char *fn)
int fd = open(fn, O_RDONLY, 0600);
if(fd < 0)
- return 0;
+ return 0;
if (fstat(fd, &st) || ((mf.len = st.st_size) <= 0) || S_ISDIR(st.st_mode))
{
- mf.len = 0;
- close(fd);
- return 0;
+ mf.len = 0;
+ close(fd);
+ return 0;
}
/*
@@ -511,13 +511,13 @@ mf_attach(const char *fn)
*/
mf.start = mmap(NULL, mf.len, PROT_READ,
- MF_MMAP_OPTION, fd, 0);
+ MF_MMAP_OPTION, fd, 0);
close(fd);
if(mf.start == MAP_FAILED)
{
- RESETMF();
- return 0;
+ RESETMF();
+ return 0;
}
// BSD mmap advise. comment if your OS does not support this.
@@ -537,10 +537,10 @@ mf_attach(const char *fn)
/* a workaround for wrapped separators */
if(mf.maxlinenoS > 0 &&
- fh.lines >= mf.maxlinenoS &&
- bpref.separator & MFDISP_SEP_WRAP)
+ fh.lines >= mf.maxlinenoS &&
+ bpref.separator & MFDISP_SEP_WRAP)
{
- mf_determinemaxdisps(+1, 1);
+ mf_determinemaxdisps(+1, 1);
}
return 1;
@@ -551,8 +551,8 @@ mf_detach()
{
mf_freeHeaders();
if(mf.start) {
- munmap(mf.start, mf.len);
- RESETMF();
+ munmap(mf.start, mf.len);
+ RESETMF();
}
}
@@ -566,15 +566,15 @@ mf_sync_lineno()
if(mf.disps == mf.maxdisps && mf.maxlinenoS >= 0)
{
- mf.lineno = mf.maxlinenoS;
+ mf.lineno = mf.maxlinenoS;
} else {
- mf.lineno = 0;
- for (p = mf.start; p < mf.disps; p++)
- if(*p == '\n')
- mf.lineno ++;
+ mf.lineno = 0;
+ for (p = mf.start; p < mf.disps; p++)
+ if(*p == '\n')
+ mf.lineno ++;
- if(mf.disps == mf.maxdisps && mf.maxlinenoS < 0)
- mf.maxlinenoS = mf.lineno;
+ if(mf.disps == mf.maxdisps && mf.maxlinenoS < 0)
+ mf.maxlinenoS = mf.lineno;
}
}
@@ -589,35 +589,35 @@ mf_determinemaxdisps(int backlines, int update_by_offset)
if(update_by_offset)
{
- if(backlines > 0)
- {
- /* tricky way because usually
- * mf_forward checks maxdisps.
- */
- mf.disps = mf.maxdisps;
- mf.maxdisps = mf.end-1;
- mf_forward(backlines);
- mf_backward(0);
- } else
- mf_backward(backlines);
+ if(backlines > 0)
+ {
+ /* tricky way because usually
+ * mf_forward checks maxdisps.
+ */
+ mf.disps = mf.maxdisps;
+ mf.maxdisps = mf.end-1;
+ mf_forward(backlines);
+ mf_backward(0);
+ } else
+ mf_backward(backlines);
} else {
- mf.lineno = backlines;
- mf.disps = mf.end - 1;
- backlines = mf_backward(backlines);
+ mf.lineno = backlines;
+ mf.disps = mf.end - 1;
+ backlines = mf_backward(backlines);
}
if(mf.disps != mbak)
{
- mf.maxdisps = mf.disps;
- if(update_by_offset)
- mf.lastpagelines -= backlines;
- else
- mf.lastpagelines = backlines;
+ mf.maxdisps = mf.disps;
+ if(update_by_offset)
+ mf.lastpagelines -= backlines;
+ else
+ mf.lastpagelines = backlines;
- mf.maxlinenoS = -1;
+ mf.maxlinenoS = -1;
#ifdef PMORE_PRELOAD_SIZE
- if(mf.len <= PMORE_PRELOAD_SIZE)
- mf_sync_lineno(); // maxlinenoS will be automatically updated
+ if(mf.len <= PMORE_PRELOAD_SIZE)
+ mf_sync_lineno(); // maxlinenoS will be automatically updated
#endif
}
mf.disps = pbak;
@@ -643,13 +643,13 @@ mf_backward(int lines)
while (1)
{
- if (mf.disps < mf.start || *mf.disps == '\n')
- {
- real_moved ++;
- if(lines-- <= 0 || mf.disps < mf.start)
- break;
- }
- mf.disps --;
+ if (mf.disps < mf.start || *mf.disps == '\n')
+ {
+ real_moved ++;
+ if(lines-- <= 0 || mf.disps < mf.start)
+ break;
+ }
+ mf.disps --;
}
/* now disps points to previous 1 byte of new address */
@@ -667,33 +667,33 @@ mf_forward(int lines)
while(mf.disps <= mf.maxdisps && lines > 0)
{
- while (mf.disps <= mf.maxdisps && *mf.disps++ != '\n');
+ while (mf.disps <= mf.maxdisps && *mf.disps++ != '\n');
- if(mf.disps <= mf.maxdisps)
- mf.lineno++, lines--, real_moved++;
+ if(mf.disps <= mf.maxdisps)
+ mf.lineno++, lines--, real_moved++;
}
if(mf.disps > mf.maxdisps)
- mf.disps = mf.maxdisps;
+ mf.disps = mf.maxdisps;
/* please make sure you have lineno synced. */
if(mf.disps == mf.maxdisps && mf.maxlinenoS < 0)
- mf.maxlinenoS = mf.lineno;
+ mf.maxlinenoS = mf.lineno;
return real_moved;
/*
if(lines > 0)
- return MFNAV_OK;
+ return MFNAV_OK;
else
- return MFNAV_EXCEED;
- */
+ return MFNAV_EXCEED;
+ */
}
int
mf_goTop()
{
if(mf.disps == mf.start && mf.xpos > 0)
- mf.xpos = 0;
+ mf.xpos = 0;
mf.disps = mf.start;
mf.lineno = 0;
return MFNAV_OK;
@@ -738,55 +738,55 @@ mf_search(int direction)
int flFound = 0;
if(!s || !*s)
- return 0;
+ return 0;
if(direction == MFSEARCH_FORWARD)
{
- mf_forward(1);
- while(mf.disps < mf.end - l)
- {
- if(sr.cmpfunc((char*)mf.disps, (char*)s, l) == 0)
- {
- flFound = 1;
- break;
- } else {
- /* DBCS check here. */
- if(PMORE_DBCS_LEADING(*mf.disps++))
- mf.disps++;
- }
- }
- mf_backward(0);
- if(mf.disps > mf.maxdisps)
- mf.disps = mf.maxdisps;
- mf_sync_lineno();
+ mf_forward(1);
+ while(mf.disps < mf.end - l)
+ {
+ if(sr.cmpfunc((char*)mf.disps, (char*)s, l) == 0)
+ {
+ flFound = 1;
+ break;
+ } else {
+ /* DBCS check here. */
+ if(PMORE_DBCS_LEADING(*mf.disps++))
+ mf.disps++;
+ }
+ }
+ mf_backward(0);
+ if(mf.disps > mf.maxdisps)
+ mf.disps = mf.maxdisps;
+ mf_sync_lineno();
}
else if(direction == MFSEARCH_BACKWARD)
{
- mf_backward(1);
- while (!flFound && mf.disps > mf.start)
- {
- while(!flFound && mf.disps < mf.end-l && *mf.disps != '\n')
- {
- if(sr.cmpfunc((char*)mf.disps, (char*)s, l) == 0)
- {
- flFound = 1;
- } else
- {
- /* DBCS check here. */
- if(PMORE_DBCS_LEADING(*mf.disps++))
- mf.disps++;
- }
- }
- if(!flFound)
- mf_backward(1);
- }
- mf_backward(0);
- if(mf.disps < mf.start)
- mf.disps = mf.start;
- mf_sync_lineno();
+ mf_backward(1);
+ while (!flFound && mf.disps > mf.start)
+ {
+ while(!flFound && mf.disps < mf.end-l && *mf.disps != '\n')
+ {
+ if(sr.cmpfunc((char*)mf.disps, (char*)s, l) == 0)
+ {
+ flFound = 1;
+ } else
+ {
+ /* DBCS check here. */
+ if(PMORE_DBCS_LEADING(*mf.disps++))
+ mf.disps++;
+ }
+ }
+ if(!flFound)
+ mf_backward(1);
+ }
+ mf_backward(0);
+ if(mf.disps < mf.start)
+ mf.disps = mf.start;
+ mf_sync_lineno();
}
if(flFound)
- MFDISP_DIRTY();
+ MFDISP_DIRTY();
return flFound;
}
@@ -799,29 +799,29 @@ mf_search(int direction)
#define ISSPACE(x) (x <= ' ')
MFPROTO void
-pmore_str_strip_ansi(unsigned char *p) // warning: p is NULL terminated
+pmore_str_strip_ansi(unsigned char *p) // warning: p is NULL terminated
{
unsigned char *pb = p;
while (*p != 0)
{
- if (*p == ESC_CHR)
- {
- // ansi code sequence, ignore them.
- pb = p++;
- while (ANSI_IN_ESCAPE(*p))
- p++;
- memmove(pb, p, ustrlen(p)+1);
- p = pb;
- }
- else if (*p < ' ' || *p == 0xff)
- {
- // control codes, ignore them.
- // what is 0xff? old BBS does not handle telnet protocol
- // so IACs were inserted.
- memmove(p, p+1, ustrlen(p+1)+1);
- }
- else
- p++;
+ if (*p == ESC_CHR)
+ {
+ // ansi code sequence, ignore them.
+ pb = p++;
+ while (ANSI_IN_ESCAPE(*p))
+ p++;
+ memmove(pb, p, ustrlen(p)+1);
+ p = pb;
+ }
+ else if (*p < ' ' || *p == 0xff)
+ {
+ // control codes, ignore them.
+ // what is 0xff? old BBS does not handle telnet protocol
+ // so IACs were inserted.
+ memmove(p, p+1, ustrlen(p+1)+1);
+ }
+ else
+ p++;
}
}
@@ -834,16 +834,16 @@ pmore_str_chomp(unsigned char *p)
unsigned char *pb = p + ustrlen(p)-1;
while (pb >= p)
- if(ISSPACE(*pb))
- *pb-- = 0;
- else
- break;
+ if(ISSPACE(*pb))
+ *pb-- = 0;
+ else
+ break;
pb = p;
while (*pb && ISSPACE(*pb))
- pb++;
+ pb++;
if(pb != p)
- memmove(p, pb, ustrlen(pb)+1);
+ memmove(p, pb, ustrlen(pb)+1);
}
#if 0
@@ -863,13 +863,13 @@ mf_freeHeaders()
{
if(fh.lines > 0)
{
- int i;
+ int i;
- for (i = 0; i < FH_HEADERS; i++)
- free(fh.headers[i]);
- for (i = 0; i < FH_FLOATS; i++)
- free(fh.floats[i]);
- RESETFH();
+ for (i = 0; i < FH_HEADERS; i++)
+ free(fh.headers[i]);
+ for (i = 0; i < FH_FLOATS; i++)
+ free(fh.floats[i]);
+ RESETFH();
}
}
@@ -878,8 +878,8 @@ mf_parseHeaders()
{
/* file format:
* AUTHOR: author BOARD: blah <- headers[0], floats[0], floats[1]
- * XXX: xxx <- headers[1]
- * XXX: xxx <- headers[n]
+ * XXX: xxx <- headers[1]
+ * XXX: xxx <- headers[n]
* [blank, fill with separator] <- lines
*
* #define STR_AUTHOR1 "§@ªÌ:"
@@ -891,88 +891,88 @@ mf_parseHeaders()
RESETFH();
if(mf.len < LEN_AUTHOR2)
- return;
+ return;
if (strncmp((char*)mf.start, STR_AUTHOR1, LEN_AUTHOR1) == 0)
{
- fh.lines = 3; // local
+ fh.lines = 3; // local
}
else if (strncmp((char*)mf.start, STR_AUTHOR2, LEN_AUTHOR2) == 0)
{
- fh.lines = 4;
+ fh.lines = 4;
}
else
- return;
+ return;
for (i = 0; i < fh.lines; i++)
{
- unsigned char *p = pmf, *pb = pmf;
- int l;
-
- /* first, go to line-end */
- while(pmf < mf.end && *pmf != '\n')
- pmf++;
- if(pmf >= mf.end)
- break;
- p = pmf;
- pmf ++; // move to next line.
-
- // p is pointing at a new line. (\n)
- l = (int)(p - pb);
+ unsigned char *p = pmf, *pb = pmf;
+ int l;
+
+ /* first, go to line-end */
+ while(pmf < mf.end && *pmf != '\n')
+ pmf++;
+ if(pmf >= mf.end)
+ break;
+ p = pmf;
+ pmf ++; // move to next line.
+
+ // p is pointing at a new line. (\n)
+ l = (int)(p - pb);
#ifdef CRITICAL_MEMORY
- // kcwu: dirty hack, avoid 64byte slot. use 128byte slot instead.
- if (l<100) {
- p = (unsigned char*) malloc (100+1);
- } else {
- p = (unsigned char*) malloc (l+1);
- }
+ // kcwu: dirty hack, avoid 64byte slot. use 128byte slot instead.
+ if (l<100) {
+ p = (unsigned char*) malloc (100+1);
+ } else {
+ p = (unsigned char*) malloc (l+1);
+ }
#else
- p = (unsigned char*) malloc (l+1);
+ p = (unsigned char*) malloc (l+1);
#endif
- fh.headers[i] = p;
- memcpy(p, pb, l);
- p[l] = 0;
+ fh.headers[i] = p;
+ memcpy(p, pb, l);
+ p[l] = 0;
- // now, postprocess p.
- pmore_str_strip_ansi(p);
+ // now, postprocess p.
+ pmore_str_strip_ansi(p);
#ifdef PMORE_OVERRIDE_TIME
- // (deprecated: too many formats for newsgroup)
- // try to see if this is a valid time line
- // use strptime to convert
+ // (deprecated: too many formats for newsgroup)
+ // try to see if this is a valid time line
+ // use strptime to convert
#endif // PMORE_OVERRIDE_TIME
- // strip to quotes[+1 space]
- if((pb = ustrchr((char*)p, ':')) != NULL)
- {
- if(*(pb+1) == ' ') pb++;
- memmove(p, pb, ustrlen(pb)+1);
- }
-
- // kill staring and trailing spaces
- pmore_str_chomp(p);
-
- // special case, floats are in line[0].
- if(i == 0 && (pb = ustrrchr(p, ':')) != NULL && *(pb+1))
- {
- unsigned char *np = (unsigned char*)strdup((char*)(pb+1));
-
- fh.floats[1] = np;
- pmore_str_chomp(np);
- // remove quote and traverse back
- *pb-- = 0;
- while (pb > p && *pb != ',' && !(ISSPACE(*pb)))
- pb--;
-
- if (pb > p) {
- fh.floats[0] = (unsigned char*)strdup((char*)(pb+1));
- pmore_str_chomp(fh.floats[0]);
- *pb = 0;
- pmore_str_chomp(fh.headers[0]);
- } else {
- fh.floats[0] = (unsigned char*)strdup("");
- }
- }
+ // strip to quotes[+1 space]
+ if((pb = ustrchr((char*)p, ':')) != NULL)
+ {
+ if(*(pb+1) == ' ') pb++;
+ memmove(p, pb, ustrlen(pb)+1);
+ }
+
+ // kill staring and trailing spaces
+ pmore_str_chomp(p);
+
+ // special case, floats are in line[0].
+ if(i == 0 && (pb = ustrrchr(p, ':')) != NULL && *(pb+1))
+ {
+ unsigned char *np = (unsigned char*)strdup((char*)(pb+1));
+
+ fh.floats[1] = np;
+ pmore_str_chomp(np);
+ // remove quote and traverse back
+ *pb-- = 0;
+ while (pb > p && *pb != ',' && !(ISSPACE(*pb)))
+ pb--;
+
+ if (pb > p) {
+ fh.floats[0] = (unsigned char*)strdup((char*)(pb+1));
+ pmore_str_chomp(fh.floats[0]);
+ *pb = 0;
+ pmore_str_chomp(fh.headers[0]);
+ } else {
+ fh.floats[0] = (unsigned char*)strdup("");
+ }
+ }
}
}
@@ -983,7 +983,7 @@ MFPROTO void
MFDISP_SKIPCURLINE()
{
while (mf.dispe < mf.end && *mf.dispe != '\n')
- mf.dispe++;
+ mf.dispe++;
}
MFPROTO int
@@ -996,17 +996,17 @@ MFDISP_PREDICT_LINEWIDTH(unsigned char *p)
while (p < mf.end && *p != '\n')
{
- if(inAnsi)
- {
- if(!ANSI_IN_ESCAPE(*p))
- inAnsi = 0;
- } else {
- if(*p == ESC_CHR)
- inAnsi = 1;
- else
- off ++;
- }
- p++;
+ if(inAnsi)
+ {
+ if(!ANSI_IN_ESCAPE(*p))
+ inAnsi = 0;
+ } else {
+ if(*p == ESC_CHR)
+ inAnsi = 1;
+ else
+ off ++;
+ }
+ p++;
}
return off;
}
@@ -1022,8 +1022,8 @@ MFDISP_DBCS_HEADERWIDTH(int originalw)
#define MFDISP_FORCEUPDATE2BOT() { endline = MFDISP_PAGE - 1; }
#define MFDISP_FORCEDIRTY2BOT() \
if(optimized == MFDISP_OPT_OPTIMIZED) { \
- optimized = MFDISP_OPT_FORCEDIRTY; \
- MFDISP_FORCEUPDATE2BOT(); \
+ optimized = MFDISP_OPT_FORCEDIRTY; \
+ MFDISP_FORCEUPDATE2BOT(); \
}
static char *override_msg = NULL;
@@ -1056,7 +1056,7 @@ mf_display()
int newline_default = MFDISP_NEWLINE_CLEAR;
if(mf.wraplines || mf.trunclines)
- MFDISP_DIRTY(); // we can't scroll with wrapped lines.
+ MFDISP_DIRTY(); // we can't scroll with wrapped lines.
mf.wraplines = 0;
mf.trunclines = 0;
@@ -1072,562 +1072,562 @@ mf_display()
// Let's enable for good terminals (which does not need workarounds)
if (MOVIE_IS_PLAYING())
{
- clear(); move(0, 0);
+ clear(); move(0, 0);
} else
#endif // PMORE_USE_ASCII_MOVIE && (!PMORE_USING_POOR_TERM)
/* process scrolling */
if (mf.oldlineno >= 0 && mf.oldlineno != mf.lineno)
{
- int scrll = mf.lineno - mf.oldlineno, i;
- int reverse = (scrll > 0 ? 0 : 1);
-
- if(reverse)
- scrll = -scrll;
- else
- {
- /* because bottom status line is also scrolled,
- * we have to erase it here.
- */
- pmore_clrtoeol(b_lines, 0);
- // move(b_lines, 0);
- // clrtoeol();
- }
-
- if(scrll > MFDISP_PAGE)
- scrll = MFDISP_PAGE;
-
- i = scrll;
+ int scrll = mf.lineno - mf.oldlineno, i;
+ int reverse = (scrll > 0 ? 0 : 1);
+
+ if(reverse)
+ scrll = -scrll;
+ else
+ {
+ /* because bottom status line is also scrolled,
+ * we have to erase it here.
+ */
+ pmore_clrtoeol(b_lines, 0);
+ // move(b_lines, 0);
+ // clrtoeol();
+ }
+
+ if(scrll > MFDISP_PAGE)
+ scrll = MFDISP_PAGE;
+
+ i = scrll;
#if defined(USE_PFTERM)
- // In fact, pfterm will flash black screen when scrolling pages...
- // So it may work better if we refresh whole screen.
- if (i >= b_lines / 2)
- {
- clear(); move(0, 0);
- scrll = MFDISP_PAGE;
- } else
+ // In fact, pfterm will flash black screen when scrolling pages...
+ // So it may work better if we refresh whole screen.
+ if (i >= b_lines / 2)
+ {
+ clear(); move(0, 0);
+ scrll = MFDISP_PAGE;
+ } else
#endif // defined(USE_PFTERM)
- while(i-- > 0)
- if (reverse)
- rscroll(); // v
- else
- scroll(); // ^
-
- if(reverse)
- {
- endline = scrll-1; // v
- // clear the line which will be scrolled
- // to bottom (status line position).
- pmore_clrtoeol(b_lines, 0);
- // move(b_lines, 0);
- // clrtoeol();
- }
- else
- {
- startline = MFDISP_PAGE - scrll; // ^
- }
- move(startline, 0);
- optimized = MFDISP_OPT_OPTIMIZED;
- // return; // uncomment if you want to observe scrolling
+ while(i-- > 0)
+ if (reverse)
+ rscroll(); // v
+ else
+ scroll(); // ^
+
+ if(reverse)
+ {
+ endline = scrll-1; // v
+ // clear the line which will be scrolled
+ // to bottom (status line position).
+ pmore_clrtoeol(b_lines, 0);
+ // move(b_lines, 0);
+ // clrtoeol();
+ }
+ else
+ {
+ startline = MFDISP_PAGE - scrll; // ^
+ }
+ move(startline, 0);
+ optimized = MFDISP_OPT_OPTIMIZED;
+ // return; // uncomment if you want to observe scrolling
}
else
#endif
- clear(), move(0, 0);
+ clear(), move(0, 0);
mf.dispe = mf.disps;
while (lines < MFDISP_PAGE)
{
- int inAnsi = 0;
- int newline = newline_default;
- int predicted_linewidth = -1;
- int xprefix = mf.xpos;
+ int inAnsi = 0;
+ int newline = newline_default;
+ int predicted_linewidth = -1;
+ int xprefix = mf.xpos;
#ifdef PMORE_USE_DBCS_WRAP
- unsigned char *dbcs_incomplete = NULL;
+ unsigned char *dbcs_incomplete = NULL;
#endif
- currline = mf.lineno + lines;
- col = 0;
+ currline = mf.lineno + lines;
+ col = 0;
- if(!wrapping && mf.dispe < mf.end)
- mf.dispedlines++;
+ if(!wrapping && mf.dispe < mf.end)
+ mf.dispedlines++;
- if(optimized == MFDISP_OPT_FORCEDIRTY)
- {
- /* btw, apparently this line should be visible.
- * if not, maybe something wrong.
- */
- pmore_clrtoeol(lines, 0);
- }
+ if(optimized == MFDISP_OPT_FORCEDIRTY)
+ {
+ /* btw, apparently this line should be visible.
+ * if not, maybe something wrong.
+ */
+ pmore_clrtoeol(lines, 0);
+ }
#ifdef PMORE_USE_ASCII_MOVIE
- if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD &&
- mfmovie.compat24)
- {
- if(mf.dispedlines == 23)
- return;
- }
- else if (mfmovie.mode == MFDISP_MOVIE_DETECTED)
- {
- // detected only applies for first page.
- // since this is not very often, let's prevent
- // showing control codes.
- if(mf_movieFrameHeader(mf.dispe, mf.end))
- MFDISP_SKIPCURLINE();
- }
- else if(mfmovie.mode == MFDISP_MOVIE_UNKNOWN ||
- mfmovie.mode == MFDISP_MOVIE_PLAYING)
- {
- if(mf_movieFrameHeader(mf.dispe, mf.end))
- switch(mfmovie.mode)
- {
-
- case MFDISP_MOVIE_UNKNOWN:
- mfmovie.mode = MFDISP_MOVIE_DETECTED;
- /* let's remove the first control sequence. */
- MFDISP_SKIPCURLINE();
- break;
-
- case MFDISP_MOVIE_PLAYING:
- /*
- * maybe we should do clrtobot() here,
- * but it's even better if we do clear()
- * all time. so we set dirty here for
- * next frame, and please set dirty before
- * playing.
- */
- MFDISP_DIRTY();
- return;
- }
- }
+ if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD &&
+ mfmovie.compat24)
+ {
+ if(mf.dispedlines == 23)
+ return;
+ }
+ else if (mfmovie.mode == MFDISP_MOVIE_DETECTED)
+ {
+ // detected only applies for first page.
+ // since this is not very often, let's prevent
+ // showing control codes.
+ if(mf_movieFrameHeader(mf.dispe, mf.end))
+ MFDISP_SKIPCURLINE();
+ }
+ else if(mfmovie.mode == MFDISP_MOVIE_UNKNOWN ||
+ mfmovie.mode == MFDISP_MOVIE_PLAYING)
+ {
+ if(mf_movieFrameHeader(mf.dispe, mf.end))
+ switch(mfmovie.mode)
+ {
+
+ case MFDISP_MOVIE_UNKNOWN:
+ mfmovie.mode = MFDISP_MOVIE_DETECTED;
+ /* let's remove the first control sequence. */
+ MFDISP_SKIPCURLINE();
+ break;
+
+ case MFDISP_MOVIE_PLAYING:
+ /*
+ * maybe we should do clrtobot() here,
+ * but it's even better if we do clear()
+ * all time. so we set dirty here for
+ * next frame, and please set dirty before
+ * playing.
+ */
+ MFDISP_DIRTY();
+ return;
+ }
+ }
#endif
- /* Is currentline visible? */
- if (lines < startline || lines > endline)
- {
- MFDISP_SKIPCURLINE();
- newline = MFDISP_NEWLINE_SKIP;
- }
- /* Now, consider what kind of line
- * (header, separator, or normal text)
- * is current line.
- */
- else if (currline == fh.lines && bpref.rawmode == MFDISP_RAW_NA)
- {
- /* case 1, header separator line */
- if (bpref.separator & MFDISP_SEP_LINE)
- {
- outs(ANSI_COLOR(36));
- for(col = 0; col < headerw; col+=2)
- {
- // prints("%02d", col);
- outs("¢w");
- }
- outs(ANSI_RESET);
- }
-
- /* Traditional 'more' adds separator as a newline.
- * This is buggy, however we can support this
- * by using wrapping features.
- * Anyway I(piaip) don't like this. And using wrap
- * leads to slow display (we cannt speed it up with
- * optimized scrolling.
- */
- if(bpref.separator & MFDISP_SEP_WRAP)
- {
- /* we have to do all wrapping stuff
- * in normal text section.
- * make sure this is updated.
- */
- wrapping = 1;
- mf.wraplines ++;
- MFDISP_FORCEDIRTY2BOT();
- if(mf.dispe > mf.start &&
- mf.dispe < mf.end &&
- *mf.dispe == '\n')
- mf.dispe --;
- }
- else
- MFDISP_SKIPCURLINE();
- }
- else if (currline < fh.lines && bpref.rawmode == MFDISP_RAW_NA )
- {
- /* case 2, we're printing headers */
- const char *val = (const char*)fh.headers[currline];
- const char *name = _fh_disp_heads[currline];
- int w = headerw - FH_HEADER_LEN - 3;
-
- outs(ANSI_COLOR(47;34) " ");
- outs(name);
- outs(" " ANSI_COLOR(44;37) " ");
-
- /* right floating stuff? */
- if (currline == 0 && fh.floats[0])
- {
- w -= ustrlen(fh.floats[0]) + ustrlen(fh.floats[1]) + 4;
- }
-
- prints("%-*.*s", w, w,
- (val ? val : ""));
-
- if (currline == 0 && fh.floats[0])
- {
- outs(ANSI_COLOR(47;34) " ");
- outs((const char*)fh.floats[0]);
- outs(" " ANSI_COLOR(44;37) " ");
- outs((const char*)fh.floats[1]);
- outs(" ");
- }
-
- outs(ANSI_RESET);
- MFDISP_SKIPCURLINE();
- }
- else if(mf.dispe < mf.end)
- {
- /* case 3, normal text */
- long dist = mf.end - mf.dispe;
- long flResetColor = 0;
- int srlen = -1;
- int breaknow = 0;
-
- unsigned char c;
-
- if(xprefix > 0 && !bpref.oldwrapmode && bpref.wrapindicator)
- {
- outs(MFDISP_WNAV_INDICATOR);
- col++;
- }
-
- // first check quote
- if(bpref.rawmode == MFDISP_RAW_NA)
- {
- if(dist > 1 &&
- (*mf.dispe == ':' || *mf.dispe == '>') &&
- *(mf.dispe+1) == ' ')
- {
- outs(ANSI_COLOR(36));
- flResetColor = 1;
- } else if (dist > 2 &&
- (!strncmp((char*)mf.dispe, "¡°", 2) ||
- !strncmp((char*)mf.dispe, "==>", 3)))
- {
- outs(ANSI_COLOR(32));
- flResetColor = 1;
- }
- }
-
- while(!breaknow && mf.dispe < mf.end && (c = *mf.dispe) != '\n')
- {
- if(inAnsi)
- {
- if (!ANSI_IN_ESCAPE(c))
- inAnsi = 0;
- /* whatever this is, output! */
- mf.dispe ++;
- switch(bpref.rawmode)
- {
- case MFDISP_RAW_NOANSI:
- /* TODO
- * col++ here may be buggy. */
- if(col < t_columns)
- {
- /* we tried our best to determine */
- if(xprefix > 0)
- xprefix --;
- else
- {
- outc(c);
- col++;
- }
- }
- if(!inAnsi)
- outs(ANSI_RESET);
- break;
- case MFDISP_RAW_PLAIN:
- break;
-
- default:
- if(ANSI_IN_MOVECMD(c))
- {
+ /* Is currentline visible? */
+ if (lines < startline || lines > endline)
+ {
+ MFDISP_SKIPCURLINE();
+ newline = MFDISP_NEWLINE_SKIP;
+ }
+ /* Now, consider what kind of line
+ * (header, separator, or normal text)
+ * is current line.
+ */
+ else if (currline == fh.lines && bpref.rawmode == MFDISP_RAW_NA)
+ {
+ /* case 1, header separator line */
+ if (bpref.separator & MFDISP_SEP_LINE)
+ {
+ outs(ANSI_COLOR(36));
+ for(col = 0; col < headerw; col+=2)
+ {
+ // prints("%02d", col);
+ outs("¢w");
+ }
+ outs(ANSI_RESET);
+ }
+
+ /* Traditional 'more' adds separator as a newline.
+ * This is buggy, however we can support this
+ * by using wrapping features.
+ * Anyway I(piaip) don't like this. And using wrap
+ * leads to slow display (we cannt speed it up with
+ * optimized scrolling.
+ */
+ if(bpref.separator & MFDISP_SEP_WRAP)
+ {
+ /* we have to do all wrapping stuff
+ * in normal text section.
+ * make sure this is updated.
+ */
+ wrapping = 1;
+ mf.wraplines ++;
+ MFDISP_FORCEDIRTY2BOT();
+ if(mf.dispe > mf.start &&
+ mf.dispe < mf.end &&
+ *mf.dispe == '\n')
+ mf.dispe --;
+ }
+ else
+ MFDISP_SKIPCURLINE();
+ }
+ else if (currline < fh.lines && bpref.rawmode == MFDISP_RAW_NA )
+ {
+ /* case 2, we're printing headers */
+ const char *val = (const char*)fh.headers[currline];
+ const char *name = _fh_disp_heads[currline];
+ int w = headerw - FH_HEADER_LEN - 3;
+
+ outs(ANSI_COLOR(47;34) " ");
+ outs(name);
+ outs(" " ANSI_COLOR(44;37) " ");
+
+ /* right floating stuff? */
+ if (currline == 0 && fh.floats[0])
+ {
+ w -= ustrlen(fh.floats[0]) + ustrlen(fh.floats[1]) + 4;
+ }
+
+ prints("%-*.*s", w, w,
+ (val ? val : ""));
+
+ if (currline == 0 && fh.floats[0])
+ {
+ outs(ANSI_COLOR(47;34) " ");
+ outs((const char*)fh.floats[0]);
+ outs(" " ANSI_COLOR(44;37) " ");
+ outs((const char*)fh.floats[1]);
+ outs(" ");
+ }
+
+ outs(ANSI_RESET);
+ MFDISP_SKIPCURLINE();
+ }
+ else if(mf.dispe < mf.end)
+ {
+ /* case 3, normal text */
+ long dist = mf.end - mf.dispe;
+ long flResetColor = 0;
+ int srlen = -1;
+ int breaknow = 0;
+
+ unsigned char c;
+
+ if(xprefix > 0 && !bpref.oldwrapmode && bpref.wrapindicator)
+ {
+ outs(MFDISP_WNAV_INDICATOR);
+ col++;
+ }
+
+ // first check quote
+ if(bpref.rawmode == MFDISP_RAW_NA)
+ {
+ if(dist > 1 &&
+ (*mf.dispe == ':' || *mf.dispe == '>') &&
+ *(mf.dispe+1) == ' ')
+ {
+ outs(ANSI_COLOR(36));
+ flResetColor = 1;
+ } else if (dist > 2 &&
+ (!strncmp((char*)mf.dispe, "¡°", 2) ||
+ !strncmp((char*)mf.dispe, "==>", 3)))
+ {
+ outs(ANSI_COLOR(32));
+ flResetColor = 1;
+ }
+ }
+
+ while(!breaknow && mf.dispe < mf.end && (c = *mf.dispe) != '\n')
+ {
+ if(inAnsi)
+ {
+ if (!ANSI_IN_ESCAPE(c))
+ inAnsi = 0;
+ /* whatever this is, output! */
+ mf.dispe ++;
+ switch(bpref.rawmode)
+ {
+ case MFDISP_RAW_NOANSI:
+ /* TODO
+ * col++ here may be buggy. */
+ if(col < t_columns)
+ {
+ /* we tried our best to determine */
+ if(xprefix > 0)
+ xprefix --;
+ else
+ {
+ outc(c);
+ col++;
+ }
+ }
+ if(!inAnsi)
+ outs(ANSI_RESET);
+ break;
+ case MFDISP_RAW_PLAIN:
+ break;
+
+ default:
+ if(ANSI_IN_MOVECMD(c))
+ {
#ifdef PMORE_RESTRICT_ANSI_MOVEMENT
- c = 's'; // "save cursor pos"
+ c = 's'; // "save cursor pos"
#else // PMORE_RESTRICT_ANSI_MOVEMENT
- // some user cannot live without this.
- // make them happy.
- newline_default = newline = MFDISP_NEWLINE_MOVE;
+ // some user cannot live without this.
+ // make them happy.
+ newline_default = newline = MFDISP_NEWLINE_MOVE;
#ifdef PMORE_USE_ASCII_MOVIE
- // relax for movies
- if (!MOVIE_IS_PLAYING())
+ // relax for movies
+ if (!MOVIE_IS_PLAYING())
#endif // PMORE_USE_ASCII_MOVIE
- {
- override_attr = ANSI_COLOR(1;37;41);
- override_msg = PMORE_MSG_WARN_MOVECMD;
- }
+ {
+ override_attr = ANSI_COLOR(1;37;41);
+ override_msg = PMORE_MSG_WARN_MOVECMD;
+ }
#endif // PMORE_RESTRICT_ANSI_MOVEMENT
- needMove2bot = 1;
- }
- outc(c);
- break;
- }
- continue;
-
- } else {
-
- if(c == ESC_CHR)
- {
- inAnsi = 1;
- /* we can't output now because maybe
- * ptt_prints wants to do something.
- */
- }
- else if(sr.search_str && srlen < 0 && // support search
+ needMove2bot = 1;
+ }
+ outc(c);
+ break;
+ }
+ continue;
+
+ } else {
+
+ if(c == ESC_CHR)
+ {
+ inAnsi = 1;
+ /* we can't output now because maybe
+ * ptt_prints wants to do something.
+ */
+ }
+ else if(sr.search_str && srlen < 0 && // support search
#ifdef PMORE_USE_DBCS_WRAP
- dbcs_incomplete == NULL &&
+ dbcs_incomplete == NULL &&
#endif
- mf.end - mf.dispe > sr.len &&
- sr.cmpfunc((char*)mf.dispe, (char*)sr.search_str, sr.len) == 0)
- {
- outs(ANSI_COLOR(7));
- srlen = sr.len-1;
- flResetColor = 1;
- }
+ mf.end - mf.dispe > sr.len &&
+ sr.cmpfunc((char*)mf.dispe, (char*)sr.search_str, sr.len) == 0)
+ {
+ outs(ANSI_COLOR(7));
+ srlen = sr.len-1;
+ flResetColor = 1;
+ }
#ifdef PMORE_USE_PTT_PRINTS
- /* special case to resolve dirty Ptt_prints */
- if(inAnsi &&
- mf.end - mf.dispe > 2 &&
- *(mf.dispe+1) == '*')
- {
- int i;
- char buf[64]; // make sure ptt_prints will not exceed
-
- memset(buf, 0, sizeof(buf));
- memcpy(buf, mf.dispe, 3); // ^[*s
- mf.dispe += 2;
-
- if(bpref.rawmode)
- buf[0] = '*';
- else
- {
+ /* special case to resolve dirty Ptt_prints */
+ if(inAnsi &&
+ mf.end - mf.dispe > 2 &&
+ *(mf.dispe+1) == '*')
+ {
+ int i;
+ char buf[64]; // make sure ptt_prints will not exceed
+
+ memset(buf, 0, sizeof(buf));
+ memcpy(buf, mf.dispe, 3); // ^[*s
+ mf.dispe += 2;
+
+ if(bpref.rawmode)
+ buf[0] = '*';
+ else
+ {
#ifdef LOW_SECURITY
# define PTTPRINT_WARN_PATTERN "slpnbm"
#else
# define PTTPRINT_WARN_PATTERN "slpn"
#endif // LOW_SECURITY
- if(strchr(PTTPRINT_WARN_PATTERN, buf[2]) != NULL)
- {
- override_attr = ANSI_COLOR(1;37;41);
- override_msg = PMORE_MSG_WARN_FAKEUSERINFO;
- }
- Ptt_prints(buf, sizeof(buf), NO_RELOAD); // result in buf
- }
- i = strlen(buf);
-
- if (col + i > maxcol)
- i = maxcol - col;
- if(i > 0)
- {
- buf[i] = 0;
- col += i;
- outs(buf);
- }
- inAnsi = 0;
- } else
+ if(strchr(PTTPRINT_WARN_PATTERN, buf[2]) != NULL)
+ {
+ override_attr = ANSI_COLOR(1;37;41);
+ override_msg = PMORE_MSG_WARN_FAKEUSERINFO;
+ }
+ Ptt_prints(buf, sizeof(buf), NO_RELOAD); // result in buf
+ }
+ i = strlen(buf);
+
+ if (col + i > maxcol)
+ i = maxcol - col;
+ if(i > 0)
+ {
+ buf[i] = 0;
+ col += i;
+ outs(buf);
+ }
+ inAnsi = 0;
+ } else
#endif
- if(inAnsi)
- {
- switch(bpref.rawmode)
- {
- case MFDISP_RAW_NOANSI:
- /* TODO
- * col++ here may be buggy. */
- if(col < t_columns)
- {
- /* we tried our best to determine */
- if(xprefix > 0)
- xprefix --;
- else
- {
- outs(ANSI_COLOR(1) "*");
- col++;
- }
- }
- break;
- case MFDISP_RAW_PLAIN:
- break;
- default:
- outc(ESC_CHR);
- break;
- }
- } else {
- int canOutput = 0;
- /* if col > maxcol,
- * because we have the space for
- * "indicators" (one byte),
- * so we can tolerate one more byte.
- */
- if(col <= maxcol) // normal case
- canOutput = 1;
- else if (bpref.oldwrapmode && // oldwrapmode
- col < t_columns)
- {
- canOutput = 1;
- newline = MFDISP_NEWLINE_MOVE;
- } else {
- int off = 0;
- // put more efforts to determine
- // if we can use indicator space
- // determine real offset between \n
- if(predicted_linewidth < 0)
- predicted_linewidth = col + 1 +
- MFDISP_PREDICT_LINEWIDTH(mf.dispe+1);
- off = predicted_linewidth - (col + 1);
-
- if (col + off <= (maxcol+1))
- {
- canOutput = 1; // indicator space
- }
+ if(inAnsi)
+ {
+ switch(bpref.rawmode)
+ {
+ case MFDISP_RAW_NOANSI:
+ /* TODO
+ * col++ here may be buggy. */
+ if(col < t_columns)
+ {
+ /* we tried our best to determine */
+ if(xprefix > 0)
+ xprefix --;
+ else
+ {
+ outs(ANSI_COLOR(1) "*");
+ col++;
+ }
+ }
+ break;
+ case MFDISP_RAW_PLAIN:
+ break;
+ default:
+ outc(ESC_CHR);
+ break;
+ }
+ } else {
+ int canOutput = 0;
+ /* if col > maxcol,
+ * because we have the space for
+ * "indicators" (one byte),
+ * so we can tolerate one more byte.
+ */
+ if(col <= maxcol) // normal case
+ canOutput = 1;
+ else if (bpref.oldwrapmode && // oldwrapmode
+ col < t_columns)
+ {
+ canOutput = 1;
+ newline = MFDISP_NEWLINE_MOVE;
+ } else {
+ int off = 0;
+ // put more efforts to determine
+ // if we can use indicator space
+ // determine real offset between \n
+ if(predicted_linewidth < 0)
+ predicted_linewidth = col + 1 +
+ MFDISP_PREDICT_LINEWIDTH(mf.dispe+1);
+ off = predicted_linewidth - (col + 1);
+
+ if (col + off <= (maxcol+1))
+ {
+ canOutput = 1; // indicator space
+ }
#ifdef PMORE_TRADITIONAL_FULLCOL
- else if (col + off < t_columns)
- {
- canOutput = 1;
- newline = MFDISP_NEWLINE_MOVE;
- }
+ else if (col + off < t_columns)
+ {
+ canOutput = 1;
+ newline = MFDISP_NEWLINE_MOVE;
+ }
#endif
- }
+ }
- if(canOutput)
- {
- /* the real place to output text
- */
+ if(canOutput)
+ {
+ /* the real place to output text
+ */
#ifdef PMORE_USE_DBCS_WRAP
- if(mf.xpos > 0 && dbcs_incomplete && col < 2)
- {
- /* col = 0 or 1 only */
- if(col == 0) /* no indicators */
- c = ' ';
- else if(!bpref.oldwrapmode && bpref.wrapindicator)
- c = ' ';
- }
-
- if (dbcs_incomplete)
- dbcs_incomplete = NULL;
- else if(PMORE_DBCS_LEADING(c))
- dbcs_incomplete = mf.dispe;
+ if(mf.xpos > 0 && dbcs_incomplete && col < 2)
+ {
+ /* col = 0 or 1 only */
+ if(col == 0) /* no indicators */
+ c = ' ';
+ else if(!bpref.oldwrapmode && bpref.wrapindicator)
+ c = ' ';
+ }
+
+ if (dbcs_incomplete)
+ dbcs_incomplete = NULL;
+ else if(PMORE_DBCS_LEADING(c))
+ dbcs_incomplete = mf.dispe;
#endif
- if(xprefix > 0)
- xprefix --;
- else
- {
- outc(c);
- col++;
- }
-
- if (srlen == 0)
- outs(ANSI_RESET);
- if(srlen >= 0)
- srlen --;
- }
- else
- /* wrap modes */
- if(mf.xpos > 0 || bpref.wrapmode == MFDISP_WRAP_TRUNCATE)
- {
- breaknow = 1;
- mf.trunclines ++;
- MFDISP_SKIPCURLINE();
- wrapping = 0;
- }
- else if (bpref.wrapmode == MFDISP_WRAP_WRAP)
- {
- breaknow = 1;
- wrapping = 1;
- mf.wraplines ++;
+ if(xprefix > 0)
+ xprefix --;
+ else
+ {
+ outc(c);
+ col++;
+ }
+
+ if (srlen == 0)
+ outs(ANSI_RESET);
+ if(srlen >= 0)
+ srlen --;
+ }
+ else
+ /* wrap modes */
+ if(mf.xpos > 0 || bpref.wrapmode == MFDISP_WRAP_TRUNCATE)
+ {
+ breaknow = 1;
+ mf.trunclines ++;
+ MFDISP_SKIPCURLINE();
+ wrapping = 0;
+ }
+ else if (bpref.wrapmode == MFDISP_WRAP_WRAP)
+ {
+ breaknow = 1;
+ wrapping = 1;
+ mf.wraplines ++;
#ifdef PMORE_USE_DBCS_WRAP
- if(dbcs_incomplete)
- {
- mf.dispe = dbcs_incomplete;
- dbcs_incomplete = NULL;
- /* to be more dbcs safe,
- * use the followings to
- * erase printed character.
- */
- if(col > 0) {
- /* TODO BUG BUGGY
- * using move is maybe actually non-sense
- * because BBS terminal system cannot
- * display this when ANSI escapes were used
- * in same line. However, on most
- * situation this works.
- * So we used an alternative, forced ANSI
- * move command.
- */
- // move(lines, col-1);
- char ansicmd[16];
- sprintf(ansicmd, ANSI_MOVETO(%d,%d),
- lines+1, col-1+1);
- /* to preven ANSI ESCAPE being tranlated as
- * DBCS trailing byte. */
- outc(' ');
- /* move back one column */
- outs(ansicmd);
- /* erase it (previous leading byte)*/
- outc(' ');
- /* go to correct position */
- outs(ansicmd);
- }
- }
+ if(dbcs_incomplete)
+ {
+ mf.dispe = dbcs_incomplete;
+ dbcs_incomplete = NULL;
+ /* to be more dbcs safe,
+ * use the followings to
+ * erase printed character.
+ */
+ if(col > 0) {
+ /* TODO BUG BUGGY
+ * using move is maybe actually non-sense
+ * because BBS terminal system cannot
+ * display this when ANSI escapes were used
+ * in same line. However, on most
+ * situation this works.
+ * So we used an alternative, forced ANSI
+ * move command.
+ */
+ // move(lines, col-1);
+ char ansicmd[16];
+ sprintf(ansicmd, ANSI_MOVETO(%d,%d),
+ lines+1, col-1+1);
+ /* to preven ANSI ESCAPE being tranlated as
+ * DBCS trailing byte. */
+ outc(' ');
+ /* move back one column */
+ outs(ansicmd);
+ /* erase it (previous leading byte)*/
+ outc(' ');
+ /* go to correct position */
+ outs(ansicmd);
+ }
+ }
#endif
- }
- }
- }
- if(!breaknow)
- mf.dispe ++;
- }
- if(flResetColor)
- outs(ANSI_RESET);
-
- /* "wrapping" should be only in normal text section.
- * We don't support wrap within scrolling,
- * so if we have to wrap, invalidate all lines.
- */
- if(breaknow)
- {
- if(wrapping)
- MFDISP_FORCEDIRTY2BOT();
-
- if(!bpref.oldwrapmode && bpref.wrapindicator && col < t_columns)
- {
- if(wrapping)
- outs(MFDISP_WRAP_INDICATOR);
- else
- outs(MFDISP_TRUNC_INDICATOR);
- } else {
- outs(ANSI_RESET);
- }
- }
- else
- wrapping = 0;
- }
-
- if(mf.dispe < mf.end && *mf.dispe == '\n')
- mf.dispe ++;
- // else, we're in wrap mode.
-
- switch(newline)
- {
- case MFDISP_NEWLINE_SKIP:
- break;
- case MFDISP_NEWLINE_CLEAR:
- FORCE_CLRTOEOL();
- outc('\n');
- break;
- case MFDISP_NEWLINE_MOVE:
- move(lines+1, 0);
- break;
- }
- lines ++;
+ }
+ }
+ }
+ if(!breaknow)
+ mf.dispe ++;
+ }
+ if(flResetColor)
+ outs(ANSI_RESET);
+
+ /* "wrapping" should be only in normal text section.
+ * We don't support wrap within scrolling,
+ * so if we have to wrap, invalidate all lines.
+ */
+ if(breaknow)
+ {
+ if(wrapping)
+ MFDISP_FORCEDIRTY2BOT();
+
+ if(!bpref.oldwrapmode && bpref.wrapindicator && col < t_columns)
+ {
+ if(wrapping)
+ outs(MFDISP_WRAP_INDICATOR);
+ else
+ outs(MFDISP_TRUNC_INDICATOR);
+ } else {
+ outs(ANSI_RESET);
+ }
+ }
+ else
+ wrapping = 0;
+ }
+
+ if(mf.dispe < mf.end && *mf.dispe == '\n')
+ mf.dispe ++;
+ // else, we're in wrap mode.
+
+ switch(newline)
+ {
+ case MFDISP_NEWLINE_SKIP:
+ break;
+ case MFDISP_NEWLINE_CLEAR:
+ FORCE_CLRTOEOL();
+ outc('\n');
+ break;
+ case MFDISP_NEWLINE_MOVE:
+ move(lines+1, 0);
+ break;
+ }
+ lines ++;
}
/*
* we've displayed the file.
@@ -1636,36 +1636,36 @@ mf_display()
*/
if(mf.disps == mf.maxdisps && mf.dispe < mf.end)
{
- /*
- * never mind if that's caused by separator
- * however this code is rarely used now.
- * only if no preload file.
- */
- if (bpref.separator & MFDISP_SEP_WRAP &&
- mf.wraplines == 1 &&
- mf.lineno < fh.lines)
- {
- /*
- * o.k, now we know maxline should be one line forward.
- */
- mf_determinemaxdisps(+1, 1);
- } else
- {
- /* not caused by separator?
- * ok, then it's by wrapped lines.
- *
- * old flavor: go bottom:
- * mf_determinemaxdisps(0)
- * however we have "update" method now,
- * so we can achieve more user friendly behavior.
- */
- mf_determinemaxdisps(+mf.wraplines, 1);
- }
+ /*
+ * never mind if that's caused by separator
+ * however this code is rarely used now.
+ * only if no preload file.
+ */
+ if (bpref.separator & MFDISP_SEP_WRAP &&
+ mf.wraplines == 1 &&
+ mf.lineno < fh.lines)
+ {
+ /*
+ * o.k, now we know maxline should be one line forward.
+ */
+ mf_determinemaxdisps(+1, 1);
+ } else
+ {
+ /* not caused by separator?
+ * ok, then it's by wrapped lines.
+ *
+ * old flavor: go bottom:
+ * mf_determinemaxdisps(0)
+ * however we have "update" method now,
+ * so we can achieve more user friendly behavior.
+ */
+ mf_determinemaxdisps(+mf.wraplines, 1);
+ }
}
mf.oldlineno = mf.lineno;
if (needMove2bot)
- move(b_lines, 0);
+ move(b_lines, 0);
}
/* --------------------- MAIN PROCEDURE ------------------------- */
@@ -1726,10 +1726,10 @@ PMORE_UINAV_FORWARDPAGE()
int i = mf.dispedlines - 1;
if(mf_viewedAll())
- return;
+ return;
if(i < 1)
- i = 1;
+ i = 1;
mf_forward(i);
}
@@ -1737,7 +1737,7 @@ MFPROTO void
PMORE_UINAV_FORWARDLINE()
{
if(mf_viewedAll())
- return;
+ return;
mf_forward(1);
}
@@ -1776,701 +1776,701 @@ pmore(char *fpath, int promptend)
STATINC(STAT_MORE);
if(!mf_attach(fpath))
{
- REENTRANT_RESTORE();
- return -1;
+ REENTRANT_RESTORE();
+ return -1;
}
clear();
while(!flExit)
{
- if(invalidate)
- {
- mf_display();
- invalidate = 0;
- }
+ if(invalidate)
+ {
+ mf_display();
+ invalidate = 0;
+ }
- /* in current implementation,
- * we want to invalidate for each keypress.
- */
- invalidate = 1;
+ /* in current implementation,
+ * we want to invalidate for each keypress.
+ */
+ invalidate = 1;
-#ifdef PMORE_TRADITIONAL_PROMPTEND
+#ifdef PMORE_TRADITIONAL_PROMPTEND
- if(promptend == NA)
- {
+ if(promptend == NA)
+ {
#ifdef PMORE_USE_ASCII_MOVIE
- if(mfmovie.mode == MFDISP_MOVIE_DETECTED)
- {
- /* quick auto play */
- mfmovie.mode = MFDISP_MOVIE_YES;
- RESET_MOVIE();
- mfmovie.mode = MFDISP_MOVIE_PLAYING;
- mf_determinemaxdisps(0, 0); // display until last line
- mf_movieNextFrame();
- MFDISP_DIRTY();
- continue;
- } else if (mfmovie.mode != MFDISP_MOVIE_PLAYING)
+ if(mfmovie.mode == MFDISP_MOVIE_DETECTED)
+ {
+ /* quick auto play */
+ mfmovie.mode = MFDISP_MOVIE_YES;
+ RESET_MOVIE();
+ mfmovie.mode = MFDISP_MOVIE_PLAYING;
+ mf_determinemaxdisps(0, 0); // display until last line
+ mf_movieNextFrame();
+ MFDISP_DIRTY();
+ continue;
+ } else if (mfmovie.mode != MFDISP_MOVIE_PLAYING)
#endif
- break;
- }
+ break;
+ }
#else
- if(promptend == NA && mf_viewedAll())
- break;
+ if(promptend == NA && mf_viewedAll())
+ break;
#endif
- move(b_lines, 0);
- // clrtoeol(); // this shall be done in mf_display to speed up.
-
+ move(b_lines, 0);
+ // clrtoeol(); // this shall be done in mf_display to speed up.
+
#ifdef USE_BBSLUA
- // TODO prompt BBS Lua status here.
+ // TODO prompt BBS Lua status here.
#endif // USE_BBSLUA
#ifdef PMORE_USE_ASCII_MOVIE
- switch (mfmovie.mode)
- {
- case MFDISP_MOVIE_UNKNOWN:
- mfmovie.mode = MFDISP_MOVIE_NO;
- break;
-
- case MFDISP_MOVIE_DETECTED:
- mfmovie.mode = MFDISP_MOVIE_YES;
- {
- // query if user wants to play movie.
-
- int w = t_columns-1;
- const char *s = PMORE_MSG_MOVIE_DETECTED;
-
- outs(ANSI_RESET ANSI_COLOR(1;33;44));
- w -= strlen(s); outs(s);
-
- while(w-- > 0) outc(' '); outs(ANSI_RESET ANSI_CLRTOEND);
- w = tolower(igetch());
-
- if( w != 'n' &&
- w != KEY_UP && w != KEY_LEFT &&
- w != 'q')
- {
- RESET_MOVIE();
- mfmovie.mode = MFDISP_MOVIE_PLAYING;
- mf_determinemaxdisps(0, 0); // display until last line
- mf_movieNextFrame();
- MFDISP_DIRTY();
- // remove override messages
- RESET_OVERRIDE_MSG();
- continue;
- }
- /* else, we have to clean up. */
- move(b_lines, 0);
- clrtoeol();
- }
- break;
-
- case MFDISP_MOVIE_PLAYING_OLD:
- case MFDISP_MOVIE_PLAYING:
-
- mf_moviePromptPlaying(0);
-
- // doing refresh() here is better,
- // to prevent that we forgot to refresh
- // in SyncFrame.
- refresh();
-
- if(mf_movieSyncFrame())
- {
- /* user did not hit anything.
- * play next frame.
- */
- if(mfmovie.mode == MFDISP_MOVIE_PLAYING)
- {
- if(!mf_movieNextFrame())
- {
- STOP_MOVIE();
-
- if(promptend == NA)
- {
- /* if we played to end,
- * no need to prevent pressanykey().
- */
- flExit = 1, retval = 0;
- }
- }
- }
- else if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD)
- {
- if(mf_viewedAll())
- {
- mfmovie.mode = MFDISP_MOVIE_NO;
- mf_determinemaxdisps(MFNAV_PAGE, 0);
- mf_forward(0);
- }
- else
- {
- if(!mfmovie.compat24)
- PMORE_UINAV_FORWARDPAGE();
- else
- mf_forward(22);
- }
- }
- } else {
- /* TODO simple navigation here? */
-
- /* stop playing */
- if(mfmovie.mode == MFDISP_MOVIE_PLAYING)
- {
- STOP_MOVIE();
- if(promptend == NA)
- {
- flExit = 1, retval = READ_NEXT;
- }
- }
- else if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD)
- {
- mfmovie.mode = MFDISP_MOVIE_NO;
- mf_determinemaxdisps(MFNAV_PAGE, 0);
- mf_forward(0);
- }
- }
- continue;
- }
+ switch (mfmovie.mode)
+ {
+ case MFDISP_MOVIE_UNKNOWN:
+ mfmovie.mode = MFDISP_MOVIE_NO;
+ break;
+
+ case MFDISP_MOVIE_DETECTED:
+ mfmovie.mode = MFDISP_MOVIE_YES;
+ {
+ // query if user wants to play movie.
+
+ int w = t_columns-1;
+ const char *s = PMORE_MSG_MOVIE_DETECTED;
+
+ outs(ANSI_RESET ANSI_COLOR(1;33;44));
+ w -= strlen(s); outs(s);
+
+ while(w-- > 0) outc(' '); outs(ANSI_RESET ANSI_CLRTOEND);
+ w = tolower(igetch());
+
+ if( w != 'n' &&
+ w != KEY_UP && w != KEY_LEFT &&
+ w != 'q')
+ {
+ RESET_MOVIE();
+ mfmovie.mode = MFDISP_MOVIE_PLAYING;
+ mf_determinemaxdisps(0, 0); // display until last line
+ mf_movieNextFrame();
+ MFDISP_DIRTY();
+ // remove override messages
+ RESET_OVERRIDE_MSG();
+ continue;
+ }
+ /* else, we have to clean up. */
+ move(b_lines, 0);
+ clrtoeol();
+ }
+ break;
+
+ case MFDISP_MOVIE_PLAYING_OLD:
+ case MFDISP_MOVIE_PLAYING:
+
+ mf_moviePromptPlaying(0);
+
+ // doing refresh() here is better,
+ // to prevent that we forgot to refresh
+ // in SyncFrame.
+ refresh();
+
+ if(mf_movieSyncFrame())
+ {
+ /* user did not hit anything.
+ * play next frame.
+ */
+ if(mfmovie.mode == MFDISP_MOVIE_PLAYING)
+ {
+ if(!mf_movieNextFrame())
+ {
+ STOP_MOVIE();
+
+ if(promptend == NA)
+ {
+ /* if we played to end,
+ * no need to prevent pressanykey().
+ */
+ flExit = 1, retval = 0;
+ }
+ }
+ }
+ else if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD)
+ {
+ if(mf_viewedAll())
+ {
+ mfmovie.mode = MFDISP_MOVIE_NO;
+ mf_determinemaxdisps(MFNAV_PAGE, 0);
+ mf_forward(0);
+ }
+ else
+ {
+ if(!mfmovie.compat24)
+ PMORE_UINAV_FORWARDPAGE();
+ else
+ mf_forward(22);
+ }
+ }
+ } else {
+ /* TODO simple navigation here? */
+
+ /* stop playing */
+ if(mfmovie.mode == MFDISP_MOVIE_PLAYING)
+ {
+ STOP_MOVIE();
+ if(promptend == NA)
+ {
+ flExit = 1, retval = READ_NEXT;
+ }
+ }
+ else if(mfmovie.mode == MFDISP_MOVIE_PLAYING_OLD)
+ {
+ mfmovie.mode = MFDISP_MOVIE_NO;
+ mf_determinemaxdisps(MFNAV_PAGE, 0);
+ mf_forward(0);
+ }
+ }
+ continue;
+ }
#endif
- /* PRINT BOTTOM STATUS BAR */
+ /* PRINT BOTTOM STATUS BAR */
#ifdef DEBUG
- if(debug)
- {
- /* in debug mode don't print ANSI codes
- * because themselves are buggy.
- */
- prints("L#%ld(w%ld,lp%ld) pmt=%d Dsp:%08X/%08X/%08X, "
- "F:%08X/%08X(%d) tScr(%dx%d)",
- mf.lineno, mf.wraplines, mf.lastpagelines,
- promptend,
- (unsigned int)mf.disps,
- (unsigned int)mf.maxdisps,
- (unsigned int)mf.dispe,
- (unsigned int)mf.start, (unsigned int)mf.end,
- (int)mf.len,
- t_columns,
- t_lines
- );
- }
- else
+ if(debug)
+ {
+ /* in debug mode don't print ANSI codes
+ * because themselves are buggy.
+ */
+ prints("L#%ld(w%ld,lp%ld) pmt=%d Dsp:%08X/%08X/%08X, "
+ "F:%08X/%08X(%d) tScr(%dx%d)",
+ mf.lineno, mf.wraplines, mf.lastpagelines,
+ promptend,
+ (unsigned int)mf.disps,
+ (unsigned int)mf.maxdisps,
+ (unsigned int)mf.dispe,
+ (unsigned int)mf.start, (unsigned int)mf.end,
+ (int)mf.len,
+ t_columns,
+ t_lines
+ );
+ }
+ else
#endif
- {
- char *printcolor;
-
- char buf[256]; // orz
- int prefixlen = 0;
- int barlen = 0;
- int postfix1len = 0, postfix2len = 0;
-
- int progress =
- (int)((unsigned long)(mf.dispe-mf.start) * 100 / mf.len);
- /*
- * page determination is hard.
- * should we use starting line, or finishing line?
- */
- int nowpage =
- (int)((mf.lineno + mf.dispedlines/2) / MFNAV_PAGE)+1;
- int allpages = -1; /* unknown yet */
- if (mf.maxlinenoS >= 0)
- {
- allpages =
- (int)((mf.maxlinenoS + mf.lastpagelines -
- ((bpref.separator & MFDISP_SEP_WRAP) &&
- (fh.lines >= 0) ? 0:1)) / MFNAV_PAGE)+1;
- if (mf.lineno >= mf.maxlinenoS || nowpage > allpages)
- nowpage = allpages;
- /*
- nowpage =
- (int)((mf.lineno + mf.dispedlines-2) / MFNAV_PAGE)+1 ;
- */
- }
- /* why -2 and -1?
- * because we want to determine by nav_page,
- * and mf.dispedlines is based on disp_page (nav_page+1)
- * mf.lastpagelines is based on nav_page
- */
-
- if(mf_viewedAll())
- printcolor = ANSI_COLOR(37;44);
- else if (mf_viewedNone())
- printcolor = ANSI_COLOR(33;45);
- else
- printcolor = ANSI_COLOR(34;46);
-
- outs(ANSI_RESET);
- outs(printcolor);
-
- if(bpref.oldstatusbar)
- {
-
- prints(" ÂsÄý P.%d(%d%%) %s %-30.30s%s",
- nowpage,
- progress,
- ANSI_COLOR(31;47),
- "(h)"
- ANSI_COLOR(30) "¨D§U "
- ANSI_COLOR(31) "¡÷¡õ[PgUp][",
- "PgDn][Home][End]"
- ANSI_COLOR(30) "´å¼Ð²¾°Ê "
- ANSI_COLOR(31) "¡ö[q]"
- ANSI_COLOR(30) "µ²§ô ");
-
- } else {
-
- if(allpages >= 0)
- sprintf(buf,
- " ÂsÄý ²Ä %1d/%1d ­¶ (%3d%%) ",
- nowpage,
- allpages,
- progress
- );
- else
- sprintf(buf,
- " ÂsÄý ²Ä %1d ­¶ (%3d%%) ",
- nowpage,
- progress
- );
- outs(buf); prefixlen += strlen(buf);
-
- outs(ANSI_COLOR(1;30;47));
-
- if(override_msg)
- {
- buf[0] = 0;
- if(override_attr) outs(override_attr);
- snprintf(buf, sizeof(buf), override_msg);
- RESET_OVERRIDE_MSG();
- }
- else
- if(mf.xpos > 0)
- {
- snprintf(buf, sizeof(buf),
- " Åã¥Ü½d³ò: %d~%d Äæ¦ì, %02d~%02d ¦æ",
- (int)mf.xpos+1,
- (int)(mf.xpos + t_columns-(mf.trunclines ? 2 : 1)),
- (int)(mf.lineno + 1),
- (int)(mf.lineno + mf.dispedlines)
- );
- } else {
- snprintf(buf, sizeof(buf),
- " ¥Ø«eÅã¥Ü: ²Ä %02d~%02d ¦æ",
- (int)(mf.lineno + 1),
- (int)(mf.lineno + mf.dispedlines)
- );
- }
-
- outs(buf); prefixlen += strlen(buf);
-
- postfix1len = 12; // check msg below
- postfix2len = 10;
- if(mf_viewedAll()) postfix1len = 17;
-
- if (prefixlen + postfix1len + postfix2len + 1 > t_columns)
- {
- postfix1len = 0;
- if (prefixlen + postfix1len + postfix2len + 1 > t_columns)
- postfix2len = 0;
- }
- barlen = t_columns - 1 - postfix1len - postfix2len - prefixlen;
-
- while(barlen-- > 0)
- outc(' ');
-
- if(postfix1len > 0)
- outs(
- mf_viewedAll() ?
- ANSI_COLOR(0;31;47)"(y)" ANSI_COLOR(30) "¦^«H"
- ANSI_COLOR(31) "(X/%)" ANSI_COLOR(30) "±À¤å "
- :
- ANSI_COLOR(0;31;47) "(h)"
- ANSI_COLOR(30) "«öÁ仡©ú "
- );
- if(postfix2len > 0)
- outs(
- ANSI_COLOR(0;31;47) "¡ö[q]"
- ANSI_COLOR(30) "Â÷¶} "
- );
- }
- outs(ANSI_RESET);
- FORCE_CLRTOEOL();
- }
-
- /* igetch() will do refresh(); */
- ch = igetch();
- switch (ch) {
- /* -------------- NEW EXITING KEYS ------------------ */
+ {
+ char *printcolor;
+
+ char buf[256]; // orz
+ int prefixlen = 0;
+ int barlen = 0;
+ int postfix1len = 0, postfix2len = 0;
+
+ int progress =
+ (int)((unsigned long)(mf.dispe-mf.start) * 100 / mf.len);
+ /*
+ * page determination is hard.
+ * should we use starting line, or finishing line?
+ */
+ int nowpage =
+ (int)((mf.lineno + mf.dispedlines/2) / MFNAV_PAGE)+1;
+ int allpages = -1; /* unknown yet */
+ if (mf.maxlinenoS >= 0)
+ {
+ allpages =
+ (int)((mf.maxlinenoS + mf.lastpagelines -
+ ((bpref.separator & MFDISP_SEP_WRAP) &&
+ (fh.lines >= 0) ? 0:1)) / MFNAV_PAGE)+1;
+ if (mf.lineno >= mf.maxlinenoS || nowpage > allpages)
+ nowpage = allpages;
+ /*
+ nowpage =
+ (int)((mf.lineno + mf.dispedlines-2) / MFNAV_PAGE)+1 ;
+ */
+ }
+ /* why -2 and -1?
+ * because we want to determine by nav_page,
+ * and mf.dispedlines is based on disp_page (nav_page+1)
+ * mf.lastpagelines is based on nav_page
+ */
+
+ if(mf_viewedAll())
+ printcolor = ANSI_COLOR(37;44);
+ else if (mf_viewedNone())
+ printcolor = ANSI_COLOR(33;45);
+ else
+ printcolor = ANSI_COLOR(34;46);
+
+ outs(ANSI_RESET);
+ outs(printcolor);
+
+ if(bpref.oldstatusbar)
+ {
+
+ prints(" ÂsÄý P.%d(%d%%) %s %-30.30s%s",
+ nowpage,
+ progress,
+ ANSI_COLOR(31;47),
+ "(h)"
+ ANSI_COLOR(30) "¨D§U "
+ ANSI_COLOR(31) "¡÷¡õ[PgUp][",
+ "PgDn][Home][End]"
+ ANSI_COLOR(30) "´å¼Ð²¾°Ê "
+ ANSI_COLOR(31) "¡ö[q]"
+ ANSI_COLOR(30) "µ²§ô ");
+
+ } else {
+
+ if(allpages >= 0)
+ sprintf(buf,
+ " ÂsÄý ²Ä %1d/%1d ­¶ (%3d%%) ",
+ nowpage,
+ allpages,
+ progress
+ );
+ else
+ sprintf(buf,
+ " ÂsÄý ²Ä %1d ­¶ (%3d%%) ",
+ nowpage,
+ progress
+ );
+ outs(buf); prefixlen += strlen(buf);
+
+ outs(ANSI_COLOR(1;30;47));
+
+ if(override_msg)
+ {
+ buf[0] = 0;
+ if(override_attr) outs(override_attr);
+ snprintf(buf, sizeof(buf), override_msg);
+ RESET_OVERRIDE_MSG();
+ }
+ else
+ if(mf.xpos > 0)
+ {
+ snprintf(buf, sizeof(buf),
+ " Åã¥Ü½d³ò: %d~%d Äæ¦ì, %02d~%02d ¦æ",
+ (int)mf.xpos+1,
+ (int)(mf.xpos + t_columns-(mf.trunclines ? 2 : 1)),
+ (int)(mf.lineno + 1),
+ (int)(mf.lineno + mf.dispedlines)
+ );
+ } else {
+ snprintf(buf, sizeof(buf),
+ " ¥Ø«eÅã¥Ü: ²Ä %02d~%02d ¦æ",
+ (int)(mf.lineno + 1),
+ (int)(mf.lineno + mf.dispedlines)
+ );
+ }
+
+ outs(buf); prefixlen += strlen(buf);
+
+ postfix1len = 12; // check msg below
+ postfix2len = 10;
+ if(mf_viewedAll()) postfix1len = 17;
+
+ if (prefixlen + postfix1len + postfix2len + 1 > t_columns)
+ {
+ postfix1len = 0;
+ if (prefixlen + postfix1len + postfix2len + 1 > t_columns)
+ postfix2len = 0;
+ }
+ barlen = t_columns - 1 - postfix1len - postfix2len - prefixlen;
+
+ while(barlen-- > 0)
+ outc(' ');
+
+ if(postfix1len > 0)
+ outs(
+ mf_viewedAll() ?
+ ANSI_COLOR(0;31;47)"(y)" ANSI_COLOR(30) "¦^«H"
+ ANSI_COLOR(31) "(X/%)" ANSI_COLOR(30) "±À¤å "
+ :
+ ANSI_COLOR(0;31;47) "(h)"
+ ANSI_COLOR(30) "«öÁ仡©ú "
+ );
+ if(postfix2len > 0)
+ outs(
+ ANSI_COLOR(0;31;47) "¡ö[q]"
+ ANSI_COLOR(30) "Â÷¶} "
+ );
+ }
+ outs(ANSI_RESET);
+ FORCE_CLRTOEOL();
+ }
+
+ /* igetch() will do refresh(); */
+ ch = igetch();
+ switch (ch) {
+ /* -------------- NEW EXITING KEYS ------------------ */
#ifdef RET_DOREPLY
- case 'r': case 'R':
- flExit = 1, retval = RET_DOREPLY;
- break;
- case 'Y': case 'y':
- flExit = 1, retval = RET_DOREPLYALL;
- break;
+ case 'r': case 'R':
+ flExit = 1, retval = RET_DOREPLY;
+ break;
+ case 'Y': case 'y':
+ flExit = 1, retval = RET_DOREPLYALL;
+ break;
#endif
#ifdef RET_DORECOMMEND
- // recommend
- case '%':
- case 'X':
- flExit = 1, retval = RET_DORECOMMEND;
- break;
+ // recommend
+ case '%':
+ case 'X':
+ flExit = 1, retval = RET_DORECOMMEND;
+ break;
#endif
#ifdef RET_DOQUERYINFO
- case 'Q': // info query interface
- flExit = 1, retval = RET_DOQUERYINFO;
- break;
+ case 'Q': // info query interface
+ flExit = 1, retval = RET_DOQUERYINFO;
+ break;
#endif
#ifdef RET_DOSYSOPEDIT
- case 'E':
- flExit = 1, retval = RET_DOSYSOPEDIT;
- break;
+ case 'E':
+ flExit = 1, retval = RET_DOSYSOPEDIT;
+ break;
#endif
#ifdef RET_DOCHESSREPLAY
- case 'z':
- flExit = 1, retval = RET_DOCHESSREPLAY;
- break;
+ case 'z':
+ flExit = 1, retval = RET_DOCHESSREPLAY;
+ break;
#endif
#ifdef RET_COPY2TMP
- case Ctrl('T'):
- flExit = 1, retval = RET_COPY2TMP;
- break;
+ case Ctrl('T'):
+ flExit = 1, retval = RET_COPY2TMP;
+ break;
#endif
#ifdef RET_SELECTBRD
- case 's':
- flExit = 1, retval = RET_SELECTBRD;
- break;
+ case 's':
+ flExit = 1, retval = RET_SELECTBRD;
+ break;
#endif
- /* ------------------ EXITING KEYS ------------------ */
- case 'A':
- flExit = 1, retval = AUTHOR_PREV;
- break;
- case 'a':
- flExit = 1, retval = AUTHOR_NEXT;
- break;
- case 'F': case 'f':
- flExit = 1, retval = READ_NEXT;
- break;
- case 'B': case 'b':
- flExit = 1, retval = READ_PREV;
- break;
- case KEY_LEFT:
- flExit = 1, retval = FULLUPDATE;
- break;
- case 'q':
- flExit = 1, retval = FULLUPDATE;
- break;
-
- /* from Kaede, thread reading */
- case ']':
- case '+':
- flExit = 1, retval = RELATE_NEXT;
- break;
- case '[':
- case '-':
- flExit = 1, retval = RELATE_PREV;
- break;
- case '=':
- flExit = 1, retval = RELATE_FIRST;
- break;
- /* ------------------ NAVIGATION KEYS ------------------ */
- /* Simple Navigation */
- case 'k': case 'K':
- mf_backward(1);
- break;
- case 'j': case 'J':
- PMORE_UINAV_FORWARDLINE();
- break;
-
- case Ctrl('F'):
- case KEY_PGDN:
- PMORE_UINAV_FORWARDPAGE();
- break;
- case Ctrl('B'):
- case KEY_PGUP:
- mf_backward(MFNAV_PAGE);
- break;
-
- case '0':
- case 'g':
- case KEY_HOME:
- mf_goTop();
- break;
- case '$':
- case 'G':
- case KEY_END:
- mf_goBottom();
+ /* ------------------ EXITING KEYS ------------------ */
+ case 'A':
+ flExit = 1, retval = AUTHOR_PREV;
+ break;
+ case 'a':
+ flExit = 1, retval = AUTHOR_NEXT;
+ break;
+ case 'F': case 'f':
+ flExit = 1, retval = READ_NEXT;
+ break;
+ case 'B': case 'b':
+ flExit = 1, retval = READ_PREV;
+ break;
+ case KEY_LEFT:
+ flExit = 1, retval = FULLUPDATE;
+ break;
+ case 'q':
+ flExit = 1, retval = FULLUPDATE;
+ break;
+
+ /* from Kaede, thread reading */
+ case ']':
+ case '+':
+ flExit = 1, retval = RELATE_NEXT;
+ break;
+ case '[':
+ case '-':
+ flExit = 1, retval = RELATE_PREV;
+ break;
+ case '=':
+ flExit = 1, retval = RELATE_FIRST;
+ break;
+ /* ------------------ NAVIGATION KEYS ------------------ */
+ /* Simple Navigation */
+ case 'k': case 'K':
+ mf_backward(1);
+ break;
+ case 'j': case 'J':
+ PMORE_UINAV_FORWARDLINE();
+ break;
+
+ case Ctrl('F'):
+ case KEY_PGDN:
+ PMORE_UINAV_FORWARDPAGE();
+ break;
+ case Ctrl('B'):
+ case KEY_PGUP:
+ mf_backward(MFNAV_PAGE);
+ break;
+
+ case '0':
+ case 'g':
+ case KEY_HOME:
+ mf_goTop();
+ break;
+ case '$':
+ case 'G':
+ case KEY_END:
+ mf_goBottom();
#ifdef PMORE_ACCURATE_WRAPEND
- /* allright. in design of pmore,
- * it's possible that when user navigates to file end,
- * a wrapped line made nav not 100%.
- */
- mf_display();
- invalidate = 0;
-
- if(!mf_viewedAll())
- {
- /* one more try. */
- mf_goBottom();
- invalidate = 1;
- }
+ /* allright. in design of pmore,
+ * it's possible that when user navigates to file end,
+ * a wrapped line made nav not 100%.
+ */
+ mf_display();
+ invalidate = 0;
+
+ if(!mf_viewedAll())
+ {
+ /* one more try. */
+ mf_goBottom();
+ invalidate = 1;
+ }
#endif
- break;
-
- /* Compound Navigation */
- case '.':
- if(mf.xpos == 0)
- mf.xpos ++;
- mf.xpos ++;
- break;
- case ',':
- if(mf.xpos > 0)
- mf.xpos --;
- break;
- case '\t':
- case '>':
- //if(mf.xpos == 0 || mf.trunclines)
- mf.xpos = (mf.xpos/8+1)*8;
- break;
- /* acronym form shift-tab, ^[[Z */
- /* however some terminals does not send that. */
- case KEY_STAB:
- case '<':
- mf.xpos = (mf.xpos/8-1)*8;
- if(mf.xpos < 0) mf.xpos = 0;
- break;
- case '\r':
- case '\n':
- case KEY_DOWN:
- if (mf_viewedAll() ||
- (promptend == 2 && (ch == '\r' || ch == '\n')))
- flExit = 1, retval = READ_NEXT;
- else
- PMORE_UINAV_FORWARDLINE();
- break;
-
- case ' ':
- if (mf_viewedAll())
- flExit = 1, retval = READ_NEXT;
- else
- PMORE_UINAV_FORWARDPAGE();
- break;
- case KEY_RIGHT:
- if(mf_viewedAll())
- promptend = 0, flExit = 1, retval = 0;
- else
- {
- /* if mf.xpos > 0, widenav mode. */
- /* because we have other keys to do so,
- * disable it now.
- */
- /*
- if(mf.trunclines > 0)
- {
- if(mf.xpos == 0)
- mf.xpos++;
- mf.xpos++;
- }
- else if (mf.xpos == 0)
- */
- PMORE_UINAV_FORWARDPAGE();
- }
- break;
-
- case KEY_UP:
- if(mf_viewedNone())
- flExit = 1, retval = READ_PREV;
- else
- mf_backward(1);
- break;
- case Ctrl('H'):
- if(mf_viewedNone())
- flExit = 1, retval = READ_PREV;
- else
- mf_backward(MFNAV_PAGE);
- break;
-
- case 't':
- if (mf_viewedAll())
- flExit = 1, retval = RELATE_NEXT;
- else
- PMORE_UINAV_FORWARDPAGE();
- break;
- /* ------------------ SEARCH KEYS ------------------ */
- case '/':
- {
- char sbuf[81] = "";
- char ans[4] = "n";
-
- if(sr.search_str) {
- free(sr.search_str);
- sr.search_str = NULL;
- }
-
- getdata(b_lines - 1, 0, PMORE_MSG_SEARCH_KEYWORD, sbuf,
- 40, DOECHO);
-
- if (sbuf[0]) {
- if (getdata(b_lines - 1, 0, "°Ï¤À¤j¤p¼g(Y/N/Q)? [N] ",
- ans, sizeof(ans), LCECHO) && *ans == 'y')
- sr.cmpfunc = strncmp;
- else if (*ans == 'q')
- sbuf[0] = 0;
- else
- sr.cmpfunc = strncasecmp;
- }
- sr.len = strlen(sbuf);
- if(sr.len) sr.search_str = (unsigned char*)strdup(sbuf);
- mf_search(MFSEARCH_FORWARD);
- MFDISP_DIRTY();
- }
- break;
- case 'n':
- mf_search(MFSEARCH_FORWARD);
- break;
- case 'N':
- mf_search(MFSEARCH_BACKWARD);
- break;
- /* ------------------ SPECIAL KEYS ------------------ */
- case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- case ';': case ':':
- {
- char buf[16] = "";
- int i = 0;
- int pageMode = (ch != ':');
- if (ch >= '1' && ch <= '9')
- buf[0] = ch, buf[1] = 0;
-
- pmore_clrtoeol(b_lines-1, 0);
- getdata_buf(b_lines-1, 0,
- (pageMode ?
- "¸õ¦Ü¦¹­¶(­Y­n§ï«ü©w¦æ¼Æ½Ð¦bµ²§À¥[.): " :
- "¸õ¦Ü¦¹¦æ: "),
- buf, 8, DOECHO);
- if(buf[0]) {
- i = atoi(buf);
- if(buf[strlen(buf)-1] == '.')
- pageMode = 0;
- if(i-- > 0)
- mf_goto(i * (pageMode ? MFNAV_PAGE : 1));
- }
- MFDISP_DIRTY();
- }
- break;
-
- case 'h': case 'H': case KEY_F1:
- case '?':
- // help
- show_help(pmore_help);
- MFDISP_DIRTY();
- break;
+ break;
+
+ /* Compound Navigation */
+ case '.':
+ if(mf.xpos == 0)
+ mf.xpos ++;
+ mf.xpos ++;
+ break;
+ case ',':
+ if(mf.xpos > 0)
+ mf.xpos --;
+ break;
+ case '\t':
+ case '>':
+ //if(mf.xpos == 0 || mf.trunclines)
+ mf.xpos = (mf.xpos/8+1)*8;
+ break;
+ /* acronym form shift-tab, ^[[Z */
+ /* however some terminals does not send that. */
+ case KEY_STAB:
+ case '<':
+ mf.xpos = (mf.xpos/8-1)*8;
+ if(mf.xpos < 0) mf.xpos = 0;
+ break;
+ case '\r':
+ case '\n':
+ case KEY_DOWN:
+ if (mf_viewedAll() ||
+ (promptend == 2 && (ch == '\r' || ch == '\n')))
+ flExit = 1, retval = READ_NEXT;
+ else
+ PMORE_UINAV_FORWARDLINE();
+ break;
+
+ case ' ':
+ if (mf_viewedAll())
+ flExit = 1, retval = READ_NEXT;
+ else
+ PMORE_UINAV_FORWARDPAGE();
+ break;
+ case KEY_RIGHT:
+ if(mf_viewedAll())
+ promptend = 0, flExit = 1, retval = 0;
+ else
+ {
+ /* if mf.xpos > 0, widenav mode. */
+ /* because we have other keys to do so,
+ * disable it now.
+ */
+ /*
+ if(mf.trunclines > 0)
+ {
+ if(mf.xpos == 0)
+ mf.xpos++;
+ mf.xpos++;
+ }
+ else if (mf.xpos == 0)
+ */
+ PMORE_UINAV_FORWARDPAGE();
+ }
+ break;
+
+ case KEY_UP:
+ if(mf_viewedNone())
+ flExit = 1, retval = READ_PREV;
+ else
+ mf_backward(1);
+ break;
+ case Ctrl('H'):
+ if(mf_viewedNone())
+ flExit = 1, retval = READ_PREV;
+ else
+ mf_backward(MFNAV_PAGE);
+ break;
+
+ case 't':
+ if (mf_viewedAll())
+ flExit = 1, retval = RELATE_NEXT;
+ else
+ PMORE_UINAV_FORWARDPAGE();
+ break;
+ /* ------------------ SEARCH KEYS ------------------ */
+ case '/':
+ {
+ char sbuf[81] = "";
+ char ans[4] = "n";
+
+ if(sr.search_str) {
+ free(sr.search_str);
+ sr.search_str = NULL;
+ }
+
+ getdata(b_lines - 1, 0, PMORE_MSG_SEARCH_KEYWORD, sbuf,
+ 40, DOECHO);
+
+ if (sbuf[0]) {
+ if (getdata(b_lines - 1, 0, "°Ï¤À¤j¤p¼g(Y/N/Q)? [N] ",
+ ans, sizeof(ans), LCECHO) && *ans == 'y')
+ sr.cmpfunc = strncmp;
+ else if (*ans == 'q')
+ sbuf[0] = 0;
+ else
+ sr.cmpfunc = strncasecmp;
+ }
+ sr.len = strlen(sbuf);
+ if(sr.len) sr.search_str = (unsigned char*)strdup(sbuf);
+ mf_search(MFSEARCH_FORWARD);
+ MFDISP_DIRTY();
+ }
+ break;
+ case 'n':
+ mf_search(MFSEARCH_FORWARD);
+ break;
+ case 'N':
+ mf_search(MFSEARCH_BACKWARD);
+ break;
+ /* ------------------ SPECIAL KEYS ------------------ */
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ';': case ':':
+ {
+ char buf[16] = "";
+ int i = 0;
+ int pageMode = (ch != ':');
+ if (ch >= '1' && ch <= '9')
+ buf[0] = ch, buf[1] = 0;
+
+ pmore_clrtoeol(b_lines-1, 0);
+ getdata_buf(b_lines-1, 0,
+ (pageMode ?
+ "¸õ¦Ü¦¹­¶(­Y­n§ï«ü©w¦æ¼Æ½Ð¦bµ²§À¥[.): " :
+ "¸õ¦Ü¦¹¦æ: "),
+ buf, 8, DOECHO);
+ if(buf[0]) {
+ i = atoi(buf);
+ if(buf[strlen(buf)-1] == '.')
+ pageMode = 0;
+ if(i-- > 0)
+ mf_goto(i * (pageMode ? MFNAV_PAGE : 1));
+ }
+ MFDISP_DIRTY();
+ }
+ break;
+
+ case 'h': case 'H': case KEY_F1:
+ case '?':
+ // help
+ show_help(pmore_help);
+ MFDISP_DIRTY();
+ break;
#ifdef PMORE_NOTIFY_NEWPREF
- //let's be backward compatible!
- case 'l':
- case 'w':
- case 'W':
- case '|':
- vmsg("³o­Ó«öÁä¤w¾ã¦X¶i·sªº³]©w (o) ¤F");
- break;
+ //let's be backward compatible!
+ case 'l':
+ case 'w':
+ case 'W':
+ case '|':
+ vmsg("³o­Ó«öÁä¤w¾ã¦X¶i·sªº³]©w (o) ¤F");
+ break;
#endif // PMORE_NOTIFY_NEWPREF
- case '\\': // everyone loves backslash, let's keep it.
- pmore_QuickRawModePref();
- MFDISP_DIRTY();
- break;
+ case '\\': // everyone loves backslash, let's keep it.
+ pmore_QuickRawModePref();
+ MFDISP_DIRTY();
+ break;
- case 'o':
- pmore_Preference();
- MFDISP_DIRTY();
- break;
+ case 'o':
+ pmore_Preference();
+ MFDISP_DIRTY();
+ break;
#if defined(USE_BBSLUA) && defined(RET_DOBBSLUA)
- case 'P':
- vmsg("«D±`©êºp¡ABBS-Lua ªº¼öÁä¤w§ï¬° L ¡A½Ð§ï«ö L");
- break;
-
- case 'L':
- case 'l':
- flExit = 1, retval = RET_DOBBSLUA;
- break;
+ case 'P':
+ vmsg("«D±`©êºp¡ABBS-Lua ªº¼öÁä¤w§ï¬° L ¡A½Ð§ï«ö L");
+ break;
+
+ case 'L':
+ case 'l':
+ flExit = 1, retval = RET_DOBBSLUA;
+ break;
#endif
#ifdef PMORE_USE_ASCII_MOVIE
- case 'p':
- /* play ascii movie again
- */
- if(mfmovie.mode == MFDISP_MOVIE_YES)
- {
- RESET_MOVIE();
- mfmovie.mode = MFDISP_MOVIE_PLAYING;
- mf_determinemaxdisps(0, 0); // display until last line
- /* it is said that it's better not to go top. */
- // mf_goTop();
- mf_movieNextFrame();
- MFDISP_DIRTY();
- }
- else if (mfmovie.mode == MFDISP_MOVIE_NO)
- {
- static char buf[10]="1";
- //move(b_lines-1, 0);
-
- /*
- * TODO scan current page to confirm if this is a new style movie
- */
- pmore_clrtoeol(b_lines-1, 0);
- getdata_buf(b_lines - 1, 0,
- PMORE_MSG_MOVIE_PLAYOLD_GETTIME,
- buf, 8, LCECHO);
-
- if(buf[0])
- {
- float nf = 0;
- nf = atof(buf); // sscanf(buf, "%f", &nf);
- RESET_MOVIE();
-
- mfmovie.mode = MFDISP_MOVIE_PLAYING_OLD;
- mf_float2tv(nf, &mfmovie.frameclk);
- mfmovie.compat24 = 0;
- /* are we really going to start? check termsize! */
- if (t_lines != 24)
- {
- char ans[4];
- pmore_clrtoeol(b_lines-1, 0);
- getdata(b_lines - 1, 0,
- PMORE_MSG_MOVIE_PLAYOLD_AS24L,
- ans, 3, LCECHO);
- if(ans[0] == 'n')
- mfmovie.compat24 = 0;
- else
- mfmovie.compat24 = 1;
- }
- mf_determinemaxdisps(0, 0); // display until last line
- MFDISP_DIRTY();
- }
- }
- break;
+ case 'p':
+ /* play ascii movie again
+ */
+ if(mfmovie.mode == MFDISP_MOVIE_YES)
+ {
+ RESET_MOVIE();
+ mfmovie.mode = MFDISP_MOVIE_PLAYING;
+ mf_determinemaxdisps(0, 0); // display until last line
+ /* it is said that it's better not to go top. */
+ // mf_goTop();
+ mf_movieNextFrame();
+ MFDISP_DIRTY();
+ }
+ else if (mfmovie.mode == MFDISP_MOVIE_NO)
+ {
+ static char buf[10]="1";
+ //move(b_lines-1, 0);
+
+ /*
+ * TODO scan current page to confirm if this is a new style movie
+ */
+ pmore_clrtoeol(b_lines-1, 0);
+ getdata_buf(b_lines - 1, 0,
+ PMORE_MSG_MOVIE_PLAYOLD_GETTIME,
+ buf, 8, LCECHO);
+
+ if(buf[0])
+ {
+ float nf = 0;
+ nf = atof(buf); // sscanf(buf, "%f", &nf);
+ RESET_MOVIE();
+
+ mfmovie.mode = MFDISP_MOVIE_PLAYING_OLD;
+ mf_float2tv(nf, &mfmovie.frameclk);
+ mfmovie.compat24 = 0;
+ /* are we really going to start? check termsize! */
+ if (t_lines != 24)
+ {
+ char ans[4];
+ pmore_clrtoeol(b_lines-1, 0);
+ getdata(b_lines - 1, 0,
+ PMORE_MSG_MOVIE_PLAYOLD_AS24L,
+ ans, 3, LCECHO);
+ if(ans[0] == 'n')
+ mfmovie.compat24 = 0;
+ else
+ mfmovie.compat24 = 1;
+ }
+ mf_determinemaxdisps(0, 0); // display until last line
+ MFDISP_DIRTY();
+ }
+ }
+ break;
#endif
#ifdef DEBUG
- case 'd':
- debug = !debug;
- MFDISP_DIRTY();
- break;
+ case 'd':
+ debug = !debug;
+ MFDISP_DIRTY();
+ break;
#endif
- }
- /* DO NOT DO ANYTHING HERE. NOT SAFE RIGHT NOW. */
+ }
+ /* DO NOT DO ANYTHING HERE. NOT SAFE RIGHT NOW. */
}
mf_detach();
if (retval == 0 && promptend) {
- pressanykey();
- clear();
+ pressanykey();
+ clear();
} else
- outs(reset_color);
+ outs(reset_color);
REENTRANT_RESTORE();
return retval;
@@ -2480,10 +2480,10 @@ pmore(char *fpath, int promptend)
static void
pmore_prefEntry(
- int isel,
- const char *key, int szKey,
- const char *text,int szText,
- const char* options)
+ int isel,
+ const char *key, int szKey,
+ const char *text,int szText,
+ const char* options)
{
int i = 23;
// print key/text
@@ -2502,41 +2502,41 @@ pmore_prefEntry(
i = 0;
while (*options)
{
- if (*options == '\t')
- {
- // blank option, skip it.
- i++, options++;
- continue;
- }
-
- if (i > 0)
- outs(ANSI_COLOR(1;30) " |" ANSI_RESET); //OPTATTR_BAR " | " ANSI_RESET);
-
- // test if option has hotkey
- if (*options && *options != '\t' &&
- *(options+1) && *(options+1) == '.')
- {
- // found hotkey
- outs(ANSI_COLOR(1;31)); //OPTATTR_NORMAL_KEY);
- outc(*options);
- outs(ANSI_RESET);
- options +=2;
- }
-
- if (i == isel)
- {
- outs(ANSI_COLOR(1;36) "*");// OPTATTR_SELECTED);
- }
- else
- outc(' ');
-
- while (*options && *options != '\t')
- outc(*options++);
-
- outs(ANSI_RESET);
-
- if (*options)
- i++, options ++;
+ if (*options == '\t')
+ {
+ // blank option, skip it.
+ i++, options++;
+ continue;
+ }
+
+ if (i > 0)
+ outs(ANSI_COLOR(1;30) " |" ANSI_RESET); //OPTATTR_BAR " | " ANSI_RESET);
+
+ // test if option has hotkey
+ if (*options && *options != '\t' &&
+ *(options+1) && *(options+1) == '.')
+ {
+ // found hotkey
+ outs(ANSI_COLOR(1;31)); //OPTATTR_NORMAL_KEY);
+ outc(*options);
+ outs(ANSI_RESET);
+ options +=2;
+ }
+
+ if (i == isel)
+ {
+ outs(ANSI_COLOR(1;36) "*");// OPTATTR_SELECTED);
+ }
+ else
+ outc(' ');
+
+ while (*options && *options != '\t')
+ outc(*options++);
+
+ outs(ANSI_RESET);
+
+ if (*options)
+ i++, options ++;
}
outc('\n');
}
@@ -2548,18 +2548,18 @@ pmore_PromptBar(const char *caption, int shadow)
if (shadow)
{
- outs(ANSI_COLOR(0;1;30));
- for(i = 0; i+2 < t_columns ; i+=2)
- outs("¢b");
- outs(ANSI_RESET "\n");
+ outs(ANSI_COLOR(0;1;30));
+ for(i = 0; i+2 < t_columns ; i+=2)
+ outs("¢b");
+ outs(ANSI_RESET "\n");
}
else
- i = t_columns -2;
+ i = t_columns -2;
outs(ANSI_COLOR(7));
outs(caption);
for(i -= strlen(caption); i > 0; i--)
- outs(" ");
+ outs(" ");
outs(ANSI_RESET "\n");
}
@@ -2574,38 +2574,38 @@ pmore_QuickRawModePref()
while(1)
{
- move(ystart, 0);
- clrtobot();
- pmore_PromptBar(PMORE_MSG_PREF_TITLE_QRAW, 0);
-
- // list options
- pmore_prefEntry(bpref.rawmode,
- "\\", 1, "¦â±mÅã¥Ü¤è¦¡:", -1,
- "1.¹w³]®æ¦¡¤Æ¤º®e\t2.­ì©lANSI±±¨î½X\t3.¯Â¤å¦r");
-
- switch(vmsg("½Ð½Õ¾ã³]©w (1-3 ¥iª½±µ¿ï©w¡A\\¥i¤Á´«) ©Î¨ä¥¦¥ô·NÁäµ²§ô¡C"))
- {
- case '\\':
- bpref.rawmode = (bpref.rawmode+1) % MFDISP_RAW_MODES;
- break;
- case '1':
- bpref.rawmode = MFDISP_RAW_NA;
- return;
- case '2':
- bpref.rawmode = MFDISP_RAW_NOANSI;
- return;
- case '3':
- bpref.rawmode = MFDISP_RAW_PLAIN;
- return;
- case KEY_LEFT:
- if (bpref.rawmode > 0) bpref.rawmode --;
- break;
- case KEY_RIGHT:
- if (bpref.rawmode < MFDISP_RAW_MODES-1) bpref.rawmode ++;
- break;
- default:
- return;
- }
+ move(ystart, 0);
+ clrtobot();
+ pmore_PromptBar(PMORE_MSG_PREF_TITLE_QRAW, 0);
+
+ // list options
+ pmore_prefEntry(bpref.rawmode,
+ "\\", 1, "¦â±mÅã¥Ü¤è¦¡:", -1,
+ "1.¹w³]®æ¦¡¤Æ¤º®e\t2.­ì©lANSI±±¨î½X\t3.¯Â¤å¦r");
+
+ switch(vmsg("½Ð½Õ¾ã³]©w (1-3 ¥iª½±µ¿ï©w¡A\\¥i¤Á´«) ©Î¨ä¥¦¥ô·NÁäµ²§ô¡C"))
+ {
+ case '\\':
+ bpref.rawmode = (bpref.rawmode+1) % MFDISP_RAW_MODES;
+ break;
+ case '1':
+ bpref.rawmode = MFDISP_RAW_NA;
+ return;
+ case '2':
+ bpref.rawmode = MFDISP_RAW_NOANSI;
+ return;
+ case '3':
+ bpref.rawmode = MFDISP_RAW_PLAIN;
+ return;
+ case KEY_LEFT:
+ if (bpref.rawmode > 0) bpref.rawmode --;
+ break;
+ case KEY_RIGHT:
+ if (bpref.rawmode < MFDISP_RAW_MODES-1) bpref.rawmode ++;
+ break;
+ default:
+ return;
+ }
}
}
@@ -2622,59 +2622,59 @@ pmore_Preference()
while (1)
{
- move(ystart, 0);
- clrtobot();
- pmore_PromptBar(PMORE_MSG_PREF_TITLE, 1);
- outs("\n");
-
- // list options
- pmore_prefEntry(bpref.rawmode,
- "\\", 1, "¦â±mÅã¥Ü¤è¦¡:", -1,
- "¹w³]®æ¦¡¤Æ¤º®e\t­ì©lANSI±±¨î½X\t¯Â¤å¦r");
-
- pmore_prefEntry(bpref.wrapmode,
- "w", 1, "Â_¦æ¤è¦¡:", -1,
- "ª½±µºI¦æ\t¦Û°ÊÂ_¦æ");
-
- pmore_prefEntry(bpref.wrapindicator,
- "m", 1, "Â_¦æ²Å¸¹:", -1,
- "¤£Åã¥Ü\tÅã¥Ü");
-
- pmore_prefEntry(bpref.separator,
- "l", 1, "¤å³¹¼ÐÀY¤À¹j½u:", -1,
- "µL\t³æ¦æ\t\t¶Ç²Î¤À¹j½u¥[ªÅ¦æ");
-
- pmore_prefEntry(bpref.oldstatusbar,
- "t", 1, "¶Ç²Îª¬ºA¦C»PÂ_¦æ¤è¦¡: ", -1,
- "°±¥Î\t±Ò¥Î");
-
- switch(vmsg("½Ð½Õ¾ã³]©w©Î¨ä¥¦¥ô·NÁäµ²§ô¡C"))
- {
- case '\\':
- case '|':
- bpref.rawmode = (bpref.rawmode+1) % MFDISP_RAW_MODES;
- break;
- case 'w':
- bpref.wrapmode = (bpref.wrapmode+1) % MFDISP_WRAP_MODES;
- break;
- case 'm':
- bpref.wrapindicator = !bpref.wrapindicator;
- break;
- case 'l':
- // there's no MFDISP_SEP_WRAP only mode.
- if (++bpref.separator == MFDISP_SEP_WRAP)
- bpref.separator ++;
- bpref.separator %= MFDISP_SEP_MODES;
- break;
- case 't':
- bpref.oldwrapmode = !bpref.oldwrapmode;
- bpref.oldstatusbar = !bpref.oldstatusbar;
- break;
-
- default:
- // finished settings
- return;
- }
+ move(ystart, 0);
+ clrtobot();
+ pmore_PromptBar(PMORE_MSG_PREF_TITLE, 1);
+ outs("\n");
+
+ // list options
+ pmore_prefEntry(bpref.rawmode,
+ "\\", 1, "¦â±mÅã¥Ü¤è¦¡:", -1,
+ "¹w³]®æ¦¡¤Æ¤º®e\t­ì©lANSI±±¨î½X\t¯Â¤å¦r");
+
+ pmore_prefEntry(bpref.wrapmode,
+ "w", 1, "Â_¦æ¤è¦¡:", -1,
+ "ª½±µºI¦æ\t¦Û°ÊÂ_¦æ");
+
+ pmore_prefEntry(bpref.wrapindicator,
+ "m", 1, "Â_¦æ²Å¸¹:", -1,
+ "¤£Åã¥Ü\tÅã¥Ü");
+
+ pmore_prefEntry(bpref.separator,
+ "l", 1, "¤å³¹¼ÐÀY¤À¹j½u:", -1,
+ "µL\t³æ¦æ\t\t¶Ç²Î¤À¹j½u¥[ªÅ¦æ");
+
+ pmore_prefEntry(bpref.oldstatusbar,
+ "t", 1, "¶Ç²Îª¬ºA¦C»PÂ_¦æ¤è¦¡: ", -1,
+ "°±¥Î\t±Ò¥Î");
+
+ switch(vmsg("½Ð½Õ¾ã³]©w©Î¨ä¥¦¥ô·NÁäµ²§ô¡C"))
+ {
+ case '\\':
+ case '|':
+ bpref.rawmode = (bpref.rawmode+1) % MFDISP_RAW_MODES;
+ break;
+ case 'w':
+ bpref.wrapmode = (bpref.wrapmode+1) % MFDISP_WRAP_MODES;
+ break;
+ case 'm':
+ bpref.wrapindicator = !bpref.wrapindicator;
+ break;
+ case 'l':
+ // there's no MFDISP_SEP_WRAP only mode.
+ if (++bpref.separator == MFDISP_SEP_WRAP)
+ bpref.separator ++;
+ bpref.separator %= MFDISP_SEP_MODES;
+ break;
+ case 't':
+ bpref.oldwrapmode = !bpref.oldwrapmode;
+ bpref.oldstatusbar = !bpref.oldstatusbar;
+ break;
+
+ default:
+ // finished settings
+ return;
+ }
}
}
@@ -2693,9 +2693,9 @@ void
mf_float2tv(float f, struct timeval *ptv)
{
if(f < MOVIE_MIN_FRAMECLK)
- f = MOVIE_MIN_FRAMECLK;
+ f = MOVIE_MIN_FRAMECLK;
if (f > MOVIE_MAX_FRAMECLK)
- f = MOVIE_MAX_FRAMECLK;
+ f = MOVIE_MAX_FRAMECLK;
ptv->tv_sec = (long) f;
ptv->tv_usec = (f - (long)f) * MOVIE_SECOND_U;
@@ -2709,12 +2709,12 @@ mf_str2float(unsigned char *p, unsigned char *end, float *pf)
/* process time */
while ( p < end &&
- cbuf < sizeof(buf)-1 &&
- (isdigit(*p) || *p == '.' || *p == '+' || *p == '-'))
- buf[cbuf++] = *p++;
+ cbuf < sizeof(buf)-1 &&
+ (isdigit(*p) || *p == '.' || *p == '+' || *p == '-'))
+ buf[cbuf++] = *p++;
if (!cbuf)
- return 0;
+ return 0;
buf[cbuf] = 0;
*pf = atof(buf);
@@ -2735,36 +2735,36 @@ pmore_wait_key(struct timeval *ptv, int dorefresh)
int c = 0;
if (dorefresh)
- refresh();
+ refresh();
do {
- // if already something in queue,
- // detemine if ok to break.
- while ( num_in_buf() > 0)
- {
- if (!mf_movieMaskedInput((c = igetch())))
- return c;
- }
-
- // wait for real user interaction
- FD_ZERO(&readfds);
- FD_SET(0, &readfds);
+ // if already something in queue,
+ // detemine if ok to break.
+ while ( num_in_buf() > 0)
+ {
+ if (!mf_movieMaskedInput((c = igetch())))
+ return c;
+ }
+
+ // wait for real user interaction
+ FD_ZERO(&readfds);
+ FD_SET(0, &readfds);
#ifdef STATINC
- STATINC(STAT_SYSSELECT);
+ STATINC(STAT_SYSSELECT);
#endif
- sel = select(1, &readfds, NULL, NULL, ptv);
+ sel = select(1, &readfds, NULL, NULL, ptv);
- // if select() stopped by other interrupt,
- // do it again.
- if (sel < 0 && errno == EINTR)
- continue;
+ // if select() stopped by other interrupt,
+ // do it again.
+ if (sel < 0 && errno == EINTR)
+ continue;
- // if (sel > 0), try to read.
- // note: there may be more in queue.
- // will be processed at next loop.
- if (sel > 0 && !mf_movieMaskedInput((c = igetch())))
- return c;
+ // if (sel > 0), try to read.
+ // note: there may be more in queue.
+ // will be processed at next loop.
+ if (sel > 0 && !mf_movieMaskedInput((c = igetch())))
+ return c;
} while (sel > 0);
@@ -2774,7 +2774,7 @@ pmore_wait_key(struct timeval *ptv, int dorefresh)
// sync clock(now) if timeout.
if (sel == 0)
- syncnow();
+ syncnow();
return (sel == 0) ? 0 : 1;
}
@@ -2789,32 +2789,32 @@ mf_moviePromptPlaying(int type)
if (override_msg)
{
- // we must warn user about something...
- move(type ? b_lines-2 : b_lines-1, 0); // clrtoeol?
- outs(ANSI_RESET);
- if (override_attr) outs(override_attr);
- w -= strlen(override_msg);
- outs(override_msg);
- while(w-- > 0) outc(' ');
-
- outs(ANSI_RESET ANSI_CLRTOEND);
- RESET_OVERRIDE_MSG();
- w = t_columns -1;
+ // we must warn user about something...
+ move(type ? b_lines-2 : b_lines-1, 0); // clrtoeol?
+ outs(ANSI_RESET);
+ if (override_attr) outs(override_attr);
+ w -= strlen(override_msg);
+ outs(override_msg);
+ while(w-- > 0) outc(' ');
+
+ outs(ANSI_RESET ANSI_CLRTOEND);
+ RESET_OVERRIDE_MSG();
+ w = t_columns -1;
}
move(type ? b_lines-1 : b_lines, 0); // clrtoeol?
if (type)
{
- outs(ANSI_RESET ANSI_COLOR(1;34;47));
- s = " >> ½Ð¿é¤J¿ï¶µ: (¤¬°Ê¦¡°Êµe¼½©ñ¤¤¡A¥i«ö q ©Î Ctrl-C ¤¤Â_)";
+ outs(ANSI_RESET ANSI_COLOR(1;34;47));
+ s = " >> ½Ð¿é¤J¿ï¶µ: (¤¬°Ê¦¡°Êµe¼½©ñ¤¤¡A¥i«ö q ©Î Ctrl-C ¤¤Â_)";
}
else if (mfmovie.interactive)
{
- outs(ANSI_RESET ANSI_COLOR(1;34;47));
- s = PMORE_MSG_MOVIE_INTERACTION_PLAYING;
+ outs(ANSI_RESET ANSI_COLOR(1;34;47));
+ s = PMORE_MSG_MOVIE_INTERACTION_PLAYING;
} else {
- outs(ANSI_RESET ANSI_COLOR(1;30;47));
+ outs(ANSI_RESET ANSI_COLOR(1;30;47));
}
w -= strlen(s); outs(s);
@@ -2822,8 +2822,8 @@ mf_moviePromptPlaying(int type)
while(w-- > 0) outc(' '); outs(ANSI_RESET ANSI_CLRTOEND);
if (type)
{
- move(b_lines, 0);
- clrtoeol();
+ move(b_lines, 0);
+ clrtoeol();
}
return 1;
@@ -2832,81 +2832,81 @@ mf_moviePromptPlaying(int type)
// return = printed characters
int
mf_moviePromptOptions(
- int isel, int maxsel,
- int key,
- unsigned char *text, unsigned int szText)
+ int isel, int maxsel,
+ int key,
+ unsigned char *text, unsigned int szText)
{
unsigned char *s = text;
int printlen = 0;
// determine if we need separator
if (maxsel)
{
- outs(OPTATTR_BAR "|" );
- printlen += 1;
+ outs(OPTATTR_BAR "|" );
+ printlen += 1;
}
// highlight if is selected
if (isel == maxsel)
- outs(OPTATTR_SELECTED_KEY);
+ outs(OPTATTR_SELECTED_KEY);
else
- outs(OPTATTR_NORMAL_KEY);
+ outs(OPTATTR_NORMAL_KEY);
outc(' '); printlen ++;
if (key > ' ' && key < 0x80) // isprint(key))
{
- outc(key);
- printlen += 1;
+ outc(key);
+ printlen += 1;
} else {
- // named keys
- printlen += 2;
-
- if (key == KEY_UP) outs("¡ô");
- else if (key == KEY_LEFT) outs("¡ö");
- else if (key == KEY_DOWN) outs("¡õ");
- else if (key == KEY_RIGHT) outs("¡÷");
- else if (key == KEY_PGUP) { outs("PgUp"); printlen += 2; }
- else if (key == KEY_PGDN) { outs("PgDn"); printlen += 2; }
- else if (key == KEY_HOME) { outs("Home"); printlen += 2; }
- else if (key == KEY_END) { outs("End"); printlen ++; }
- else if (key == KEY_INS) { outs("Ins"); printlen ++; }
- else if (key == KEY_DEL) { outs("Del"); printlen ++; }
- else if (key == '\b') { outs("¡öBS"); printlen += 2; }
- // else if (key == MOVIE_KEY_ANY) // same as default
- else printlen -= 2;
+ // named keys
+ printlen += 2;
+
+ if (key == KEY_UP) outs("¡ô");
+ else if (key == KEY_LEFT) outs("¡ö");
+ else if (key == KEY_DOWN) outs("¡õ");
+ else if (key == KEY_RIGHT) outs("¡÷");
+ else if (key == KEY_PGUP) { outs("PgUp"); printlen += 2; }
+ else if (key == KEY_PGDN) { outs("PgDn"); printlen += 2; }
+ else if (key == KEY_HOME) { outs("Home"); printlen += 2; }
+ else if (key == KEY_END) { outs("End"); printlen ++; }
+ else if (key == KEY_INS) { outs("Ins"); printlen ++; }
+ else if (key == KEY_DEL) { outs("Del"); printlen ++; }
+ else if (key == '\b') { outs("¡öBS"); printlen += 2; }
+ // else if (key == MOVIE_KEY_ANY) // same as default
+ else printlen -= 2;
}
// check text: we don't allow special char.
if (text && szText && text[0])
{
- while (s < text + szText && *s > ' ')
- {
- s++;
- }
- szText = s - text;
+ while (s < text + szText && *s > ' ')
+ {
+ s++;
+ }
+ szText = s - text;
}
else
{
- // default option text
- text = (unsigned char*)"¡¸";
- szText = ustrlen(text);
+ // default option text
+ text = (unsigned char*)"¡¸";
+ szText = ustrlen(text);
}
if (szText)
{
- if (isel == maxsel)
- outs(OPTATTR_SELECTED);
- else
- outs(OPTATTR_NORMAL);
- outs_n((char*)text, szText);
- printlen += szText;
+ if (isel == maxsel)
+ outs(OPTATTR_SELECTED);
+ else
+ outs(OPTATTR_NORMAL);
+ outs_n((char*)text, szText);
+ printlen += szText;
}
outc(' '); printlen ++;
// un-highlight
if (isel == maxsel)
- outs(OPTATTR_NORMAL);
+ outs(OPTATTR_NORMAL);
return printlen;
}
@@ -2916,23 +2916,23 @@ mf_movieNamedKey(int c)
{
switch (c)
{
- case 'u': return KEY_UP;
- case 'd': return KEY_DOWN;
- case 'l': return KEY_LEFT;
- case 'r': return KEY_RIGHT;
-
- case 'b': return '\b';
-
- case 'H': return KEY_HOME;
- case 'E': return KEY_END;
- case 'I': return KEY_INS;
- case 'D': return KEY_DEL;
- case 'P': return KEY_PGUP;
- case 'N': return KEY_PGDN;
-
- case 'a': return MOVIE_KEY_ANY;
- default:
- break;
+ case 'u': return KEY_UP;
+ case 'd': return KEY_DOWN;
+ case 'l': return KEY_LEFT;
+ case 'r': return KEY_RIGHT;
+
+ case 'b': return '\b';
+
+ case 'H': return KEY_HOME;
+ case 'E': return KEY_END;
+ case 'I': return KEY_INS;
+ case 'D': return KEY_DEL;
+ case 'P': return KEY_PGUP;
+ case 'N': return KEY_PGDN;
+
+ case 'a': return MOVIE_KEY_ANY;
+ default:
+ break;
}
return 0;
}
@@ -2940,7 +2940,7 @@ mf_movieNamedKey(int c)
int mf_movieIsSystemBreak(int c)
{
return (c == 'q' || c == 'Q' || c == Ctrl('C'))
- ? 1 : 0;
+ ? 1 : 0;
}
int
@@ -2949,32 +2949,32 @@ mf_movieMaskedInput(int c)
unsigned char *p = mfmovie.optkeys;
if (!p)
- return 0;
+ return 0;
// some keys cannot be masked
if (mf_movieIsSystemBreak(c))
- return 0;
+ return 0;
// treat BS and DEL as same one
if (c == MOVIE_KEY_BS2)
- c = '\b';
+ c = '\b';
// general look up
while (p < mf.end && *p && *p != '\n' && *p != '#')
{
- if (*p == '@' && mf.end - p > 1
- && isalnum(*(p+1))) // named key
- {
- p++;
-
- // special: 'a' masks all
- if (*p == 'a' || mf_movieNamedKey(*p) == c)
- return 1;
- } else {
- if ((int)*p == c)
- return 1;
- }
- p++;
+ if (*p == '@' && mf.end - p > 1
+ && isalnum(*(p+1))) // named key
+ {
+ p++;
+
+ // special: 'a' masks all
+ if (*p == 'a' || mf_movieNamedKey(*p) == c)
+ return 1;
+ } else {
+ if ((int)*p == c)
+ return 1;
+ }
+ p++;
}
return 0;
}
@@ -2988,36 +2988,36 @@ mf_movieFrameHeader(unsigned char *p, unsigned char *end)
static char *patHeader = "==" ESC_STR "[30;40m^L";
static char *patHeader2= ESC_STR "[30;40m^L"; // patHeader + 2; // "=="
// static char *patHeader3= ESC_STR "[m^L";
- static size_t szPatHeader = 12; // strlen(patHeader);
- static size_t szPatHeader2 = 10; // strlen(patHeader2);
+ static size_t szPatHeader = 12; // strlen(patHeader);
+ static size_t szPatHeader2 = 10; // strlen(patHeader2);
// static size_t szPatHeader3 = 5; // strlen(patHeader3);
size_t sz = end - p;
if (sz < 1) return NULL;
- if(*p == 12) // ^L
- return p+1;
+ if(*p == 12) // ^L
+ return p+1;
if (sz < 2) return NULL;
if( *p == '^' &&
- *(p+1) == 'L')
- return p+2;
+ *(p+1) == 'L')
+ return p+2;
// Add more frame headers
/* // *[m seems not so common, skip.
if (sz < szPatHeader3) return NULL;
if (memcmp(p, patHeader3, szPatHeader3) == 0)
- return p + szPatHeader3;
- */
+ return p + szPatHeader3;
+ */
if (sz < szPatHeader2) return NULL;
if (memcmp(p, patHeader2, szPatHeader2) == 0)
- return p + szPatHeader2;
+ return p + szPatHeader2;
if (sz < szPatHeader) return NULL;
if (memcmp(p, patHeader, szPatHeader) == 0)
- return p + szPatHeader;
+ return p + szPatHeader;
return NULL;
}
@@ -3030,7 +3030,7 @@ mf_movieGotoNamedFrame(const unsigned char *name, const unsigned char *end)
// resolve name first
while (p < end && isalnum(*p))
- p++;
+ p++;
sz = p - name;
if (sz < 1) return 0;
@@ -3041,22 +3041,22 @@ mf_movieGotoNamedFrame(const unsigned char *name, const unsigned char *end)
do
{
- if ((p = mf_movieFrameHeader(mf.disps, mf.end)) == NULL ||
- *p != ':')
- continue;
+ if ((p = mf_movieFrameHeader(mf.disps, mf.end)) == NULL ||
+ *p != ':')
+ continue;
- // got some frame. let's check the name
- p++;
- if (mf.end - p < sz)
- continue;
+ // got some frame. let's check the name
+ p++;
+ if (mf.end - p < sz)
+ continue;
- // check: target of p must end.
- if (mf.end -p > sz &&
- isalnum(*(p+sz)))
- continue;
+ // check: target of p must end.
+ if (mf.end -p > sz &&
+ isalnum(*(p+sz)))
+ continue;
- if (memcmp(p, name, sz) == 0)
- return 1;
+ if (memcmp(p, name, sz) == 0)
+ return 1;
} while (mf_forward(1) > 0);
return 0;
@@ -3066,65 +3066,65 @@ int
mf_movieGotoFrame(int fno, int relative)
{
if (!relative)
- mf_goTop();
+ mf_goTop();
else if (fno > 0)
- mf_forward(1);
+ mf_forward(1);
// for absolute, fno = 1..N
if (fno > 0)
{
- // move forward
- do {
- while (mf_movieFrameHeader(mf.disps, mf.end) == NULL)
- {
- if (mf_forward(1) < 1)
- return 0;
- }
- // found frame.
- if (--fno > 0)
- mf_forward(1);
- } while (fno > 0);
+ // move forward
+ do {
+ while (mf_movieFrameHeader(mf.disps, mf.end) == NULL)
+ {
+ if (mf_forward(1) < 1)
+ return 0;
+ }
+ // found frame.
+ if (--fno > 0)
+ mf_forward(1);
+ } while (fno > 0);
} else {
- // backward
- // XXX check if we reached head?
- while (fno < 0)
- {
- do {
- if (mf_backward(1) < 1)
- return 0;
- } while (mf_movieFrameHeader(mf.disps, mf.end) == NULL);
- fno ++;
- }
+ // backward
+ // XXX check if we reached head?
+ while (fno < 0)
+ {
+ do {
+ if (mf_backward(1) < 1)
+ return 0;
+ } while (mf_movieFrameHeader(mf.disps, mf.end) == NULL);
+ fno ++;
+ }
}
return 1;
}
int
mf_parseOffsetCmd(
- unsigned char *s, unsigned char *end,
- int base)
+ unsigned char *s, unsigned char *end,
+ int base)
{
// return is always > 0, or base.
int v = 0;
if (s >= end)
- return base;
+ return base;
v = atoi((char*)s);
if (*s == '+' || *s == '-')
{
- // relative format
- v = base + v;
+ // relative format
+ v = base + v;
} else if (isdigit(*s)) {
- // absolute format
+ // absolute format
} else {
- // error format?
- v = 0;
+ // error format?
+ v = 0;
}
if (v <= 0)
- v = base;
+ v = base;
return v;
}
@@ -3141,58 +3141,58 @@ mf_movieExecuteOffsetCmd(unsigned char *s, unsigned char *end)
switch(*s)
{
- case 'p':
- // by page
- curr = (mf.lineno / MFDISP_PAGE) + 1;
- newno = mf_parseOffsetCmd(s+1, end, curr);
+ case 'p':
+ // by page
+ curr = (mf.lineno / MFDISP_PAGE) + 1;
+ newno = mf_parseOffsetCmd(s+1, end, curr);
#ifdef DEBUG
- vmsgf("page: %d -> %d\n", curr, newno);
+ vmsgf("page: %d -> %d\n", curr, newno);
#endif // DEBUG
- // prevent endless loop
- if (newno == curr)
- return 0;
+ // prevent endless loop
+ if (newno == curr)
+ return 0;
- return mf_goto((newno -1) * MFDISP_PAGE);
+ return mf_goto((newno -1) * MFDISP_PAGE);
- case 'l':
- // by lines
- curr = mf.lineno + 1;
- newno = mf_parseOffsetCmd(s+1, end, curr);
+ case 'l':
+ // by lines
+ curr = mf.lineno + 1;
+ newno = mf_parseOffsetCmd(s+1, end, curr);
#ifdef DEBUG
- vmsgf("line: %d -> %d\n", curr, newno);
+ vmsgf("line: %d -> %d\n", curr, newno);
#endif // DEBUG
- // prevent endless loop
- if (newno == curr)
- return 0;
-
- return mf_goto(newno-1);
-
- case 'f':
- // by frame [optimized]
- if (++s >= end)
- return 0;
-
- curr = 0;
- newno = atoi((char*)s);
- if (*s == '+' || *s == '-') // relative
- {
- curr = 1;
- if (newno == 0)
- return 0;
- } else {
- // newno starts from 1
- if (newno <= 0)
- return 0;
- }
- return mf_movieGotoFrame(newno, curr);
-
- case ':':
- // by names
- return mf_movieGotoNamedFrame(s+1, end);
-
- default:
- // not supported yet
- break;
+ // prevent endless loop
+ if (newno == curr)
+ return 0;
+
+ return mf_goto(newno-1);
+
+ case 'f':
+ // by frame [optimized]
+ if (++s >= end)
+ return 0;
+
+ curr = 0;
+ newno = atoi((char*)s);
+ if (*s == '+' || *s == '-') // relative
+ {
+ curr = 1;
+ if (newno == 0)
+ return 0;
+ } else {
+ // newno starts from 1
+ if (newno <= 0)
+ return 0;
+ }
+ return mf_movieGotoFrame(newno, curr);
+
+ case ':':
+ // by names
+ return mf_movieGotoNamedFrame(s+1, end);
+
+ default:
+ // not supported yet
+ break;
}
return 0;
}
@@ -3224,226 +3224,226 @@ mf_movieOptionHandler(unsigned char *opt, unsigned char *end)
// set up timer (opt points to optional time now)
do {
- p = opt;
- while ( p < end &&
- (isdigit(*p) || *p == '+' || *p == '-' || *p == '.') )
- p++;
-
- // if no number, abort.
- if (p == opt || (p < end && *p != '#')) break;
-
- // p looks like valid timer now
- if (mf_str2float(opt, p, &optclk))
- {
- // conversion failed.
- if (optclk == 0)
- optclk = -1.0f;
- }
-
- // point opt to new var after #.
- opt = p + 1;
- break;
+ p = opt;
+ while ( p < end &&
+ (isdigit(*p) || *p == '+' || *p == '-' || *p == '.') )
+ p++;
+
+ // if no number, abort.
+ if (p == opt || (p < end && *p != '#')) break;
+
+ // p looks like valid timer now
+ if (mf_str2float(opt, p, &optclk))
+ {
+ // conversion failed.
+ if (optclk == 0)
+ optclk = -1.0f;
+ }
+
+ // point opt to new var after #.
+ opt = p + 1;
+ break;
} while (1);
// UI Selection
do {
- // do c test here because we need parser to help us
- // finding the selection
- if (c == '\r' || c == '\n' || c == ' ')
- {
- selected = 1;
- }
-
- newOpt = 1;
- promptlen = 0;
-
- // parse (key,frame,text)
- for ( p = opt, ient = 0, maxsel = 0,
- key = '0'; // default command
- p < end && *p != '\n'; p++)
- {
- if (newOpt)
- {
- // prepare for next loop
- pkey = p;
- cmd = text = NULL;
- szCmd = szText = 0;
- ient = 0;
- newOpt = 0;
- }
-
- // calculation of fields
- if (*p == ',' || *p == '#')
- {
- switch (++ient)
- {
- // case 0 is already processed.
- case 1:
- cmd = p+1;
- break;
-
- case 2:
- text = p+1;
- szCmd = p - cmd;
- break;
-
- case 3:
- szText = p - text;
-
- default:
- // unknown parameters
- break;
- }
- }
-
- // ready to parse one option
- if (*p == '#')
- {
- newOpt = 1;
-
- // first, fix pointers
- if (szCmd == 0 || *cmd == ',' || *cmd == '#')
- { cmd = NULL; szCmd = 0; }
-
- // quick abort if option is invalid.
- if (!cmd)
- continue;
-
- if (szText == 0 || *text == ',' || *text == '#')
- { text = NULL; szText = 0; }
-
- // assign key
- if (*pkey == ',' || *pkey == '#')
- key++;
- else
- {
- // named key?
- int nk = 0;
-
- // handle special case @a (all) here
-
- if (*pkey == '@' &&
- ++ pkey < end &&
- (nk = mf_movieNamedKey(*pkey)))
- {
- key = nk;
- } else {
- key = *pkey;
- }
- // warning: pkey may be changed after this.
- }
-
- // calculation complete.
-
- // print option
- if (!hideOpts && maxsel == 0 && text == NULL)
- {
- hideOpts = 1;
- mf_moviePromptPlaying(0);
- // prevent more hideOpt test
- }
-
- if (!hideOpts)
- {
- // print header
- if (maxsel == 0)
- {
- pmore_clrtoeol(b_lines-1, 0);
- mf_moviePromptPlaying(1);
- }
-
- promptlen += mf_moviePromptOptions(
- isel, maxsel, key,
- text, szText);
- }
-
- // handle selection
- if (c == key ||
- (key == MOVIE_KEY_ANY && c != 0))
- {
- // hotkey pressed
- selected = 1;
- isel = maxsel;
- }
-
- maxsel ++;
-
- // parse complete.
- // test if this item is selected.
- if (selected && isel == maxsel - 1)
- break;
- }
- }
-
- if (selected || maxsel == 0)
- break;
-
- // finish the selection bar
- if (!hideOpts && maxsel > 0)
- {
- int iw = 0;
- for (iw = 0; iw + promptlen < t_columns-1; iw++)
- outc(' ');
- outs(ANSI_RESET ANSI_CLRTOEND);
- }
-
- // wait for input
- if (optclk > 0)
- {
- // timed interaction
-
- // disable optkeys to allow masked input
- unsigned char *tmpopt = mfmovie.optkeys;
- mfmovie.optkeys = NULL;
-
- mf_float2tv(optclk, &tv);
- c = pmore_wait_key(&tv, 1);
- mfmovie.optkeys = tmpopt;
-
- // if timeout, drop.
- if (!c)
- return 0;
- } else {
- // infinite wait
- c = igetch();
- }
-
- // parse keyboard input
- if (mf_movieIsSystemBreak(c))
- {
- // cannot be masked,
- // also force stop of playback
- STOP_MOVIE();
- vmsg(PMORE_MSG_MOVIE_INTERACTION_STOPPED);
- return 0;
- }
-
- // treat BS and DEL as same one
- if (c == MOVIE_KEY_BS2)
- c = '\b';
-
- // standard navigation keys.
- if (mf_movieMaskedInput(c))
- continue;
-
- // these keys can be masked
- if (c == KEY_LEFT || c == KEY_UP)
- {
- if (isel > 0) isel --;
- }
- else if (c == KEY_RIGHT || c == KEY_TAB || c == KEY_DOWN)
- {
- if (isel < maxsel-1) isel ++;
- }
- else if (c == KEY_HOME)
- {
- isel = 0;
- }
- else if (c == KEY_END)
- {
- isel = maxsel -1;
- }
+ // do c test here because we need parser to help us
+ // finding the selection
+ if (c == '\r' || c == '\n' || c == ' ')
+ {
+ selected = 1;
+ }
+
+ newOpt = 1;
+ promptlen = 0;
+
+ // parse (key,frame,text)
+ for ( p = opt, ient = 0, maxsel = 0,
+ key = '0'; // default command
+ p < end && *p != '\n'; p++)
+ {
+ if (newOpt)
+ {
+ // prepare for next loop
+ pkey = p;
+ cmd = text = NULL;
+ szCmd = szText = 0;
+ ient = 0;
+ newOpt = 0;
+ }
+
+ // calculation of fields
+ if (*p == ',' || *p == '#')
+ {
+ switch (++ient)
+ {
+ // case 0 is already processed.
+ case 1:
+ cmd = p+1;
+ break;
+
+ case 2:
+ text = p+1;
+ szCmd = p - cmd;
+ break;
+
+ case 3:
+ szText = p - text;
+
+ default:
+ // unknown parameters
+ break;
+ }
+ }
+
+ // ready to parse one option
+ if (*p == '#')
+ {
+ newOpt = 1;
+
+ // first, fix pointers
+ if (szCmd == 0 || *cmd == ',' || *cmd == '#')
+ { cmd = NULL; szCmd = 0; }
+
+ // quick abort if option is invalid.
+ if (!cmd)
+ continue;
+
+ if (szText == 0 || *text == ',' || *text == '#')
+ { text = NULL; szText = 0; }
+
+ // assign key
+ if (*pkey == ',' || *pkey == '#')
+ key++;
+ else
+ {
+ // named key?
+ int nk = 0;
+
+ // handle special case @a (all) here
+
+ if (*pkey == '@' &&
+ ++ pkey < end &&
+ (nk = mf_movieNamedKey(*pkey)))
+ {
+ key = nk;
+ } else {
+ key = *pkey;
+ }
+ // warning: pkey may be changed after this.
+ }
+
+ // calculation complete.
+
+ // print option
+ if (!hideOpts && maxsel == 0 && text == NULL)
+ {
+ hideOpts = 1;
+ mf_moviePromptPlaying(0);
+ // prevent more hideOpt test
+ }
+
+ if (!hideOpts)
+ {
+ // print header
+ if (maxsel == 0)
+ {
+ pmore_clrtoeol(b_lines-1, 0);
+ mf_moviePromptPlaying(1);
+ }
+
+ promptlen += mf_moviePromptOptions(
+ isel, maxsel, key,
+ text, szText);
+ }
+
+ // handle selection
+ if (c == key ||
+ (key == MOVIE_KEY_ANY && c != 0))
+ {
+ // hotkey pressed
+ selected = 1;
+ isel = maxsel;
+ }
+
+ maxsel ++;
+
+ // parse complete.
+ // test if this item is selected.
+ if (selected && isel == maxsel - 1)
+ break;
+ }
+ }
+
+ if (selected || maxsel == 0)
+ break;
+
+ // finish the selection bar
+ if (!hideOpts && maxsel > 0)
+ {
+ int iw = 0;
+ for (iw = 0; iw + promptlen < t_columns-1; iw++)
+ outc(' ');
+ outs(ANSI_RESET ANSI_CLRTOEND);
+ }
+
+ // wait for input
+ if (optclk > 0)
+ {
+ // timed interaction
+
+ // disable optkeys to allow masked input
+ unsigned char *tmpopt = mfmovie.optkeys;
+ mfmovie.optkeys = NULL;
+
+ mf_float2tv(optclk, &tv);
+ c = pmore_wait_key(&tv, 1);
+ mfmovie.optkeys = tmpopt;
+
+ // if timeout, drop.
+ if (!c)
+ return 0;
+ } else {
+ // infinite wait
+ c = igetch();
+ }
+
+ // parse keyboard input
+ if (mf_movieIsSystemBreak(c))
+ {
+ // cannot be masked,
+ // also force stop of playback
+ STOP_MOVIE();
+ vmsg(PMORE_MSG_MOVIE_INTERACTION_STOPPED);
+ return 0;
+ }
+
+ // treat BS and DEL as same one
+ if (c == MOVIE_KEY_BS2)
+ c = '\b';
+
+ // standard navigation keys.
+ if (mf_movieMaskedInput(c))
+ continue;
+
+ // these keys can be masked
+ if (c == KEY_LEFT || c == KEY_UP)
+ {
+ if (isel > 0) isel --;
+ }
+ else if (c == KEY_RIGHT || c == KEY_TAB || c == KEY_DOWN)
+ {
+ if (isel < maxsel-1) isel ++;
+ }
+ else if (c == KEY_HOME)
+ {
+ isel = 0;
+ }
+ else if (c == KEY_END)
+ {
+ isel = maxsel -1;
+ }
} while ( !selected );
@@ -3458,7 +3458,7 @@ mf_movieOptionHandler(unsigned char *opt, unsigned char *end)
// Execute Selection
if (!cmd || !szCmd)
- return 0;
+ return 0;
return mf_movieExecuteOffsetCmd(cmd, cmd+szCmd);
}
@@ -3474,44 +3474,44 @@ int mf_movieSyncFrame()
{
if (mfmovie.pause)
{
- int c = 0;
- mfmovie.pause = 0;
- c = vmsg(PMORE_MSG_MOVIE_PAUSE);
- if (mf_movieIsSystemBreak(c))
- return 0;
- return 1;
+ int c = 0;
+ mfmovie.pause = 0;
+ c = vmsg(PMORE_MSG_MOVIE_PAUSE);
+ if (mf_movieIsSystemBreak(c))
+ return 0;
+ return 1;
}
else if (mfmovie.options)
{
- unsigned char *opt = mfmovie.options;
- mfmovie.options = NULL;
- mf_movieOptionHandler(opt, mf.end);
- return 1;
+ unsigned char *opt = mfmovie.options;
+ mfmovie.options = NULL;
+ mf_movieOptionHandler(opt, mf.end);
+ return 1;
}
else if (mfmovie.synctime.tv_sec > 0)
{
- /* synchronize world timeline model */
- struct timeval dv;
- gettimeofday(&dv, NULL);
- dv.tv_sec = mfmovie.synctime.tv_sec - dv.tv_sec;
- if(dv.tv_sec < 0)
- return 1;
- dv.tv_usec = mfmovie.synctime.tv_usec - dv.tv_usec;
- if(dv.tv_usec < 0) {
- dv.tv_sec --;
- dv.tv_usec += MOVIE_SECOND_U;
- }
- if(dv.tv_sec < 0)
- return 1;
-
- return !pmore_wait_key(&dv, 0);
+ /* synchronize world timeline model */
+ struct timeval dv;
+ gettimeofday(&dv, NULL);
+ dv.tv_sec = mfmovie.synctime.tv_sec - dv.tv_sec;
+ if(dv.tv_sec < 0)
+ return 1;
+ dv.tv_usec = mfmovie.synctime.tv_usec - dv.tv_usec;
+ if(dv.tv_usec < 0) {
+ dv.tv_sec --;
+ dv.tv_usec += MOVIE_SECOND_U;
+ }
+ if(dv.tv_sec < 0)
+ return 1;
+
+ return !pmore_wait_key(&dv, 0);
} else {
- /* synchronize each frame clock model */
- /* because Linux will change the timeval passed to select,
- * let's use a temp value here.
- */
- struct timeval dv = mfmovie.frameclk;
- return !pmore_wait_key(&dv, 0);
+ /* synchronize each frame clock model */
+ /* because Linux will change the timeval passed to select,
+ * let's use a temp value here.
+ */
+ struct timeval dv = mfmovie.frameclk;
+ return !pmore_wait_key(&dv, 0);
}
}
@@ -3524,146 +3524,146 @@ mf_movieProcessCommand(unsigned char *p, unsigned char *end)
{
for (; p < end && *p != '\n'; p++)
{
- if (*p == 'S') {
- // SYNCHRONIZATION
- gettimeofday(&mfmovie.synctime, NULL);
- // S can take other commands
- }
- else if (*p == 'E')
- {
- // END
- STOP_MOVIE();
- // MFDISP_SKIPCURLINE();
- MOVIECMD_SKIP_ALL(p,end);
- return p;
- }
- else if (*p == 'P')
- {
- // PAUSE
- mfmovie.pause = 1;
- // MFDISP_SKIPCURLINE();
- MOVIECMD_SKIP_ALL(p,end);
- return p;
+ if (*p == 'S') {
+ // SYNCHRONIZATION
+ gettimeofday(&mfmovie.synctime, NULL);
+ // S can take other commands
+ }
+ else if (*p == 'E')
+ {
+ // END
+ STOP_MOVIE();
+ // MFDISP_SKIPCURLINE();
+ MOVIECMD_SKIP_ALL(p,end);
+ return p;
+ }
+ else if (*p == 'P')
+ {
+ // PAUSE
+ mfmovie.pause = 1;
+ // MFDISP_SKIPCURLINE();
+ MOVIECMD_SKIP_ALL(p,end);
+ return p;
- }
- else if (*p == 'G')
- {
- // GOTO
- // Gt+-n,t+-n,t+-n (random select one)
- // jump +-n of type(l,p,f)
-
- // random select, if multiple
- unsigned char *pe = p;
- unsigned int igs = 0;
-
- for (pe = p ; pe < end && *pe &&
- *pe > ' ' && *pe < 0x80
- ; pe ++)
- if (*pe == ',') igs++;
-
- if (igs)
- {
- // make random
- igs = random() % (igs+1);
-
- for (pe = p ; igs > 0 && pe < end && *pe &&
- *pe > ' ' && *pe < 0x80
- ; pe ++)
- if (*pe == ',') igs--;
-
- if (pe != p)
- p = pe-1;
- }
-
- mf_movieExecuteOffsetCmd(p+1, end);
- MOVIECMD_SKIP_ALL(p,end);
- return p;
- }
- else if (*p == ':')
- {
- // NAMED
- // :name:
- // name allows alnum only
- p++;
- // TODO check isalnum p?
-
- // :name can accept trailing commands
- while (p < end && *p != '\n' && *p != ':')
- p++;
-
- if (*p == ':') p++;
-
- // continue will increase p
- p--;
- continue;
- }
- else if (*p == 'K')
- {
- // Reserve Key for interactive usage.
- // Currently only K#...# format is supported.
- if (p+2 < end && *(p+1) == '#')
- {
- p += 2;
- mfmovie.optkeys = p;
- mfmovie.interactive = 1;
-
- // K#..# can accept trailing commands
- while (p < end && *p != '\n' && *p != '#')
- p++;
-
- // if empty, set optkeys to NULL?
- if (mfmovie.optkeys == p)
- mfmovie.optkeys = NULL;
-
- if (*p == '#') p++;
-
- // continue will increase p
- p--;
- continue;
- }
- MOVIECMD_SKIP_ALL(p,end);
- return p;
- }
- else if (*p == '#')
- {
- // OPTIONS
- // #key1,frame1,text1#key2,frame2,text2#
- mfmovie.options = p+1;
- mfmovie.interactive = 1;
- // MFDISP_SKIPCURLINE();
- MOVIECMD_SKIP_ALL(p,end);
- return p;
- }
- else if (*p == 'O')
- {
- // OLD compatible mode
- // = -> compat24
- // - -> ?
- // == -> ?
- p++;
- if (p >= end)
- return end;
- if (*p == '=')
- {
- mfmovie.mode = MFDISP_MOVIE_PLAYING_OLD;
- mfmovie.compat24 = 1;
- p++;
- }
- // MFDISP_SKIPCURLINE();
- return p+1;
- }
- else if (*p == 'L')
- {
- // LOOP
- // Lm,n
- // m times to backward n
- break;
- }
- else
- {
- // end of known control codes
- break;
- }
+ }
+ else if (*p == 'G')
+ {
+ // GOTO
+ // Gt+-n,t+-n,t+-n (random select one)
+ // jump +-n of type(l,p,f)
+
+ // random select, if multiple
+ unsigned char *pe = p;
+ unsigned int igs = 0;
+
+ for (pe = p ; pe < end && *pe &&
+ *pe > ' ' && *pe < 0x80
+ ; pe ++)
+ if (*pe == ',') igs++;
+
+ if (igs)
+ {
+ // make random
+ igs = random() % (igs+1);
+
+ for (pe = p ; igs > 0 && pe < end && *pe &&
+ *pe > ' ' && *pe < 0x80
+ ; pe ++)
+ if (*pe == ',') igs--;
+
+ if (pe != p)
+ p = pe-1;
+ }
+
+ mf_movieExecuteOffsetCmd(p+1, end);
+ MOVIECMD_SKIP_ALL(p,end);
+ return p;
+ }
+ else if (*p == ':')
+ {
+ // NAMED
+ // :name:
+ // name allows alnum only
+ p++;
+ // TODO check isalnum p?
+
+ // :name can accept trailing commands
+ while (p < end && *p != '\n' && *p != ':')
+ p++;
+
+ if (*p == ':') p++;
+
+ // continue will increase p
+ p--;
+ continue;
+ }
+ else if (*p == 'K')
+ {
+ // Reserve Key for interactive usage.
+ // Currently only K#...# format is supported.
+ if (p+2 < end && *(p+1) == '#')
+ {
+ p += 2;
+ mfmovie.optkeys = p;
+ mfmovie.interactive = 1;
+
+ // K#..# can accept trailing commands
+ while (p < end && *p != '\n' && *p != '#')
+ p++;
+
+ // if empty, set optkeys to NULL?
+ if (mfmovie.optkeys == p)
+ mfmovie.optkeys = NULL;
+
+ if (*p == '#') p++;
+
+ // continue will increase p
+ p--;
+ continue;
+ }
+ MOVIECMD_SKIP_ALL(p,end);
+ return p;
+ }
+ else if (*p == '#')
+ {
+ // OPTIONS
+ // #key1,frame1,text1#key2,frame2,text2#
+ mfmovie.options = p+1;
+ mfmovie.interactive = 1;
+ // MFDISP_SKIPCURLINE();
+ MOVIECMD_SKIP_ALL(p,end);
+ return p;
+ }
+ else if (*p == 'O')
+ {
+ // OLD compatible mode
+ // = -> compat24
+ // - -> ?
+ // == -> ?
+ p++;
+ if (p >= end)
+ return end;
+ if (*p == '=')
+ {
+ mfmovie.mode = MFDISP_MOVIE_PLAYING_OLD;
+ mfmovie.compat24 = 1;
+ p++;
+ }
+ // MFDISP_SKIPCURLINE();
+ return p+1;
+ }
+ else if (*p == 'L')
+ {
+ // LOOP
+ // Lm,n
+ // m times to backward n
+ break;
+ }
+ else
+ {
+ // end of known control codes
+ break;
+ }
}
return p;
}
@@ -3673,60 +3673,60 @@ mf_movieNextFrame()
{
while (1)
{
- unsigned char *p = mf_movieFrameHeader(mf.disps, mf.end);
-
- if(p)
- {
- float nf = 0;
- unsigned char *odisps = mf.disps;
-
- /* process leading */
- p = mf_movieProcessCommand(p, mf.end);
-
- // disps may change after commands
- if (mf.disps != odisps)
- {
- // commands changing location must
- // support at least one frame pause
- // to allow user break
- struct timeval tv;
- mf_float2tv(MOVIE_MIN_FRAMECLK, &tv);
-
- if (pmore_wait_key(&tv, 0))
- {
- STOP_MOVIE();
- return 0;
- }
- continue;
- }
-
- /* process time */
- if (mf_str2float(p, mf.end, &nf))
- {
- mf_float2tv(nf, &mfmovie.frameclk);
- }
-
- if(mfmovie.synctime.tv_sec > 0)
- {
- mfmovie.synctime.tv_usec += mfmovie.frameclk.tv_usec;
- mfmovie.synctime.tv_sec += mfmovie.frameclk.tv_sec;
- mfmovie.synctime.tv_sec += mfmovie.synctime.tv_usec / MOVIE_SECOND_U;
- mfmovie.synctime.tv_usec %= MOVIE_SECOND_U;
- }
-
- if (mfmovie.mode != MFDISP_MOVIE_PLAYING_OLD)
- mf_forward(1);
-
- return 1;
- }
-
- if (mf_forward(1) <= 0)
- break;
+ unsigned char *p = mf_movieFrameHeader(mf.disps, mf.end);
+
+ if(p)
+ {
+ float nf = 0;
+ unsigned char *odisps = mf.disps;
+
+ /* process leading */
+ p = mf_movieProcessCommand(p, mf.end);
+
+ // disps may change after commands
+ if (mf.disps != odisps)
+ {
+ // commands changing location must
+ // support at least one frame pause
+ // to allow user break
+ struct timeval tv;
+ mf_float2tv(MOVIE_MIN_FRAMECLK, &tv);
+
+ if (pmore_wait_key(&tv, 0))
+ {
+ STOP_MOVIE();
+ return 0;
+ }
+ continue;
+ }
+
+ /* process time */
+ if (mf_str2float(p, mf.end, &nf))
+ {
+ mf_float2tv(nf, &mfmovie.frameclk);
+ }
+
+ if(mfmovie.synctime.tv_sec > 0)
+ {
+ mfmovie.synctime.tv_usec += mfmovie.frameclk.tv_usec;
+ mfmovie.synctime.tv_sec += mfmovie.frameclk.tv_sec;
+ mfmovie.synctime.tv_sec += mfmovie.synctime.tv_usec / MOVIE_SECOND_U;
+ mfmovie.synctime.tv_usec %= MOVIE_SECOND_U;
+ }
+
+ if (mfmovie.mode != MFDISP_MOVIE_PLAYING_OLD)
+ mf_forward(1);
+
+ return 1;
+ }
+
+ if (mf_forward(1) <= 0)
+ break;
}
return 0;
}
#endif
-/* vim:sw=4:ts=8:nofoldenable
+/* vim:sw=4:ts=8:expandtab:nofoldenable
*/