From 88aacb3905e63604d139ea7cbffc1552ef7f203c Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Wed, 11 Dec 2024 20:08:09 -0500 Subject: [PATCH] Get two-way propagation working properly. --- src/init.c | 2 +- src/protos.h | 5 +++-- src/trans.c | 21 ++++++++++++++++----- src/var.c | 34 ++++++++++++++++++---------------- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/init.c b/src/init.c index c7a37f90..0bb8861a 100644 --- a/src/init.c +++ b/src/init.c @@ -997,7 +997,7 @@ static void InitializeVar(char const *str) } if (*varname == '$') { - r=SetSysVar(varname+1, &val); + r=SetSysVar(varname+1, &val, 1); DestroyValue(val); if (r) fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r)); return; diff --git a/src/protos.h b/src/protos.h index 908d3e6d..cef40927 100644 --- a/src/protos.h +++ b/src/protos.h @@ -113,7 +113,7 @@ int DoBanner (ParsePtr p); int DoRun (ParsePtr p); int DoExpr (ParsePtr p); int DoTranslate (ParsePtr p); -int InsertTranslation(char const *orig, char const *translated); +int InsertTranslation(char const *orig, char const *translated, int propagate_to_sysvar); void DumpTranslationTable(FILE *fp, int json); int DoErrMsg (ParsePtr p); int ClearGlobalOmits (void); @@ -182,7 +182,7 @@ int GetValidHebDate (int yin, int min, int din, int adarbehave, int *mout, int * int GetNextHebrewDate (int dsestart, int hm, int hd, int yahr, int adarbehave, int *ans); int ComputeJahr (int y, int m, int d, int *ans); int GetSysVar (char const *name, Value *val); -int SetSysVar (char const *name, Value *val); +int SetSysVar (char const *name, Value *val, int propagate_translation); void DumpSysVarByName (char const *name); int CalcMinsFromUTC (int dse, int tim, int *mins, int *isdst); void FillParagraph (char const *s, DynamicBuffer *output); @@ -270,6 +270,7 @@ void InitUserFunctions(void); void ClearSysvarTranslations(void); void PropagateTranslationToSysvar(char const *orig, char const *translated); void InitTranslationTable(void); +void RemoveSysvarTranslation(char const *orig); char const *GetTranslatedString(char const *orig); int GetTranslatedStringTryingVariants(char const *orig, DynamicBuffer *out); char const *GetErr(int r); diff --git a/src/trans.c b/src/trans.c index 85bb9ce1..2ed4a709 100644 --- a/src/trans.c +++ b/src/trans.c @@ -206,7 +206,7 @@ InitTranslationTable(void) fprintf(stderr, "Unable to initialize translation hash table: Out of memory. Exiting.\n"); exit(1); } - InsertTranslation("LANGID", "en"); + InsertTranslation("LANGID", "en", 1); } static XlateItem * @@ -220,7 +220,7 @@ FindTranslation(char const *orig) } int -InsertTranslation(char const *orig, char const *translated) +InsertTranslation(char const *orig, char const *translated, int propagate_to_sysvar) { XlateItem *item = FindTranslation(orig); if (item) { @@ -230,12 +230,22 @@ InsertTranslation(char const *orig, char const *translated) } RemoveTranslation(item); } + + /* TRANSLATE "foo" "foo" means to remove the translation */ + if (strcmp(orig, "LANGID") && (!strcmp(orig, translated))) { + if (propagate_to_sysvar) { + RemoveSysvarTranslation(orig); + } + return OK; + } item = AllocateXlateItem(orig, translated); if (!item) { return E_NO_MEM; } hash_table_insert(&TranslationTable, item); - PropagateTranslationToSysvar(orig, translated); + if (propagate_to_sysvar) { + PropagateTranslationToSysvar(orig, translated); + } return OK; } @@ -361,9 +371,10 @@ DoTranslate(ParsePtr p) XlateItem *item = FindTranslation(DBufValue(&orig)); if (item) { RemoveTranslation(item); + RemoveSysvarTranslation(DBufValue(&orig)); } if (!strcmp(DBufValue(&orig), "LANGID")) { - InsertTranslation("LANGID", "en"); + InsertTranslation("LANGID", "en", 1); } r = OK; } @@ -376,7 +387,7 @@ DoTranslate(ParsePtr p) DBufFree(&translated); return r; } - r = InsertTranslation(DBufValue(&orig), DBufValue(&translated)); + r = InsertTranslation(DBufValue(&orig), DBufValue(&translated), 1); DBufFree(&orig); DBufFree(&translated); return r; diff --git a/src/var.c b/src/var.c index a46c148c..a579b66c 100644 --- a/src/var.c +++ b/src/var.c @@ -36,7 +36,7 @@ static int IntMin = INT_MIN; static int IntMax = INT_MAX; static hash_table VHashTbl; -static int SetSysVarHelper(SysVar *v, Value *value); +static int SetSysVarHelper(SysVar *v, Value *value, int propagate_translation); static unsigned int VarHashFunc(void *x) { @@ -625,7 +625,7 @@ int DoSet (Parser *p) return E_EXPECTING_EOL; } DBufFree(&buf2); - if (*DBufValue(&buf) == '$') r = SetSysVar(DBufValue(&buf)+1, &v); + if (*DBufValue(&buf) == '$') r = SetSysVar(DBufValue(&buf)+1, &v, 1); else r = SetVar(DBufValue(&buf), &v); if (buf.len > VAR_NAME_LEN) { Wprint("Warning: Variable name `%.*s...' truncated to `%.*s'", @@ -1008,26 +1008,26 @@ static void HandleTranslatableVariable(char **var) size_t i; for (i=0; imodifiable) { @@ -1078,7 +1078,9 @@ static int SetSysVarHelper(SysVar *v, Value *value) v->been_malloced = 1; *((char **) v->value) = value->v.str; value->type = ERR_TYPE; /* So that it's not accidentally freed */ - HandleTranslatableVariable((char **) v->value); + if (propagate_translation) { + HandleTranslatableVariable((char **) v->value); + } } else { if (v->max != ANY && value->v.val > v->max) return E_2HIGH; if (v->min != ANY && value->v.val < v->min) return E_2LOW; @@ -1094,11 +1096,11 @@ static int SetSysVarHelper(SysVar *v, Value *value) /* Set a system variable to the indicated value. */ /* */ /***************************************************************/ -int SetSysVar(char const *name, Value *value) +int SetSysVar(char const *name, Value *value, int propagate_translation) { SysVar *v = FindSysVar(name); if (!v) return E_NOSUCH_VAR; - return SetSysVarHelper(v, value); + return SetSysVarHelper(v, value, propagate_translation); } /***************************************************************/