MNode* ml_split (MNode* cell, MlEnv* mlenv) {
MNode* arg = cell->cdr ();
ustring reg;
- ustring t;
+ ustring text;
+ bool keep = false;
MNodeList ans;
+ std::vector<MNode*> params;
+ std::vector<MNode*> keywords;
+ static paramList kwlist[] = {
+ {CharConst ("keep"), true}, // 空フィールドの削除をしない
+ {NULL, 0, 0}
+ };
- if (! arg)
- throw (uErrorWrongNumber);
-
- reg = eval_str (arg->car (), mlenv);
- nextNodeNonNil (arg);
- t = eval_str (arg->car (), mlenv);
- nextNode (arg);
-
- if (arg)
- throw (uErrorWrongNumber);
+ setParams (arg, 2, ¶ms, kwlist, &keywords, NULL);
+ reg = eval_str (params[0], mlenv);
+ text = eval_str (params[1], mlenv);
+ if (keywords[0] && eval_bool (keywords[0], mlenv))
+ keep = true;
try {
- std::wstring wt = utow (t);
+ std::wstring wt = utow (text);
std::wstring wreg = utow (reg);
boost::wregex wre (wreg);
WSplitter sp (wt, wre);
size_t m = wt.length () + 1;
- while (sp.next ()) {
+ bool (WSplitter::*nfn)();
+ if (keep)
+ nfn = &WSplitter::nextSep;
+ else
+ nfn = &WSplitter::next;
+ while ((sp.*nfn) ()) {
ans.append (newMNode_str (new ustring (sp.cur ())));
m --;
if (m == 0)
throw (uErrorRegexp);
}
+ if (keep)
+ ans.append (newMNode_str (new ustring (sp.cur ())));
} catch (boost::regex_error& err) {
throw (uErrorRegexp);
}