mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 06:18:47 +02:00
Replace PUSH-SYSVARS / POP-SYSVARS with better PUSH-VARS / POP-VARS commands.
This commit is contained in:
@@ -116,8 +116,8 @@
|
||||
"IFTRIG" "IN" "INC" "INCLUDE" "INCLUDECMD" "INFO" "LAST"
|
||||
"LASTDAY" "LASTWORKDAY" "MAYBE" "MAYBE-UNCOMPUTABLE" "MSF"
|
||||
"MSG" "NOQUEUE" "OMIT" "OMITFUNC" "ONCE" "POP"
|
||||
"POP-OMIT-CONTEXT" "POP-SYSVARS" "PRESERVE" "PRIORITY" "PS"
|
||||
"PSFILE" "PUSH" "PUSH-SYSVARS" "PUSH-OMIT-CONTEXT" "REM"
|
||||
"POP-OMIT-CONTEXT" "POP-VARS" "PRESERVE" "PRIORITY" "PS"
|
||||
"PSFILE" "PUSH" "PUSH-VARS" "PUSH-OMIT-CONTEXT" "REM"
|
||||
"RUN" "SATISFY" "SCAN" "SCANFROM" "SCHED" "SECOND" "SET"
|
||||
"SKIP" "SPECIAL" "SYSINCLUDE" "TAG" "THIRD" "THROUGH"
|
||||
"TRANSLATE" "TRANS" "UNSET" "UNTIL" "WARN")
|
||||
|
||||
@@ -41,7 +41,7 @@ advance warning of holidays:
|
||||
FRENAME msgsuffix saved_msgsuffix
|
||||
|
||||
# Save old value of $DefaultDelta
|
||||
PUSH-SYSVARS
|
||||
PUSH-VARS $DefaultDelta
|
||||
|
||||
# We want 7 days' advance warning
|
||||
SET $DefaultDelta 7
|
||||
@@ -61,4 +61,4 @@ advance warning of holidays:
|
||||
FRENAME saved_msgsuffix msgsuffix
|
||||
|
||||
# Restore old value $DefaultDelta
|
||||
POP-SYSVARS
|
||||
POP-VARS
|
||||
|
||||
@@ -3125,32 +3125,41 @@ Note: If any of the calendar modes are in effect, then the
|
||||
values of $Daemon, $DontFork, $DontTrigAts, $DontQueue, $HushMode,
|
||||
$IgnoreOnce, $InfDelta, and $NextMode are not meaningful.
|
||||
.PP
|
||||
.SH SAVING AND RESTORING SYSTEM VARIABLES
|
||||
.SH SAVING AND RESTORING VARIABLES
|
||||
.PP
|
||||
Just as with the OMIT context, you can save and restore the values of
|
||||
all (modifiable) system variables. For example:
|
||||
global variables and all (modifiable) system variables. For example:
|
||||
.PP
|
||||
.nf
|
||||
# Save all system variables
|
||||
PUSH-SYSVARS
|
||||
SET a 1
|
||||
UNSET b
|
||||
|
||||
# Save variables
|
||||
PUSH-VARS $DefaultColor $AddBlankLines a b
|
||||
|
||||
SET $DefaultColor "255 0 0"
|
||||
SET $AddBlankLines 0
|
||||
SET a 3
|
||||
SET b 4
|
||||
REM MSG Hello
|
||||
|
||||
# Restore all system variables
|
||||
POP-SYSVARS
|
||||
# Restore all the variables we pushed earlier
|
||||
POP-VARS
|
||||
|
||||
# Now the changes to $DefaultColor and $AddBlankLines
|
||||
# have been undone
|
||||
# have been undone. Additionally, a is restored to 1
|
||||
# and b is unset
|
||||
.fi
|
||||
.PP
|
||||
As you see from the example, PUSH-SYSVARS saves the values of all
|
||||
modifiable system variables, and POP-SYSVARS restores them to the
|
||||
values they had at the time of the matching PUSH-SYSVARS call. Note
|
||||
that only \fImodifiable\fR system variables are saved---that is, only
|
||||
system variables you can assign using \fBSET\fR. Read-only system
|
||||
variables are \fInot\fR saved by PUSH-SYSVARS nor restored by POP-SYSVARS.
|
||||
As you see from the example, PUSH-VARS takes a list of global variable
|
||||
names and system variable names. You can save the values of any
|
||||
\fImodifiable\fR system variables and any global variable. You can
|
||||
even push global variables that are not set.
|
||||
.PP
|
||||
The POP-VARS command restores the values of all system variables and
|
||||
global variables that were pushed by the most recent PUSH-VARS
|
||||
command. If you push an undefined global variable, then that variable
|
||||
is unset by the POP-VARS command.
|
||||
.PP
|
||||
.SH BUILT-IN FUNCTIONS
|
||||
.PP
|
||||
|
||||
@@ -1806,17 +1806,11 @@ static void GenerateCalEntries(int col)
|
||||
break;
|
||||
case T_Pop: r=PopOmitContext(&p); break;
|
||||
case T_Push: r=PushOmitContext(&p); break;
|
||||
case T_PushSysvars:
|
||||
r=PushSysvars();
|
||||
if (r == OK) {
|
||||
r = VerifyEoln(&p);
|
||||
}
|
||||
case T_PushVars:
|
||||
r=PushVars(&p);
|
||||
break;
|
||||
case T_PopSysvars:
|
||||
r=PopSysvars();
|
||||
if (r == OK) {
|
||||
r = VerifyEoln(&p);
|
||||
}
|
||||
case T_PopVars:
|
||||
r=PopVars(&p);
|
||||
break;
|
||||
case T_Preserve: r=DoPreserve(&p); break;
|
||||
case T_Expr: r = DoExpr(&p); break;
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
#define E_CANT_PARSE_WKDAY 8
|
||||
#define E_NO_MEM 9
|
||||
#define E_BAD_NUMBER 10
|
||||
#define E_PUSHSV_NO_POP 11
|
||||
#define E_POPSV_NO_PUSH 12
|
||||
#define E_PUSHV_NO_POP 11
|
||||
#define E_POPV_NO_PUSH 12
|
||||
#define E_CANT_COERCE 13
|
||||
#define E_BAD_TYPE 14
|
||||
#define E_DATE_OVER 15
|
||||
@@ -158,8 +158,8 @@ EXTERN char *ErrMsg[]
|
||||
/* E_CANT_PARSE_WKDAY*/ "Invalid weekday name",
|
||||
/* E_NO_MEM */ "Out of memory",
|
||||
/* E_BAD_NUMBER */ "Ill-formed number",
|
||||
/* E_PUSHSV_NO_POP */ "Warning: PUSH-SYSVARS without matching POP-SYSVARS",
|
||||
/* E_POPSV_NO_PUSH */ "POP-SYSVARS without matching PUSH-SYSVARS",
|
||||
/* E_PUSHV_NO_POP */ "Warning: PUSH-VARS without matching POP-VARS",
|
||||
/* E_POPV_NO_PUSH */ "POP-VARS without matching PUSH-VARS",
|
||||
/* E_CANT_COERCE */ "Can't coerce",
|
||||
/* E_BAD_TYPE */ "Type mismatch",
|
||||
/* E_DATE_OVER */ "Date overflow",
|
||||
|
||||
20
src/main.c
20
src/main.c
@@ -185,9 +185,9 @@ int main(int argc, char *argv[])
|
||||
FreshLine = 1;
|
||||
Eprint("%s", GetErr(E_PUSH_NOPOP));
|
||||
}
|
||||
if (EmptySysvarStack(1)) {
|
||||
if (EmptyVarStack(1)) {
|
||||
FreshLine = 1;
|
||||
Eprint("%s", GetErr(E_PUSHSV_NO_POP));
|
||||
Eprint("%s", GetErr(E_PUSHV_NO_POP));
|
||||
}
|
||||
if (!Daemon && !NextMode && !NumTriggered && !NumQueued) {
|
||||
printf("%s\n", GetErr(E_NOREMINDERS));
|
||||
@@ -241,7 +241,7 @@ PerIterationInit(void)
|
||||
{
|
||||
ClearGlobalOmits();
|
||||
DestroyOmitContexts(1);
|
||||
EmptySysvarStack(1);
|
||||
EmptyVarStack(1);
|
||||
DestroyVars(0);
|
||||
DefaultColorR = -1;
|
||||
DefaultColorG = -1;
|
||||
@@ -373,17 +373,11 @@ static void DoReminders(void)
|
||||
case T_Pop: r=PopOmitContext(&p); break;
|
||||
case T_Preserve: r=DoPreserve(&p); break;
|
||||
case T_Push: r=PushOmitContext(&p); break;
|
||||
case T_PushSysvars:
|
||||
r=PushSysvars();
|
||||
if (r == OK) {
|
||||
r = VerifyEoln(&p);
|
||||
}
|
||||
case T_PushVars:
|
||||
r=PushVars(&p);
|
||||
break;
|
||||
case T_PopSysvars:
|
||||
r=PopSysvars();
|
||||
if (r == OK) {
|
||||
r = VerifyEoln(&p);
|
||||
}
|
||||
case T_PopVars:
|
||||
r=PopVars(&p);
|
||||
break;
|
||||
case T_Expr: r = DoExpr(&p); break;
|
||||
case T_Translate: r = DoTranslate(&p); break;
|
||||
|
||||
@@ -147,9 +147,9 @@ int SetVar (char const *str, Value const *val, int nonconst_expr);
|
||||
int DoSet (Parser *p);
|
||||
int DoUnset (Parser *p);
|
||||
int DoDump (ParsePtr p);
|
||||
int PushSysvars(void);
|
||||
int EmptySysvarStack(int print_unmatched);
|
||||
int PopSysvars(void);
|
||||
int PushVars(ParsePtr p);
|
||||
int EmptyVarStack(int print_unmatched);
|
||||
int PopVars(ParsePtr p);
|
||||
void DumpVarTable (int dump_constness);
|
||||
void DumpUnusedVars(void);
|
||||
void DestroyVars (int all);
|
||||
|
||||
@@ -91,13 +91,13 @@ Token TokArray[] = {
|
||||
{ "omitfunc", 8, T_OmitFunc, 0 },
|
||||
{ "once", 4, T_Once, 0 },
|
||||
{ "pop-omit-context", 3, T_Pop, 0 },
|
||||
{ "pop-sysvars", 11, T_PopSysvars, 0 },
|
||||
{ "pop-vars", 8, T_PopVars, 0 },
|
||||
{ "preserve", 8, T_Preserve, 0 },
|
||||
{ "priority", 8, T_Priority, 0 },
|
||||
{ "ps", 2, T_RemType, PS_TYPE },
|
||||
{ "psfile", 6, T_RemType, PSF_TYPE },
|
||||
{ "push-omit-context", 4, T_Push, 0 },
|
||||
{ "push-sysvars", 12, T_PushSysvars, 0 },
|
||||
{ "push-vars", 9, T_PushVars, 0 },
|
||||
{ "rem", 3, T_Rem, 0 },
|
||||
{ "run", 3, T_RemType, RUN_TYPE },
|
||||
{ "satisfy", 7, T_RemType, SAT_TYPE },
|
||||
|
||||
@@ -232,8 +232,8 @@ enum TokTypes
|
||||
T_Frename, T_Fset, T_Funset, T_If, T_IfTrig, T_In, T_Include,
|
||||
T_IncludeCmd, T_IncludeR, T_IncludeSys, T_Info, T_LastBack,
|
||||
T_LongTime, T_MaybeUncomputable, T_Month, T_NoQueue, T_Number,
|
||||
T_Omit, T_OmitFunc, T_Once, T_Ordinal, T_Pop, T_PopSysvars,
|
||||
T_Preserve, T_Priority, T_Push, T_PushSysvars, T_Rem, T_RemType,
|
||||
T_Omit, T_OmitFunc, T_Once, T_Ordinal, T_Pop, T_PopVars,
|
||||
T_Preserve, T_Priority, T_Push, T_PushVars, T_Rem, T_RemType,
|
||||
T_Rep, T_Scanfrom, T_Sched, T_Set, T_Skip, T_Tag, T_Through, T_Time,
|
||||
T_Translate, T_UnSet, T_Until, T_Warn, T_WkDay, T_Year
|
||||
};
|
||||
|
||||
306
src/var.c
306
src/var.c
@@ -155,7 +155,7 @@ static int latitude_longitude_func(int do_set, Value *val, double *var, double m
|
||||
if (loc) {
|
||||
setlocale(LC_NUMERIC, "C");
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "%f", *var);
|
||||
snprintf(buf, sizeof(buf), "%.8f", *var);
|
||||
if (loc) {
|
||||
setlocale(LC_NUMERIC, loc);
|
||||
}
|
||||
@@ -1079,104 +1079,242 @@ static SysVar SysVarArr[] = {
|
||||
};
|
||||
|
||||
#define NUMSYSVARS ( sizeof(SysVarArr) / sizeof(SysVar) )
|
||||
static size_t NumPushableSysvars = 0;
|
||||
|
||||
struct pushed_sysvars {
|
||||
struct pushed_sysvars *next;
|
||||
typedef struct pushed_vars {
|
||||
struct pushed_vars *next;
|
||||
char const *filename;
|
||||
int lineno;
|
||||
PushedSysvar *vars;
|
||||
};
|
||||
int num_sysvars;
|
||||
int num_vars;
|
||||
int alloc_sysvars;
|
||||
int alloc_vars;
|
||||
PushedSysvar *sysvars;
|
||||
Var *vars;
|
||||
} PushedVars;
|
||||
|
||||
static struct pushed_sysvars *SysvarStack = NULL;
|
||||
static void free_pushedvars(PushedVars *pv);
|
||||
|
||||
static size_t CountPushableSysvars(void)
|
||||
{
|
||||
if (NumPushableSysvars != 0) return NumPushableSysvars;
|
||||
size_t i;
|
||||
for (i=0; i<NUMSYSVARS; i++) {
|
||||
if (SysVarArr[i].modifiable) {
|
||||
NumPushableSysvars++;
|
||||
}
|
||||
}
|
||||
return NumPushableSysvars;
|
||||
}
|
||||
static PushedVars *VarStack = NULL;
|
||||
|
||||
int PushSysvars(void)
|
||||
{
|
||||
size_t i, j;
|
||||
int r, ret;
|
||||
struct pushed_sysvars *ps = NEW(struct pushed_sysvars);
|
||||
if (!ps) return E_NO_MEM;
|
||||
|
||||
ps->filename = GetCurrentFilename();
|
||||
ps->lineno = LineNo;
|
||||
|
||||
ps->next = SysvarStack;
|
||||
ps->vars = calloc(CountPushableSysvars(), sizeof(PushedSysvar));
|
||||
if (!ps->vars) {
|
||||
free(ps);
|
||||
return E_NO_MEM;
|
||||
}
|
||||
|
||||
j = 0;
|
||||
|
||||
ret = OK;
|
||||
for (i=0; i<NUMSYSVARS; i++) {
|
||||
if (SysVarArr[i].modifiable) {
|
||||
ps->vars[j].name = SysVarArr[i].name;
|
||||
ps->vars[j].v.type = ERR_TYPE;
|
||||
r = GetSysVar(ps->vars[j].name, &(ps->vars[j].v));
|
||||
if (r != OK) ret = r;
|
||||
/* fprintf(ErrFp, "push($%s) => %s\n", ps->vars[j].name, PrintValue(&(ps->vars[j].v), NULL)); */
|
||||
j++;
|
||||
}
|
||||
}
|
||||
SysvarStack = ps;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PopSysvars(void)
|
||||
{
|
||||
int r, ret;
|
||||
if (!SysvarStack) {
|
||||
return E_POPSV_NO_PUSH;
|
||||
}
|
||||
size_t n = CountPushableSysvars();
|
||||
size_t i;
|
||||
struct pushed_sysvars *ps = SysvarStack;
|
||||
|
||||
if (strcmp(ps->filename, GetCurrentFilename())) {
|
||||
Wprint(tr("POP-SYSVARS at %s:%d matches PUSH-SYSVARS in different file: %s:%d"), GetCurrentFilename(), LineNo, ps->filename, ps->lineno);
|
||||
}
|
||||
SysvarStack = ps->next;
|
||||
ret = OK;
|
||||
for (i=0; i<n; i++) {
|
||||
/* fprintf(ErrFp, "pop($%s) => %s\n", ps->vars[i].name, PrintValue(&(ps->vars[i].v), NULL)); */
|
||||
r = SetSysVar(ps->vars[i].name, &(ps->vars[i].v));
|
||||
if (r != OK) ret = r;
|
||||
DestroyValue(ps->vars[i].v);
|
||||
}
|
||||
free(ps->vars);
|
||||
free(ps);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int EmptySysvarStack(int print_unmatched)
|
||||
int EmptyVarStack(int print_unmatched)
|
||||
{
|
||||
int j=0;
|
||||
while(SysvarStack) {
|
||||
PushedVars *next;
|
||||
while(VarStack) {
|
||||
if (print_unmatched) {
|
||||
Wprint(tr("Unmatched PUSH-SYSVARS at %s(%d)"),
|
||||
SysvarStack->filename,
|
||||
SysvarStack->lineno);
|
||||
Wprint(tr("Unmatched PUSH-VARS at %s(%d)"),
|
||||
VarStack->filename,
|
||||
VarStack->lineno);
|
||||
}
|
||||
j++;
|
||||
PopSysvars();
|
||||
next = VarStack->next;
|
||||
free_pushedvars(VarStack);
|
||||
VarStack = next;
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
static int add_sysvar_to_push(char const *name, PushedVars *pv)
|
||||
{
|
||||
int n = pv->alloc_sysvars;
|
||||
if (*name == '$') {
|
||||
name++;
|
||||
}
|
||||
SysVar *v = FindSysVar(name);
|
||||
if (!v) {
|
||||
return E_NOSUCH_VAR;
|
||||
}
|
||||
if (!v->modifiable) {
|
||||
Eprint("%s: `$%s'", GetErr(E_CANT_MODIFY), v->name);
|
||||
return E_CANT_MODIFY;
|
||||
}
|
||||
if (!n) {
|
||||
n = 4;
|
||||
pv->sysvars = malloc(n * sizeof(PushedSysvar));
|
||||
pv->alloc_sysvars = n;
|
||||
} else {
|
||||
if (pv->num_sysvars >= n) {
|
||||
n *= 2;
|
||||
pv->sysvars = realloc(pv->sysvars, n * sizeof(PushedSysvar));
|
||||
pv->alloc_sysvars = n;
|
||||
}
|
||||
}
|
||||
if (!pv->sysvars) {
|
||||
return E_NO_MEM;
|
||||
}
|
||||
n = pv->num_sysvars;
|
||||
pv->num_sysvars++;
|
||||
pv->sysvars[n].name = v->name;
|
||||
pv->sysvars[n].v.type = ERR_TYPE;
|
||||
return GetSysVar(name, &(pv->sysvars[n].v));
|
||||
}
|
||||
|
||||
static int add_var_to_push(char const *name, PushedVars *pv)
|
||||
{
|
||||
int n = pv->alloc_vars;
|
||||
if (!n) {
|
||||
n = 4;
|
||||
pv->vars = malloc(n * sizeof(Var));
|
||||
pv->alloc_vars = n;
|
||||
} else {
|
||||
if (pv->num_vars >= n) {
|
||||
n *= 2;
|
||||
pv->vars = realloc(pv->vars, n * sizeof(Var));
|
||||
pv->alloc_vars = n;
|
||||
}
|
||||
}
|
||||
if (!pv->vars) {
|
||||
return E_NO_MEM;
|
||||
}
|
||||
n = pv->num_vars;
|
||||
pv->num_vars++;
|
||||
Var *v = FindVar(name, 0);
|
||||
Var *dest = &(pv->vars[n]);
|
||||
int r = OK;
|
||||
if (!v) {
|
||||
StrnCpy(dest->name, name, VAR_NAME_LEN);
|
||||
dest->preserve = 0;
|
||||
dest->is_constant = 0;
|
||||
dest->used_since_set = 0;
|
||||
dest->filename = NULL;
|
||||
dest->lineno = -1;
|
||||
dest->v.type = ERR_TYPE;
|
||||
dest->v.v.val = E_NOSUCH_VAR;
|
||||
} else {
|
||||
StrnCpy(dest->name, v->name, VAR_NAME_LEN);
|
||||
dest->preserve = v->preserve;
|
||||
dest->is_constant = v->is_constant;
|
||||
dest->used_since_set = v->used_since_set;
|
||||
dest->filename = v->filename;
|
||||
dest->lineno = v->lineno;
|
||||
r = CopyValue(&(dest->v), &(v->v));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static void free_pushedvars(PushedVars *pv)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<pv->num_sysvars; i++) {
|
||||
DestroyValue(pv->sysvars[i].v);
|
||||
}
|
||||
for (i=0; i<pv->num_vars; i++) {
|
||||
DestroyValue(pv->vars[i].v);
|
||||
}
|
||||
if (pv->sysvars) {
|
||||
free(pv->sysvars);
|
||||
}
|
||||
if (pv->vars) {
|
||||
free(pv->vars);
|
||||
}
|
||||
free(pv);
|
||||
}
|
||||
|
||||
int
|
||||
PushVars(ParsePtr p)
|
||||
{
|
||||
int r;
|
||||
DynamicBuffer buf;
|
||||
char const *name;
|
||||
|
||||
PushedVars *pv = NEW(PushedVars);
|
||||
if (!pv) {
|
||||
return E_NO_MEM;
|
||||
}
|
||||
pv->next = NULL;
|
||||
pv->filename = GetCurrentFilename();
|
||||
pv->lineno = LineNo;
|
||||
pv->num_sysvars = 0;
|
||||
pv->num_vars = 0;
|
||||
pv->alloc_sysvars = 0;
|
||||
pv->alloc_vars = 0;
|
||||
pv->sysvars = NULL;
|
||||
pv->vars = NULL;
|
||||
|
||||
while(1) {
|
||||
r = ParseIdentifier(p, &buf);
|
||||
if (r == E_EOLN) {
|
||||
break;
|
||||
}
|
||||
if (r) {
|
||||
DBufFree(&buf);
|
||||
free_pushedvars(pv);
|
||||
return r;
|
||||
}
|
||||
name = DBufValue(&buf);
|
||||
if (*name == '$') {
|
||||
r = add_sysvar_to_push(name+1, pv);
|
||||
} else {
|
||||
r = add_var_to_push(name, pv);
|
||||
}
|
||||
DBufFree(&buf);
|
||||
if (r != OK) {
|
||||
free_pushedvars(pv);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
if ((pv->num_vars + pv->num_sysvars) == 0) {
|
||||
free_pushedvars(pv);
|
||||
return E_EOLN;
|
||||
}
|
||||
pv->next = VarStack;
|
||||
VarStack = pv;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
PopVars(ParsePtr p)
|
||||
{
|
||||
int r = VerifyEoln(p);
|
||||
int i;
|
||||
int ret = OK;
|
||||
PushedVars *pv = VarStack;
|
||||
if (r != OK) {
|
||||
return r;
|
||||
}
|
||||
if (!pv) {
|
||||
return E_POPV_NO_PUSH;
|
||||
}
|
||||
VarStack = VarStack->next;
|
||||
if (strcmp(pv->filename, GetCurrentFilename())) {
|
||||
Wprint(tr("POP-VARS at %s:%d matches PUSH-VARS in different file: %s:%d"), GetCurrentFilename(), LineNo, pv->filename, pv->lineno);
|
||||
}
|
||||
|
||||
/* Pop the sysvars */
|
||||
for (i=0; i<pv->num_sysvars; i++) {
|
||||
r = SetSysVar(pv->sysvars[i].name, &(pv->sysvars[i].v));
|
||||
if (r != OK) {
|
||||
ret = r;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pop the vars */
|
||||
for (i=0; i<pv->num_vars; i++) {
|
||||
Var *src = &(pv->vars[i]);
|
||||
if (src->v.type == ERR_TYPE && src->v.v.val == E_NOSUCH_VAR) {
|
||||
/* Delete the variable if it exists */
|
||||
(void) DeleteVar(src->name);
|
||||
} else {
|
||||
Var *dest = FindVar(src->name, 1);
|
||||
if (!dest) {
|
||||
ret = E_NO_MEM;
|
||||
continue;
|
||||
}
|
||||
dest->preserve = src->preserve;
|
||||
dest->is_constant = src->is_constant;
|
||||
dest->used_since_set = src->used_since_set;
|
||||
dest->filename = src->filename;
|
||||
dest->lineno = src->lineno;
|
||||
r = CopyValue(&(dest->v), &(src->v));
|
||||
if (r != OK) {
|
||||
ret = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
free_pushedvars(pv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void DumpSysVar (char const *name, const SysVar *v);
|
||||
|
||||
static int SetTranslatableVariable(SysVar const *v, Value const *value)
|
||||
|
||||
@@ -83,8 +83,8 @@ UNSET a
|
||||
CLEAR-OMIT-CONTEXT
|
||||
PUSH-OMIT-CONTEXT
|
||||
POP-OMIT-CONTEXT
|
||||
PUSH-SYSVARS
|
||||
POP-SYSVARS
|
||||
PUSH-VARS foo
|
||||
POP-VARS
|
||||
BANNER wow
|
||||
DEBUG +x
|
||||
DEBUG -x
|
||||
|
||||
1841
tests/test.cmp
1841
tests/test.cmp
File diff suppressed because one or more lines are too long
@@ -478,13 +478,16 @@ REM MAYBE-UNCOMPUTABLE Mon OMIT Mon SKIP MSG Never ever ever...
|
||||
REM MAYBE-UNCOMPUTABLE Mon SATISFY [wkdaynum($T) == 3] MSG Nope nope...
|
||||
|
||||
dump
|
||||
PUSH-SYSVARS
|
||||
set axx 1
|
||||
PUSH-VARS $Tomorrow $Latitude $DefaultColor axx bxbxbx
|
||||
set $Tomorrow "HAHA, tomorrow"
|
||||
set $Latitude "0"
|
||||
set $DefaultColor "42 42 42"
|
||||
dump $
|
||||
POP-SYSVARS
|
||||
dump $
|
||||
set bxbxbx 1
|
||||
dump $Tomorrow $Latitude $DefaultColor axx bxbxbx a136 $Today
|
||||
POP-VARS
|
||||
dump $Tomorrow $Latitude $DefaultColor axx bxbxbx a136 $Today
|
||||
|
||||
msg [$April]%
|
||||
msg [$August]%
|
||||
msg [$CalcUTC]%
|
||||
@@ -1664,6 +1667,14 @@ DEBUG -x
|
||||
# Output expression-node stats
|
||||
DEBUG +h
|
||||
|
||||
# Long list of pushing/popping variables
|
||||
PUSH-VARS $AddBlankLines $Ago $Am $And $April $At $August $CalcUTC $DateSep $DateTimeSep $December $DedupeReminders $DefaultColor $DefaultDelta $DefaultPrio $DefaultTDelta $EndSent $EndSentIg $ExpressionTimeLimit $February $FirstIndent $FoldYear $FormWidth $Friday $Fromnow $Hour $Hplu $Is $January $July $June $LatDeg $Latitude $LatMin $LatSec $Location $LongDeg $Longitude $LongMin $LongSec $March $MaxLateMinutes $MaxSatIter $MaxStringLen $May $MinsFromUTC $Minute $Monday $Mplu $November $Now $October $On $OnceFile $ParseUntriggered $Pm $Saturday $September $SubsIndent $Sunday $SuppressImplicitWarnings $SuppressLRM $Thursday $TimeSep $Today $Tomorrow $Tuesday $Was $Wednesday 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 a65 a66 a67 a68 a69 a70 a71 a72 a73 a74 a75 a76 a77 a78 a79 a80 a81 a82 a83 a84 a85 a86 a87 a88 a89 a90 a91 a92 a93 a94 a95 a96 a97 a98 a99 a100 a101 a102 a103 a104 a105 a106 a107 a108 a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 a119 a120 a121 a122 a123 a124 a125 a126 a127 a128 a129 a130 a131 a132 a133 a134 a135 a136 a137 a138 a139 a140 a141 a142 a143 a144 a145 a146 a147 a148 a149 a150 a151 a152 a153 a154 a155 a156 a157 a158 a159 a160 a161 a162 a163 a164 a165 a166 a167 a168 a169 a170 a171 a172 a173 a174 a175 a176 a177 a178 a179 a180 a181 a182 a183 a184 a185 a186 a187 a188 a189 a190 a191 a192 a193 a194 a195 a196 a197 a198 a199 a200 a201 a202 a203 a204 a205 a206 a207 a208 a209 a210 a211 a212 a213 a214 a215 a216 a217 a218 a219 a220 a221 a222 a223 a224 a225 a226 a227 a228 a229 a230 a231 a232 a233 a234 a235 a236 a237 a238 a239 a240 a241 a242 a243 a244 a245 a246 a247 a248 a249 a250 a251 a252 a253 a254 a255 a256 a257 a258 a259 a260 a261 a262 a263 a264 a265 a266 a267 a268 a269 a270 a271 a272 a273 a274 a275 a276 a277 a278 a279 a280 a281 a282 a283 a284 a285 a286 a287 a288 a289 a290 a291 a292 a293 a294 a295 a296 a297 a298 a299 a300
|
||||
POP-VARS
|
||||
|
||||
# Try pushing a read-only one
|
||||
PUSH-VARS $NumTrig
|
||||
POP-VARS
|
||||
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
|
||||
Reference in New Issue
Block a user