diff --git a/src/dorem.c b/src/dorem.c index 0c26d8bd..3762bdde 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -60,7 +60,7 @@ int DoRem(ParsePtr p) if (trig.typ == NO_TYPE) return E_EOLN; if (trig.typ == SAT_TYPE) { - PurgeEchoLine("%s\n", "### Cannot purge SATISFY-type reminders"); + PurgeEchoLine("%s\n", "#!PURGE Cannot purge SATISFY-type reminders"); PurgeEchoLine("%s\n", CurLine); r=DoSatRemind(&trig, &tim, p); if (r) return r; @@ -100,10 +100,10 @@ int DoRem(ParsePtr p) if (PurgeMode) { if (trig.expired) { if (p->expr_happened) { - PurgeEchoLine("%s\n", "### Next line may have expired, but contains expression"); + PurgeEchoLine("%s\n", "#!PURGE Next line may have expired, but contains expression"); PurgeEchoLine("%s\n", CurLine); } else { - PurgeEchoLine("### EXPIRED: %s\n", CurLine); + PurgeEchoLine("#!PURGE EXPIRED: %s\n", CurLine); } } else { PurgeEchoLine("%s\n", CurLine); diff --git a/src/files.c b/src/files.c index a44e4e54..8ba0ca16 100644 --- a/src/files.c +++ b/src/files.c @@ -101,6 +101,14 @@ static int PopFile (void); static void OpenPurgeFile(char const *fname, char const *mode) { DynamicBuffer fname_buf; + + /* Do not open a purge file if we're below purge + include depth */ + if (IStackPtr-2 >= PurgeIncludeDepth) { + PurgeFP = NULL; + return; + } + DBufInit(&fname_buf); if (DBufPuts(&fname_buf, fname) != OK) return; if (DBufPuts(&fname_buf, ".purged") != OK) return; diff --git a/src/globals.h b/src/globals.h index a7788ef8..df0a64c7 100644 --- a/src/globals.h +++ b/src/globals.h @@ -80,6 +80,7 @@ EXTERN INIT( int MaxStringLen, MAX_STR_LEN); EXTERN INIT( char *FileName, NULL); EXTERN INIT( int UseStdin, 0); EXTERN INIT( int PurgeMode, 0); +EXTERN INIT( int PurgeIncludeDepth, 99999); EXTERN FILE *ErrFp; EXTERN INIT( FILE *PurgeFP, NULL); EXTERN INIT( int NumIfs, 0); diff --git a/src/init.c b/src/init.c index abaf51a7..d10d7ed8 100644 --- a/src/init.c +++ b/src/init.c @@ -67,7 +67,7 @@ * -kcmd = Run 'cmd' for MSG-type reminders instead of printing to stdout * -iVAR=EXPR = Initialize and preserve VAR. * -m = Start calendar with Monday instead of Sunday. - * -j = Purge all junk from reminder files + * -j[n] = Purge all junk from reminder files (n = INCLUDE depth) * A minus sign alone indicates to take input from stdin * **************************************************************/ @@ -200,6 +200,9 @@ void InitRemind(int argc, char const *argv[]) case 'j': case 'J': PurgeMode = 1; + if (*arg) { + PARSENUM(PurgeIncludeDepth, arg); + } break; case 'i': case 'I': @@ -616,6 +619,7 @@ void Usage(void) fprintf(ErrFp, " -ivar=val Initialize var to val and preserve var\n"); fprintf(ErrFp, " -m Start calendar with Monday rather than Sunday\n"); fprintf(ErrFp, " -y Synthesize tags for tagless reminders\n"); + fprintf(ErrFp, " -j[n] Run in 'purge' mode. [n = INCLUDE depth]\n"); exit(1); } #endif /* L_USAGE_OVERRIDE */ diff --git a/src/main.c b/src/main.c index 61fc0516..7399389c 100644 --- a/src/main.c +++ b/src/main.c @@ -265,7 +265,7 @@ static void DoReminders(void) PurgeEchoLine("%s\n", CurLine); } else { if (r) { - PurgeEchoLine("### Could not parse next line: %s\n", ErrMsg[r]); + PurgeEchoLine("#!PURGE Could not parse next line: %s\n", ErrMsg[r]); PurgeEchoLine("%s\n", CurLine); } } @@ -715,8 +715,8 @@ int DoIf(ParsePtr p) } else { syndrome = IF_FALSE | BEFORE_ELSE; if (PurgeMode) { - PurgeEchoLine("%s\n", "### The next IF evaluated false..."); - PurgeEchoLine("%s\n", "### REM statements in IF block not checked for purging."); + PurgeEchoLine("%s\n", "#!PURGE The next IF evaluated false..."); + PurgeEchoLine("%s\n", "#!PURGE REM statements in IF block not checked for purging."); } } } @@ -748,8 +748,8 @@ int DoElse(ParsePtr p) IfFlags |= AFTER_ELSE << (2 * NumIfs - 2); if (PurgeMode && ShouldIgnoreLine() && !was_ignoring) { - PurgeEchoLine("%s\n", "### The previous IF evaluated true."); - PurgeEchoLine("%s\n", "### REM statements in ELSE block not checked for purging"); + PurgeEchoLine("%s\n", "#!PURGE The previous IF evaluated true."); + PurgeEchoLine("%s\n", "#!PURGE REM statements in ELSE block not checked for purging"); } return VerifyEoln(p); } @@ -794,8 +794,8 @@ int DoIfTrig(ParsePtr p) syndrome = IF_TRUE | BEFORE_ELSE; } else { syndrome = IF_FALSE | BEFORE_ELSE; - PurgeEchoLine("%s\n", "### The next IFTRIG did not trigger."); - PurgeEchoLine("%s\n", "### REM statements in IFTRIG block not checked for purging."); + PurgeEchoLine("%s\n", "#!PURGE The next IFTRIG did not trigger."); + PurgeEchoLine("%s\n", "#!PURGE REM statements in IFTRIG block not checked for purging."); } } }