commit d97ccd3c81df892f0bae52d63b5d43b71b9c59e1 Author: Daniel Swanson Date: Tue Jun 8 21:08:41 2021 -0500 reset variables on null flush (probably closes #101) diff --git a/apertium/interchunk.cc b/apertium/interchunk.cc index 5d7a052..dc44a4f 100644 --- a/apertium/interchunk.cc +++ b/apertium/interchunk.cc @@ -444,6 +444,7 @@ Interchunk::interchunk_wrapper_null_flush(InputFile& in, UFILE* out) interchunk(in, out); u_fputc('\0', out); u_fflush(out); + variables = variable_defaults; } internal_null_flush = false; null_flush = true; diff --git a/apertium/postchunk.cc b/apertium/postchunk.cc index 893ea2b..8084e86 100644 --- a/apertium/postchunk.cc +++ b/apertium/postchunk.cc @@ -163,13 +163,13 @@ Postchunk::processLu(xmlNode* element) { in_lu = true; out_wblank.clear(); - + UString myword; for (auto i : children(element)) { myword.append(evalString(i)); } in_lu = false; - + if (lword == 1) { out_wblank = word[1]->getWblank(); } @@ -185,7 +185,7 @@ UString Postchunk::processMlu(xmlNode* element) { UString value; - + bool first_time = true; out_wblank.clear(); in_lu = true; @@ -196,7 +196,7 @@ Postchunk::processMlu(xmlNode* element) for (auto j : children(i)) { myword.append(evalString(j)); } - + if (!first_time) { if(!myword.empty() && myword[0] != '#') { //'+#' problem value += '+'; @@ -211,7 +211,7 @@ Postchunk::processMlu(xmlNode* element) } in_lu = false; - + if (lword == 1) { out_wblank = word[1]->getWblank(); } @@ -245,7 +245,7 @@ Postchunk::processOut(xmlNode *localroot) write(evalString(i), output); } } - + in_out = false; } @@ -285,9 +285,9 @@ Postchunk::processLet(xmlNode *localroot) in_let_var = true; var_val = ti.getContent(); var_out_wblank[var_val].clear(); - + variables[ti.getContent()] = evalString(rightSide); - + in_let_var = false; return; @@ -308,14 +308,14 @@ Postchunk::processLet(xmlNode *localroot) if(!xmlStrcmp(leftSide->name, (const xmlChar *) "var")) { in_let_var = true; - + UString const val = to_ustring((const char *) leftSide->properties->children->content); - + var_val = val; var_out_wblank[var_val].clear(); - + variables[val] = evalString(rightSide); - + in_let_var = false; evalStringCache[leftSide] = TransferInstr(ti_var, val, 0); } @@ -539,6 +539,7 @@ Postchunk::postchunk_wrapper_null_flush(InputFile& in, UFILE* out) postchunk(in, out); u_fputc('\0', out); u_fflush(out); + variables = variable_defaults; } internal_null_flush = false; @@ -1040,10 +1041,10 @@ Postchunk::splitWordsAndBlanks(UString const &chunk, vector &words, { ref += chunk[i]; } - + i++; } - + while(chunk[++i] != '$') { if(chunk[i] == '\\') @@ -1147,4 +1148,3 @@ Postchunk::splitWordsAndBlanks(UString const &chunk, vector &words, } } } - diff --git a/apertium/transfer.cc b/apertium/transfer.cc index 40ef727..3b71c84 100644 --- a/apertium/transfer.cc +++ b/apertium/transfer.cc @@ -108,7 +108,7 @@ Transfer::evalCachedString(xmlNode *element) var_out_wblank[var_val] = combineWblanks(var_out_wblank[var_val], word[ti.getPos()]->getWblank()); } } - + return word[ti.getPos()]->source(attr_items[ti.getContent()], ti.getCondition()); } break; @@ -122,7 +122,7 @@ Transfer::evalCachedString(xmlNode *element) var_out_wblank[var_val] = combineWblanks(var_out_wblank[var_val], word[ti.getPos()]->getWblank()); } } - + return word[ti.getPos()]->target(attr_items[ti.getContent()], ti.getCondition()); } break; @@ -191,7 +191,7 @@ Transfer::evalCachedString(xmlNode *element) if(in_out) { blank_queue.pop(); } - + return retblank; } else { return " "_u; @@ -307,18 +307,18 @@ Transfer::processLu(xmlNode* element) { in_lu = true; out_wblank.clear(); - + UString myword; for (auto i : children(element)) { myword.append(evalString(i)); } - + in_lu = false; - + if(last_lword == 1) { out_wblank = word[0]->getWblank(); } - + if(!myword.empty()) { if(myword[0] != '[' || myword[1] != '[') { UString ret = out_wblank; @@ -342,7 +342,7 @@ Transfer::processMlu(xmlNode* element) bool first_time = true; out_wblank.clear(); - + in_lu = true; for (auto i : children(element)) { UString myword; @@ -366,7 +366,7 @@ Transfer::processMlu(xmlNode* element) if(last_lword == 1) { out_wblank = word[0]->getWblank(); } - + if(!value.empty()) { UString ret = out_wblank; ret += '^'; @@ -521,11 +521,11 @@ Transfer::processLet(xmlNode *localroot) var_val = ti.getContent(); var_out_wblank[var_val].clear(); - + variables[ti.getContent()] = evalString(rightSide); - + in_let_var = false; - + return; case ti_clip_sl: @@ -565,14 +565,14 @@ Transfer::processLet(xmlNode *localroot) if(leftSide->name != NULL && !xmlStrcmp(leftSide->name, (const xmlChar *) "var")) { in_let_var = true; - + UString const val = to_ustring((const char *) leftSide->properties->children->content); - + var_val = val; var_out_wblank[var_val].clear(); - + variables[val] = evalString(rightSide); - + in_let_var = false; evalStringCache[leftSide] = TransferInstr(ti_var, val, 0); } @@ -806,7 +806,7 @@ Transfer::readToken(InputFile& in) { content = "[["_u; content += val; - + while(true) { UChar32 val3 = in.get(); @@ -851,7 +851,7 @@ Transfer::readToken(InputFile& in) { //wordbound blank in_wblank = true; content.pop_back(); - + return input_buffer.add(TransferToken(content, tt_blank)); } else if(val2 == ']') @@ -896,6 +896,7 @@ Transfer::tmp_clear() { tmpblank.clear(); tmpword.clear(); + variables = variable_defaults; } void @@ -1092,7 +1093,7 @@ Transfer::transfer(InputFile& in, UFILE* out) { wblank.push_back(*it); } - + it++; } } @@ -1312,7 +1313,7 @@ Transfer::applyRule() { wblank.push_back(*it); } - + it++; } } @@ -1388,7 +1389,7 @@ void Transfer::applyWord(UString const &word_str) { ms.step('^'); - + for(unsigned int i = 0, limit = word_str.size(); i < limit; i++) { switch(word_str[i]) @@ -1397,7 +1398,7 @@ Transfer::applyWord(UString const &word_str) i++; ms.step(towlower(word_str[i]), any_char); break; - + case '[': if(word_str[i+1] == '[') { @@ -1414,7 +1415,7 @@ Transfer::applyWord(UString const &word_str) break; } } - + i++; } } @@ -1423,7 +1424,7 @@ Transfer::applyWord(UString const &word_str) ms.step(towlower(word_str[i]), any_char); } break; - + case '/': i = limit; break; diff --git a/apertium/transfer_base.cc b/apertium/transfer_base.cc index 0ee783e..4c8027b 100644 --- a/apertium/transfer_base.cc +++ b/apertium/transfer_base.cc @@ -89,6 +89,7 @@ TransferBase::read(const char* transferfile, const char* datafile) { UString const cad_k = Compression::string_read(in); variables[cad_k] = Compression::string_read(in); + variable_defaults[cad_k] = variables[cad_k]; } // macros diff --git a/apertium/transfer_base.h b/apertium/transfer_base.h index 88ae2d4..e283329 100644 --- a/apertium/transfer_base.h +++ b/apertium/transfer_base.h @@ -29,6 +29,7 @@ protected: MatchState ms; map attr_items; map variables; + map variable_defaults; map macros; map> lists; map> listslow;