mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 06:18:47 +02:00
Get two-way propagation working properly.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
21
src/trans.c
21
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;
|
||||
|
||||
34
src/var.c
34
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; 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);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user