Start implementing a "-j" mode to purge old reminders.

This commit is contained in:
David F. Skoll
2010-04-07 15:30:29 -04:00
parent 5a0ab9ed8a
commit 55cca49428
7 changed files with 58 additions and 9 deletions

View File

@@ -94,6 +94,13 @@ int DoRem(ParsePtr p)
if (r) return r;
}
if (PurgeMode) {
if (trig.expired) {
PurgeEchoLine("### EXPIRED: %s\n", CurLine);
} else {
PurgeEchoLine("%s\n", CurLine);
}
}
/* Queue the reminder, if necessary */
if (jul == JulianToday &&
!(!IgnoreOnce &&

View File

@@ -79,6 +79,7 @@ EXTERN INIT( int MaxSatIter, 150);
EXTERN INIT( int MaxStringLen, MAX_STR_LEN);
EXTERN INIT( char *FileName, NULL);
EXTERN INIT( int UseStdin, 0);
EXTERN INIT( int PurgeMode, 0);
EXTERN FILE *ErrFp;
EXTERN INIT( int NumIfs, 0);
EXTERN INIT( unsigned int IfFlags, 0);

View File

@@ -67,6 +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
* A minus sign alone indicates to take input from stdin
*
**************************************************************/
@@ -194,6 +195,10 @@ void InitRemind(int argc, char const *argv[])
while (*arg) {
switch(*arg++) {
case 'j':
case 'J':
PurgeMode = 1;
break;
case 'i':
case 'I':
InitializeVar(arg);

View File

@@ -70,6 +70,12 @@ int main(int argc, char *argv[])
return 0;
}
/* Are we purging old reminders? Then just run through the loop once! */
if (PurgeMode) {
DoReminders();
return 0;
}
/* Not doing a calendar. Do the regular remind loop */
ShouldCache = (Iterations > 1);
@@ -123,6 +129,15 @@ int main(int argc, char *argv[])
return 0;
}
void PurgeEchoLine(char const *fmt, ...)
{
va_list argptr;
va_start(argptr, fmt);
(void) vfprintf(stdout, fmt, argptr);
va_end(argptr);
}
/***************************************************************/
/* */
/* DoReminders */
@@ -136,6 +151,7 @@ static void DoReminders(void)
Token tok;
char const *s;
Parser p;
int was_rem;
if (!UseStdin) {
FileAccessDate = GetAccessDate(InitialFile);
@@ -173,8 +189,12 @@ static void DoReminders(void)
ShouldIgnoreLine())
{
/*** IGNORE THE LINE ***/
if (PurgeMode) {
PurgeEchoLine("%s\n", CurLine);
}
}
else {
was_rem = 0;
/* Create a parser to parse the line */
CreateParser(s, &p);
switch(tok.type) {
@@ -183,7 +203,7 @@ static void DoReminders(void)
case T_Comment:
break;
case T_Rem: r=DoRem(&p); break;
case T_Rem: r=DoRem(&p); was_rem = 1; break;
case T_ErrMsg: r=DoErrMsg(&p); break;
case T_If: r=DoIf(&p); break;
case T_IfTrig: r=DoIfTrig(&p); break;
@@ -204,32 +224,42 @@ static void DoReminders(void)
DestroyParser(&p);
CreateParser(s, &p);
r=DoRem(&p);
was_rem = 1;
}
break;
case T_Pop: r=PopOmitContext(&p); break;
case T_Preserve: r=DoPreserve(&p); break;
case T_Push: r=PushOmitContext(&p); break;
case T_RemType: if (tok.val == RUN_TYPE) {
r=DoRun(&p);
r=DoRun(&p);
} else {
CreateParser(CurLine, &p);
r=DoRem(&p);
was_rem = 1;
}
break;
} else {
CreateParser(CurLine, &p);
r=DoRem(&p);
break;
}
/* If we don't recognize the command, do a REM by default */
/* Note: Since the parser hasn't been used yet, we don't */
/* need to destroy it here. */
default: CreateParser(CurLine, &p); r=DoRem(&p); break;
default: CreateParser(CurLine, &p); was_rem = 1; r=DoRem(&p); break;
}
if (r && (!Hush || r != E_RUN_DISABLED)) {
Eprint("%s", ErrMsg[r]);
}
if (PurgeMode) {
if (!was_rem) {
PurgeEchoLine("%s\n", CurLine);
} else {
if (r) {
PurgeEchoLine("### Could not parse next line: %s\n", ErrMsg[r]);
PurgeEchoLine("%s\n", CurLine);
}
}
}
/* Destroy the parser - free up resources it may be tying up */
DestroyParser(&p);
}

View File

@@ -134,3 +134,4 @@ int CompareRems (int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, i
void SigIntHandler (int d);
void GotSigInt (void);
void SynthesizeTag(char *);
void PurgeEchoLine(char const *fmt, ...);

View File

@@ -422,6 +422,7 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals)
y, m, d, omit,
result;
trig->expired = 0;
if (save_in_globals) LastTrigValid = 0;
/* Assume everything works */
@@ -449,6 +450,7 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals)
/* If there's an error, die immediately */
if (*err) return -1;
if (result == -1) {
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%d): %s\n",
FileName, LineNo, ErrMsg[E_EXPIRED]);
@@ -485,6 +487,7 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals)
if (trig->back == NO_BACK &&
trig->skip == NO_SKIP &&
trig->rep == NO_REP) {
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%d): %s\n",
FileName, LineNo, ErrMsg[E_EXPIRED]);
@@ -513,6 +516,7 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals)
LastTrigValid = 1;
}
}
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%d): %s\n",
FileName, LineNo, ErrMsg[E_EXPIRED]);

View File

@@ -54,6 +54,7 @@ typedef struct var {
/* A trigger */
typedef struct {
int expired;
int wd;
int d;
int m;