From 471ecff26702855af23d5fb468869e9a642e10da Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Sun, 16 Feb 2025 20:30:16 -0500 Subject: [PATCH] Report both starting and ending lines for commands spanning multiple lines because of \-line continuation. This affects error and warning messages primarily. The JSON interchange format has an additional lineno_start entry for reminders that span multiple lines. (Historically, lineno was the *last* line of the reminder statement and I kept that for compatibility.) --- man/rem2ps.1.in | 7 +++ src/calendar.c | 5 ++ src/dorem.c | 8 ++-- src/dosubst.c | 4 +- src/expr.c | 2 +- src/files.c | 14 ++++++ src/globals.h | 3 +- src/main.c | 25 ++++++++-- src/protos.h | 3 +- src/queue.c | 5 ++ src/trigger.c | 20 ++++---- src/types.h | 1 + src/userfns.c | 5 +- src/utils.c | 18 +++++++- tests/test-rem | 8 ++-- tests/test.cmp | 120 ++++++++++++++++++++++++------------------------ 16 files changed, 157 insertions(+), 91 deletions(-) diff --git a/man/rem2ps.1.in b/man/rem2ps.1.in index c61cf65e..8b0f25a2 100644 --- a/man/rem2ps.1.in +++ b/man/rem2ps.1.in @@ -492,6 +492,13 @@ The filename in which the reminder was found. .B lineno \fIn\fR The line number within the file on which the reminder was found. .TP +.B lineno_start \fIn\fR +If a reminder spans multiple lines because of backslash +line-continuation, then the \fBlineno\fR entry is the \fIlast\fR line +of the reminder; the \fBlineno_start\fR entry is the \fIfirst\fR line. If +a reminder does \fInot\fR span multiple lines, then only the \fBlineno\fR +entry is present; the \fBlineno_start\fR entry is absent in that case. +.TP .B nonconst_expr 1 If the reminder contained a non-constant expression that had to be evaluated to determine the trigger date, this key will be present with the value 1. diff --git a/src/calendar.c b/src/calendar.c index cbe04ad0..bc3b698d 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -57,6 +57,7 @@ typedef struct cal_entry { int duration; char *filename; int lineno; + int lineno_start; Trigger trig; TimeTrig tt; int nonconst_expr; @@ -2327,6 +2328,7 @@ static int DoCalRem(ParsePtr p, int col) return E_NO_MEM; } e->lineno = LineNo; + e->lineno_start = LineNoStart; if (trig.typ == PASSTHRU_TYPE || is_color) { StrnCpy(e->passthru, trig.passthru, PASSTHRU_LEN); @@ -2528,6 +2530,9 @@ static void WriteSimpleEntryProtocol2(CalEntry *e, int today) if (DoPrefixLineNo) { PrintJSONKeyPairString("filename", e->filename); PrintJSONKeyPairInt("lineno", e->lineno); + if (e->lineno != e->lineno_start) { + PrintJSONKeyPairInt("lineno_start", e->lineno_start); + } } PrintJSONKeyPairString("passthru", e->passthru); PrintJSONKeyPairString("tags", DBufValue(&(e->tags))); diff --git a/src/dorem.c b/src/dorem.c index c855f732..a56aa5f1 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -72,13 +72,13 @@ check_trigger_function(char const *fname, char const *type) return; } if (f->nargs != 1) { - Wprint(tr("%s function `%s' defined at %s:%d should take 1 argument but actually takes %d"), type, fname, f->filename, f->lineno, f->nargs); + Wprint(tr("%s function `%s' defined at %s(%s) should take 1 argument but actually takes %d"), type, fname, f->filename, line_range(f->lineno_start, f->lineno), f->nargs); return; } if (ensure_expr_references_first_local_arg(f->node)) { return; } - Wprint(tr("%s function `%s' defined at %s:%d does not use its argument"), type, fname, f->filename, f->lineno); + Wprint(tr("%s function `%s' defined at %s(%s) does not use its argument"), type, fname, f->filename, line_range(f->lineno_start, f->lineno)); } static void @@ -1558,8 +1558,8 @@ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p) if (DebugFlag & DB_PRTTRIG) { int y, m, d; FromDSE(LastTriggerDate, &y, &m, &d); - fprintf(ErrFp, "%s(%d): Trig(satisfied) = %s, %d %s, %d", - FileName, LineNo, + fprintf(ErrFp, "%s(%s): Trig(satisfied) = %s, %d %s, %d", + FileName, line_range(LineNoStart, LineNo), get_day_name(LastTriggerDate % 7), d, get_month_name(m), diff --git a/src/dosubst.c b/src/dosubst.c index 0691c1ea..a185ac36 100644 --- a/src/dosubst.c +++ b/src/dosubst.c @@ -40,8 +40,8 @@ check_subst_args(UserFunc *f, int n) if (f->nargs == n) { return 1; } - Wprint(tr("Function `%s' defined at %s:%d should take %d argument%s, but actually takes %d"), - f->name, f->filename, f->lineno, n, (n == 1 ? "" : "s"), f->nargs); + Wprint(tr("Function `%s' defined at %s(%s) should take %d argument%s, but actually takes %d"), + f->name, f->filename, line_range(f->lineno_start, f->lineno), n, (n == 1 ? "" : "s"), f->nargs); return 0; } /***************************************************************/ diff --git a/src/expr.c b/src/expr.c index 8dc351e1..cc1473e2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -723,7 +723,7 @@ eval_userfunc(expr_node *node, Value *locals, Value *ans, int *nonconst) FuncRecursionLevel++; /* Add a call to the call stack for better error messages */ - pushed = push_call(f->filename, f->name, f->lineno); + pushed = push_call(f->filename, f->name, f->lineno, f->lineno_start); DBG(debug_enter_userfunc(node, new_locals, f->nargs)); diff --git a/src/files.c b/src/files.c index ff398e07..e01e20ef 100644 --- a/src/files.c +++ b/src/files.c @@ -50,6 +50,7 @@ typedef struct cache { struct cache *next; char const *text; int LineNo; + int LineNoStart; } CachedLine; typedef struct cheader { @@ -77,6 +78,7 @@ typedef struct { char const *filename; FilenameChain *chain; int LineNo; + int LineNoStart; unsigned int IfFlags; int NumIfs; int IfLinenos[IF_NEST]; @@ -189,6 +191,7 @@ int ReadLine(void) if (CLine) { CurLine = CLine->text; LineNo = CLine->LineNo; + LineNoStart = CLine->LineNoStart; CLine = CLine->next; got_a_fresh_line(); clear_callstack(); @@ -218,6 +221,7 @@ static int ReadLineFromFile(int use_pclose) DBufInit(&buf); DBufFree(&LineBuffer); + LineNoStart = LineNo+1; while(fp) { if (DBufGets(&buf, fp) != OK) { DBufFree(&LineBuffer); @@ -332,6 +336,7 @@ int OpenFile(char const *fname) CLine = h->cache; STRSET(FileName, fname); LineNo = 0; + LineNoStart = 0; if (!h->ownedByMe) { RunDisabled |= RUN_NOTOWNER; } else { @@ -367,6 +372,7 @@ int OpenFile(char const *fname) CLine = NULL; if (ShouldCache) { LineNo = 0; + LineNoStart = 0; r = CacheFile(fname, 0); if (r == OK) { fp = NULL; @@ -385,6 +391,7 @@ int OpenFile(char const *fname) } STRSET(FileName, fname); LineNo = 0; + LineNoStart = 0; if (FileName) return OK; else return E_NO_MEM; } @@ -487,6 +494,7 @@ static int CacheFile(char const *fname, int use_pclose) } cl->next = NULL; cl->LineNo = LineNo; + cl->LineNoStart = LineNoStart; cl->text = StrDup(s); DBufFree(&LineBuffer); if (!cl->text) { @@ -565,6 +573,7 @@ static int PopFile(void) IStackPtr--; LineNo = i->LineNo; + LineNoStart = i->LineNoStart; IfFlags = i->IfFlags; memcpy(IfLinenos, i->IfLinenos, IF_NEST); NumIfs = i->NumIfs; @@ -906,6 +915,7 @@ static int IncludeCmd(char const *cmd) } i->ownedByMe = 1; i->LineNo = LineNo; + i->LineNoStart = LineNo; i->NumIfs = NumIfs; i->IfFlags = IfFlags; memcpy(i->IfLinenos, IfLinenos, IF_NEST); @@ -932,6 +942,7 @@ static int IncludeCmd(char const *cmd) STRSET(FileName, fname); DBufFree(&buf); LineNo = 0; + LineNoStart = 0; if (!h->ownedByMe) { RunDisabled |= RUN_NOTOWNER; } else { @@ -963,6 +974,7 @@ static int IncludeCmd(char const *cmd) } fp = fp2; LineNo = 0; + LineNoStart = 0; /* Temporarily turn of file tracing */ old_flag = DebugFlag; @@ -978,6 +990,7 @@ static int IncludeCmd(char const *cmd) fp = NULL; CLine = CachedFiles->cache; LineNo = 0; + LineNoStart = 0; STRSET(FileName, fname); DBufFree(&buf); return OK; @@ -1014,6 +1027,7 @@ int IncludeFile(char const *fname) i->filename = NULL; } i->LineNo = LineNo; + i->LineNoStart = LineNoStart; i->NumIfs = NumIfs; i->IfFlags = IfFlags; memcpy(i->IfLinenos, IfLinenos, IF_NEST); diff --git a/src/globals.h b/src/globals.h index 898f1fcb..88ebcf78 100644 --- a/src/globals.h +++ b/src/globals.h @@ -47,6 +47,7 @@ EXTERN int CurDay; EXTERN int CurMon; EXTERN int CurYear; EXTERN int LineNo; +EXTERN int LineNoStart; EXTERN int FreshLine; EXTERN int WarnedAboutImplicit; EXTERN uid_t TrustedUsers[MAX_TRUSTED_USERS]; @@ -119,7 +120,7 @@ EXTERN INIT( int PurgeIncludeDepth, 0); EXTERN INIT( FILE *PurgeFP, NULL); EXTERN INIT( int NumIfs, 0); EXTERN INIT( unsigned int IfFlags, 0); -EXTERN INIT( int IfLinenos[IF_NEST], {0}); +EXTERN INIT( int IfLinenos[IF_NEST], {0}); EXTERN INIT( int LastTrigValid, 0); EXTERN Trigger LastTrigger; EXTERN TimeTrig LastTimeTrig; diff --git a/src/main.c b/src/main.c index c2f0aed4..7f1c8801 100644 --- a/src/main.c +++ b/src/main.c @@ -897,11 +897,21 @@ void Wprint(char const *fmt, ...) va_list argptr; + /* We can't use line_range because caller might have used it */ if (FileName) { - if (strcmp(FileName, "-")) - (void) fprintf(ErrFp, "%s(%d): ", FileName, LineNo); - else - (void) fprintf(ErrFp, "-stdin-(%d): ", LineNo); + if (strcmp(FileName, "-")) { + if (LineNoStart == LineNo) { + (void) fprintf(ErrFp, "%s(%d): ", FileName, LineNo); + } else { + (void) fprintf(ErrFp, "%s(%d:%d): ", FileName, LineNoStart, LineNo); + } + } else { + if (LineNoStart == LineNo) { + (void) fprintf(ErrFp, "-stdin-(%d): ", LineNo); + } else { + (void) fprintf(ErrFp, "-stdin-(%d:%d): ", LineNoStart, LineNo); + } + } } va_start(argptr, fmt); @@ -933,7 +943,12 @@ void Eprint(char const *fmt, ...) fname = "-stdin-"; } if (FreshLine) { - (void) fprintf(ErrFp, "%s(%d): ", fname, LineNo); + /* We can't use line_range because caller might have used it */ + if (LineNo == LineNoStart) { + (void) fprintf(ErrFp, "%s(%d): ", fname, LineNo); + } else { + (void) fprintf(ErrFp, "%s(%d:%d): ", fname, LineNoStart, LineNo); + } } else { fprintf(ErrFp, " "); } diff --git a/src/protos.h b/src/protos.h index b550e106..d65777f9 100644 --- a/src/protos.h +++ b/src/protos.h @@ -226,7 +226,7 @@ char const *get_day_name(int wkday); char const *get_month_name(int mon); void set_cloexec(FILE *fp); -int push_call(char const *filename, char const *func, int lineno); +int push_call(char const *filename, char const *func, int lineno, int lineno_start); void clear_callstack(void); int print_callstack(FILE *fp); void pop_call(void); @@ -284,3 +284,4 @@ int TrigInfoHeadersAreTheSame(char const *i1, char const *i2); int TrigInfoIsValid(char const *info); char const *FindTrigInfo(Trigger *t, char const *header); void WriteJSONInfoChain(TrigInfo *ti); +char const *line_range(int lineno_start, int lineno); diff --git a/src/queue.c b/src/queue.c index 0d044c53..d920093f 100644 --- a/src/queue.c +++ b/src/queue.c @@ -61,6 +61,7 @@ typedef struct queuedrem { char const *text; char const *fname; int lineno; + int lineno_start; char passthru[PASSTHRU_LEN+1]; char sched[VAR_NAME_LEN+1]; Trigger t; @@ -224,6 +225,7 @@ int QueueReminder(ParsePtr p, Trigger *trig, } qelem->lineno = LineNo; + qelem->lineno_start = LineNoStart; NumQueued++; qelem->typ = trig->typ; strcpy(qelem->passthru, trig->passthru); @@ -784,6 +786,9 @@ json_queue(QueuedRem const *q) PrintJSONKeyPairInt("ntrig", q->ntrig); PrintJSONKeyPairString("filename", q->fname); PrintJSONKeyPairInt("lineno", q->lineno); + if (q->lineno_start != q->lineno) { + PrintJSONKeyPairInt("lineno_start", q->lineno_start); + } switch(q->typ) { case NO_TYPE: PrintJSONKeyPairString("type", "NO_TYPE"); break; case MSG_TYPE: PrintJSONKeyPairString("type", "MSG_TYPE"); break; diff --git a/src/trigger.c b/src/trigger.c index e7a9e4d4..7d2c5f7f 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -452,8 +452,8 @@ AdjustTriggerForDuration(int today, int r, Trigger *trig, TimeTrig *tim, int sav r = today; if (DebugFlag & DB_PRTTRIG) { FromDSE(r, &y, &m, &d); - fprintf(ErrFp, "%s(%d): Trig(adj) = %s, %d %s, %d", - FileName, LineNo, + fprintf(ErrFp, "%s(%s): Trig(adj) = %s, %d %s, %d", + FileName, line_range(LineNoStart, LineNo), get_day_name(r % 7), d, get_month_name(m), @@ -580,8 +580,8 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim, if (result == -1) { trig->expired = 1; if (DebugFlag & DB_PRTTRIG) { - fprintf(ErrFp, "%s(%d): %s\n", - FileName, LineNo, GetErr(E_EXPIRED)); + fprintf(ErrFp, "%s(%s): %s\n", + FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED)); } return -1; } @@ -603,8 +603,8 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim, } if (DebugFlag & DB_PRTTRIG) { FromDSE(result, &y, &m, &d); - fprintf(ErrFp, "%s(%d): Trig = %s, %d %s, %d", - FileName, LineNo, + fprintf(ErrFp, "%s(%s): Trig = %s, %d %s, %d", + FileName, line_range(LineNoStart, LineNo), get_day_name(result % 7), d, get_month_name(m), @@ -630,8 +630,8 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim, trig->rep == NO_REP) { trig->expired = 1; if (DebugFlag & DB_PRTTRIG) { - fprintf(ErrFp, "%s(%d): %s\n", - FileName, LineNo, GetErr(E_EXPIRED)); + fprintf(ErrFp, "%s(%s): %s\n", + FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED)); } if (save_in_globals) { LastTriggerDate = result; @@ -655,8 +655,8 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim, } trig->expired = 1; if (DebugFlag & DB_PRTTRIG) { - fprintf(ErrFp, "%s(%d): %s\n", - FileName, LineNo, GetErr(E_EXPIRED)); + fprintf(ErrFp, "%s(%s): %s\n", + FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED)); } return -1; } diff --git a/src/types.h b/src/types.h index 08699166..39aad620 100644 --- a/src/types.h +++ b/src/types.h @@ -308,5 +308,6 @@ typedef struct udf_struct { int nargs; char const *filename; int lineno; + int lineno_start; int recurse_flag; } UserFunc; diff --git a/src/userfns.c b/src/userfns.c index 65166b4b..325fb8f4 100644 --- a/src/userfns.c +++ b/src/userfns.c @@ -208,8 +208,8 @@ int DoFset(ParsePtr p) return OK; } /* Warn about redefinition */ - Wprint(tr("Function `%s' redefined (previously defined at %s:%d)"), - existing->name, existing->filename, existing->lineno); + Wprint(tr("Function `%s' redefined: previously defined at %s(%s)"), + existing->name, existing->filename, line_range(existing->lineno_start, existing->lineno)); } /* Should be followed by '(' */ @@ -238,6 +238,7 @@ int DoFset(ParsePtr p) return E_NO_MEM; } func->lineno = LineNo; + func->lineno_start = LineNoStart; func->recurse_flag = 0; StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN); DBufFree(&buf); diff --git a/src/utils.c b/src/utils.c index bdb4e407..0c8d9512 100644 --- a/src/utils.c +++ b/src/utils.c @@ -192,6 +192,7 @@ typedef struct cs_s { char const *filename; char const *func; int lineno; + int lineno_start; } cs; static cs *callstack = NULL; @@ -206,7 +207,7 @@ destroy_cs(cs *entry) int -push_call(char const *filename, char const *func, int lineno) +push_call(char const *filename, char const *func, int lineno, int lineno_start) { cs *entry; if (freecs) { @@ -222,6 +223,7 @@ push_call(char const *filename, char const *func, int lineno) entry->filename = filename; entry->func = func; entry->lineno = lineno; + entry->lineno_start = lineno_start; entry->next = callstack; callstack = entry; return OK; @@ -255,7 +257,7 @@ print_callstack_aux(FILE *fp, cs *entry) fprintf(fp, "\n"); } fprintf(fp, " "); - fprintf(fp, tr("%s(%d): [#%d] %s function `%s'"), entry->filename, entry->lineno, i, in, entry->func); + fprintf(fp, tr("%s(%s): [#%d] %s function `%s'"), entry->filename, line_range(entry->lineno_start, entry->lineno), i, in, entry->func); } prev = entry; entry = entry->next; @@ -289,3 +291,15 @@ pop_call(void) destroy_cs(entry); } } + +char const * +line_range(int lineno_start, int lineno) +{ + static char buf[128]; + if (lineno_start == lineno) { + snprintf(buf, sizeof(buf), "%d", lineno); + } else { + snprintf(buf, sizeof(buf), "%d:%d", lineno_start, lineno); + } + return buf; +} diff --git a/tests/test-rem b/tests/test-rem index fefde67e..5b154ef3 100644 --- a/tests/test-rem +++ b/tests/test-rem @@ -181,11 +181,13 @@ EOF ../src/remind -pppq - 1 Jan 2012 9:00 <<'EOF' >> ../tests/test.out 2>&1 REM 2 MSG Normal SET $DefaultColor "255 0 0" -REM 3 MSG %"Red%" on the calendar! +REM 3 \ + MSG %"Red%" on the calendar! SET $DefaultColor "-1 -1 -1" REM 4 MSG Normal -# Should give an error -SET $DefaultColor "256 0 0" +# Should give an error - split on two lines to test line number reporting +SET $DefaultColor \ + "256 0 0" EOF # Test default color with weekly calendar diff --git a/tests/test.cmp b/tests/test.cmp index 8b0e00e2..4d61b230 100644 --- a/tests/test.cmp +++ b/tests/test.cmp @@ -801,12 +801,12 @@ Leaving UserFN _ofunc(1991-02-28) => 0 # omitfunc ignores local/global omits fset _ofunc(x) 0 -../tests/test.rem(227): Function `_ofunc' redefined (previously defined at ../tests/test.rem:222) +../tests/test.rem(227): Function `_ofunc' redefined: previously defined at ../tests/test.rem(222) OMIT 1 March OMIT 2 March 1991 REM 1 March OMIT Sun OMITFUNC _ofunc AFTER MSG Should trigger 1 March ../tests/test.rem(230): Warning: OMIT is ignored if you use OMITFUNC -../tests/test.rem(230): OMITFUNC function `_ofunc' defined at ../tests/test.rem:227 does not use its argument +../tests/test.rem(230): OMITFUNC function `_ofunc' defined at ../tests/test.rem(227) does not use its argument Entering UserFN _ofunc(1991-02-15) Leaving UserFN _ofunc(1991-02-15) => 0 Entering UserFN _ofunc(1991-03-01) @@ -4004,7 +4004,7 @@ psmoon(0) => ../tests/test.rem(813): psmoon() is deprecated; use SPECIAL MOON in FSET _f(x) 0 SET tmp evaltrig("Wed SKIP OMITFUNC _f",date(1992,1,8)) date(1992, 1, 8) => 1992-01-08 -evaltrig("Wed SKIP OMITFUNC _f", 1992-01-08) => ../tests/test.rem(817): OMITFUNC function `_f' defined at ../tests/test.rem:816 does not use its argument +evaltrig("Wed SKIP OMITFUNC _f", 1992-01-08) => ../tests/test.rem(817): OMITFUNC function `_f' defined at ../tests/test.rem(816) does not use its argument Entering UserFN _f(1992-01-08) Leaving UserFN _f(1992-01-08) => 0 ../tests/test.rem(817): Trig = Wednesday, 8 January, 1992 @@ -4050,7 +4050,7 @@ ENDIF # Trig with a good warnfunc FSET w(x) choose(x, 5, 3, 1, 0) -../tests/test.rem(832): Function `w' redefined (previously defined at ../tests/test.rem:826) +../tests/test.rem(832): Function `w' redefined: previously defined at ../tests/test.rem(826) # Short-circuit operators IF trig("sun warn w") || trig("thu warn w") @@ -4998,7 +4998,7 @@ Undefined: FSET subst_bad() "foo" REM MSG %{bad} ../tests/test.rem(933): Trig = Saturday, 16 February, 1991 -../tests/test.rem(933): Function `subst_bad' defined at ../tests/test.rem:932 should take 3 arguments, but actually takes 0 +../tests/test.rem(933): Function `subst_bad' defined at ../tests/test.rem(932) should take 3 arguments, but actually takes 0 @@ -5006,8 +5006,8 @@ FSET subst_ampm(a, b, c, d, e, f, g) "wookie" REM AT 11:00 MSG %2 ../tests/test.rem(937): Trig = Saturday, 16 February, 1991 AT 11:00 -../tests/test.rem(937): Function `subst_ampm' defined at ../tests/test.rem:935 should take 1 argument, but actually takes 7 -../tests/test.rem(937): Function `subst_ampm' defined at ../tests/test.rem:935 should take 1 argument, but actually takes 7 +../tests/test.rem(937): Function `subst_ampm' defined at ../tests/test.rem(935) should take 1 argument, but actually takes 7 +../tests/test.rem(937): Function `subst_ampm' defined at ../tests/test.rem(935) should take 1 argument, but actually takes 7 at 11:00am FUNSET subst_ampm @@ -5182,7 +5182,7 @@ FSET f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a1 # This should give an error FSET f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, a62, a63, a64) 3 -../tests/test.rem(1023): Function `f' redefined (previously defined at ../tests/test.rem:1020) +../tests/test.rem(1023): Function `f' redefined: previously defined at ../tests/test.rem(1020) ../tests/test.rem(1023): Too many arguments # Check that SATISFY expressions that don't reference trigdate are diagnosed @@ -5647,63 +5647,63 @@ max(3, 3, 4, 5, 6) => 6 FSET gg(x) 0 REM WARN gg MSG Wookie -../tests/test.rem(1054): WARN function `gg' defined at ../tests/test.rem:1053 does not use its argument +../tests/test.rem(1054): WARN function `gg' defined at ../tests/test.rem(1053) does not use its argument ../tests/test.rem(1054): Trig = Saturday, 16 February, 1991 Entering UserFN gg(1) Leaving UserFN gg(1) => 0 Wookie REM AT 11:00 SCHED gg MSG blork -../tests/test.rem(1055): SCHED function `gg' defined at ../tests/test.rem:1053 does not use its argument +../tests/test.rem(1055): SCHED function `gg' defined at ../tests/test.rem(1053) does not use its argument ../tests/test.rem(1055): Trig = Saturday, 16 February, 1991 AT 11:00 blork REM OMITFUNC gg MSG hehe -../tests/test.rem(1056): OMITFUNC function `gg' defined at ../tests/test.rem:1053 does not use its argument +../tests/test.rem(1056): OMITFUNC function `gg' defined at ../tests/test.rem(1053) does not use its argument ../tests/test.rem(1056): Trig = Saturday, 16 February, 1991 hehe FSET gg(x,y,z) 0 -../tests/test.rem(1058): Function `gg' redefined (previously defined at ../tests/test.rem:1053) +../tests/test.rem(1058): Function `gg' redefined: previously defined at ../tests/test.rem(1053) REM WARN gg MSG Wookie -../tests/test.rem(1059): WARN function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 3 +../tests/test.rem(1059): WARN function `gg' defined at ../tests/test.rem(1058) should take 1 argument but actually takes 3 ../tests/test.rem(1059): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1059): Undefined WARN function: `gg' Wookie REM AT 11:00 SCHED gg MSG blork -../tests/test.rem(1060): SCHED function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 3 +../tests/test.rem(1060): SCHED function `gg' defined at ../tests/test.rem(1058) should take 1 argument but actually takes 3 ../tests/test.rem(1060): Trig = Saturday, 16 February, 1991 AT 11:00 blork REM OMITFUNC gg MSG hehe -../tests/test.rem(1061): OMITFUNC function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 3 +../tests/test.rem(1061): OMITFUNC function `gg' defined at ../tests/test.rem(1058) should take 1 argument but actually takes 3 ../tests/test.rem(1061): Trig = Saturday, 16 February, 1991 hehe FSET gg() 0 -../tests/test.rem(1063): Function `gg' redefined (previously defined at ../tests/test.rem:1058) +../tests/test.rem(1063): Function `gg' redefined: previously defined at ../tests/test.rem(1058) REM WARN gg MSG Wookie -../tests/test.rem(1064): WARN function `gg' defined at ../tests/test.rem:1063 should take 1 argument but actually takes 0 +../tests/test.rem(1064): WARN function `gg' defined at ../tests/test.rem(1063) should take 1 argument but actually takes 0 ../tests/test.rem(1064): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1064): Undefined WARN function: `gg' Wookie REM AT 11:00 SCHED gg MSG blork -../tests/test.rem(1065): SCHED function `gg' defined at ../tests/test.rem:1063 should take 1 argument but actually takes 0 +../tests/test.rem(1065): SCHED function `gg' defined at ../tests/test.rem(1063) should take 1 argument but actually takes 0 ../tests/test.rem(1065): Trig = Saturday, 16 February, 1991 AT 11:00 blork REM OMITFUNC gg MSG hehe -../tests/test.rem(1066): OMITFUNC function `gg' defined at ../tests/test.rem:1063 should take 1 argument but actually takes 0 +../tests/test.rem(1066): OMITFUNC function `gg' defined at ../tests/test.rem(1063) should take 1 argument but actually takes 0 ../tests/test.rem(1066): Trig = Saturday, 16 February, 1991 hehe FSET gg(x) x-x -../tests/test.rem(1068): Function `gg' redefined (previously defined at ../tests/test.rem:1063) +../tests/test.rem(1068): Function `gg' redefined: previously defined at ../tests/test.rem(1063) REM WARN gg MSG Wookie ../tests/test.rem(1069): Trig = Saturday, 16 February, 1991 Entering UserFN gg(1) @@ -5973,7 +5973,7 @@ Hello On the next line FSET msgsuffix(x) char(8) + " on the same line" -../tests/test.rem(1184): Function `msgsuffix' redefined (previously defined at ../tests/test.rem:1181) +../tests/test.rem(1184): Function `msgsuffix' redefined: previously defined at ../tests/test.rem(1181) REM MSG Hello ../tests/test.rem(1185): Trig = Saturday, 16 February, 1991 Entering UserFN msgsuffix(5000) @@ -22389,44 +22389,44 @@ February 29 {"date":"2012-01-23","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"} {"date":"2012-01-30","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"} # rem2ps2 end --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high --stdin-(7): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high +-stdin-(8:9): Number too high [ { "translations":{"LANGID":"en"},"caltype":"monthly","monthname":"January","year":2012,"daysinmonth":31,"firstwkday":0,"mondayfirst":0,"daynames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"prevmonthname":"December","daysinprevmonth":31,"prevmonthyear":2011,"nextmonthname":"February","daysinnextmonth":29,"nextmonthyear":2012,"entries":[ {"date":"2012-01-02","filename":"-","lineno":1,"d":2,"priority":5000,"body":"Normal"}, -{"date":"2012-01-03","filename":"-","lineno":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"%\"Red%\" on the calendar!","calendar_body":"Red","plain_body":"Red on the calendar!","body":"255 0 0 %\"Red%\" on the calendar!"}, -{"date":"2012-01-04","filename":"-","lineno":5,"d":4,"priority":5000,"body":"Normal"} +{"date":"2012-01-03","filename":"-","lineno":4,"lineno_start":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"%\"Red%\" on the calendar!","calendar_body":"Red","plain_body":"Red on the calendar!","body":"255 0 0 %\"Red%\" on the calendar!"}, +{"date":"2012-01-04","filename":"-","lineno":6,"d":4,"priority":5000,"body":"Normal"} ] } ] @@ -24491,11 +24491,11 @@ TRANSLATE "Expression evaluation is disabled" "" TRANSLATE "Time limit for expression evaluation exceeded" "" # Other Messages -TRANSLATE "%s function `%s' defined at %s:%d does not use its argument" "" -TRANSLATE "%s function `%s' defined at %s:%d should take 1 argument but actually takes %d" "" +TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" "" +TRANSLATE "%s function `%s' defined at %s(%s) should take 1 argument but actually takes %d" "" TRANSLATE "%s is deprecated; use %s instead" "" TRANSLATE "%s(%d): IF without ENDIF" "" -TRANSLATE "%s(%d): ["["]#%d] %s function `%s'" "" +TRANSLATE "%s(%s): ["["]#%d] %s function `%s'" "" TRANSLATE "(Security note: $RunOff variable tested.)" "" TRANSLATE "Accepting \"%s\" for $Latitude/$Longitude, but you should use the \"C\" locale decimal separator \".\" instead" "" TRANSLATE "Caching directory `%s' listing" "" @@ -24509,8 +24509,8 @@ TRANSLATE "Duplicate INFO headers are not permitted" "" TRANSLATE "Error: THROUGH date earlier than start date" "" TRANSLATE "Executing `%s' for INCLUDECMD and caching as `%s'" "" TRANSLATE "Found cached directory listing for `%s'" "" -TRANSLATE "Function `%s' defined at %s:%d should take %d argument%s, but actually takes %d" "" -TRANSLATE "Function `%s' redefined (previously defined at %s:%d)" "" +TRANSLATE "Function `%s' defined at %s(%s) should take %d argument%s, but actually takes %d" "" +TRANSLATE "Function `%s' redefined: previously defined at %s(%s)" "" TRANSLATE "GetValidHebDate: Bad adarbehave value %d" "" TRANSLATE "In" "" TRANSLATE "Invalid INFO string: Must be of the form \"Header: Value\"" ""