Get two-way propagation working properly.

This commit is contained in:
Dianne Skoll
2024-12-11 20:08:09 -05:00
parent a894076bfc
commit 88aacb3905
4 changed files with 38 additions and 24 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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; i<sizeof(translatables) / sizeof(translatables[0]); i++) {
if (var == translatables[i].var) {
InsertTranslation(translatables[i].word, *(translatables[i].var));
InsertTranslation(translatables[i].word, *(translatables[i].var), 0);
return;
}
}
}
void RemoveSysvarTranslation(char const *orig) {
PropagateTranslationToSysvar(orig, orig);
}
void PropagateTranslationToSysvar(char const *orig, char const *translated)
{
size_t i;
SysVar *v;
Value val;
for (i=0; i<sizeof(translatables) / sizeof(translatables[0]); i++) {
if (!strcmp(translatables[i].word, orig)) {
v = FindSysVar(translatables[i].sysvar_name);
if (v) {
val.type = STR_TYPE;
val.v.str = StrDup(translated);
if (val.v.str) {
(void) SetSysVarHelper(v, &val);
}
val.type = STR_TYPE;
val.v.str = StrDup(translated);
if (val.v.str) {
(void) SetSysVar(translatables[i].sysvar_name, &val, 0);
DestroyValue(val);
}
return;
@@ -1043,13 +1043,13 @@ void ClearSysvarTranslations(void)
val.type = STR_TYPE;
val.v.str = StrDup(translatables[i].word);
if (val.v.str) {
(void) SetSysVar(translatables[i].sysvar_name, &val);
(void) SetSysVar(translatables[i].sysvar_name, &val, 0);
}
DestroyValue(val);
}
}
static int SetSysVarHelper(SysVar *v, Value *value)
static int SetSysVarHelper(SysVar *v, Value *value, int propagate_translation)
{
int r;
if (!v->modifiable) {
@@ -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);
}
/***************************************************************/