OSDN Git Service

noperform wiki command.
authorvisor <visor@users.sourceforge.jp>
Wed, 22 Apr 2015 11:55:46 +0000 (20:55 +0900)
committervisor <visor@users.sourceforge.jp>
Wed, 22 Apr 2015 11:55:46 +0000 (20:55 +0900)
wiki/wikicmd.cc

index fee9331..11b4227 100644 (file)
@@ -101,18 +101,21 @@ void  wc_repeat (WikiLine* wl, WikiFormat* wiki) {
 
 /* ============================================================ */
 /*DOC:
-===$doarray===
- $doarray:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+===$iteratearray===
+ $iteratearray:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
  ...
- $enddoarray
+ [$noperform]
+ ...
+ $enditerate
 
-配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddoarrayまでのブロックを繰り返し実行する。
+配列''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。
 ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻される。
 配列の長さが異なる場合は,配列''VAR1''の長さに揃えられる。
 ''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。
 
 */
-//#WIKICMD     $doarray        $enddoarray     wc_doarray
+//#WIKICMD     $doarray        $noperform      $enddoarray     wc_doarray
+//#WIKICMD     $iteratearray   $noperform      $enditerate     wc_doarray
 void  wc_doarray (WikiLine* wl, WikiFormat* wiki) {
     WikiMotor  motor (wl->begin, wl->end, wiki);
     WikiMotorObjVec  objv;
@@ -145,44 +148,55 @@ void  wc_doarray (WikiLine* wl, WikiFormat* wiki) {
            iv = clipWhite (args[1]->textOut (wiki));
        }
     } else {
-       wiki->errorMsg.append (CharConst ("$doarray: wrong number of parameters.\n"));
+       wiki->errorMsg.append (CharConst ("$iteratearray: wrong number of parameters.\n"));
     }
     iu = lv.size ();
     if (iu > 0) {
        n = wiki->mlenv->getArySize (lv[0]);
-       for (i = 1; i <= n; i ++) {
-           for (it = 0; it < iu; it ++) {
-               wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], i));
-           }
-           if (iv.size () > 0) {
-               h = newMNode_num (i);
-               wiki->mlenv->setVar (iv, h ());
+       if (n > 0) {
+           for (i = 1; i <= n; i ++) {
+               for (it = 0; it < iu; it ++) {
+                   wiki->mlenv->setVar (lv[it], wiki->mlenv->getAry (lv[it], i));
+               }
+               if (iv.size () > 0) {
+                   h = newMNode_num (i);
+                   wiki->mlenv->setVar (iv, h ());
+               }
+               do_linevec (wl->block, wiki);
+               for (it = 0; it < iu; it ++) {
+                   wiki->mlenv->setAry (lv[it], i, wiki->mlenv->getVar (lv[it]));
+               }
            }
-           do_linevec (wl->block, wiki);
            for (it = 0; it < iu; it ++) {
-               wiki->mlenv->setAry (lv[it], i, wiki->mlenv->getVar (lv[it]));
+               wiki->mlenv->setArySize (lv[it], n);
            }
+       } else {
+           if (wl->block2 && wl->block2->block)
+               do_linevec (wl->block2->block, wiki);
        }
-       for (it = 0; it < iu; it ++) {
-           wiki->mlenv->setArySize (lv[it], n);
-       }
+    } else {
+       if (wl->block2 && wl->block2->block)
+           do_linevec (wl->block2->block, wiki);
     }
 }
 
 /* ============================================================ */
 /*DOC:
-===$dovector===
- $dovector:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+===$iteratevector===
+ $iteratevector:''VAR1'',''VAR2'',...[:''INDEX_VAR'']
+ ...
+ [$noperform]
  ...
- $enddovector
+ $enditerate
 
-ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enddovectorまでのブロックを繰り返し実行する。
+ベクタ''VAR1'', ''VAR2'', ...の各要素をそれぞれ変数''VAR1'', ''VAR2'', ...に代入しながら,$enditerateまでのブロックを繰り返し実行する。
 ブロックの中で変数''VAR1'', ...に代入した値は,配列に書き戻されない。
 ベクタの長さが異なる場合は,ベクタ''VAR1''の長さに揃えられる。
 ''INDEX_VAR''を指定すると,配列のインデックス番号を変数''INDEX_VAR''に代入して,ブロックを実行する。
 
 */
-//#WIKICMD     $dovector       $enddovector    wc_dovector
+//#WIKICMD     $dovector       $noperform      $enddovector    wc_dovector
+//#WIKICMD     $iteratevector  $noperform      $enditerate     wc_dovector
 void  wc_dovector (WikiLine* wl, WikiFormat* wiki) {
     WikiMotor  motor (wl->begin, wl->end, wiki);
     WikiMotorObjVec  objv;
@@ -221,45 +235,56 @@ void  wc_dovector (WikiLine* wl, WikiFormat* wiki) {
                lvv.back () = t;
            } else if (isNil (t)) {
            } else {
-               wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n"));
+               wiki->errorMsg.append (CharConst ("$iteratevector: bad value type.\n"));
            }
        }
        if (args.size () == 2) {
            iv = clipWhite (args[1]->textOut (wiki));
        }
     } else {
-       wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n"));
+       wiki->errorMsg.append (CharConst ("$iteratevector: wrong number of parameters.\n"));
     }
     iu = lv.size ();
     if (iu > 0) {
        n = lvv[0] ()->vectorSize ();
-       for (i = 0; i < n; ++ i) {
-           for (it = 0; it < iu; ++ it) {
-               wiki->mlenv->setVar (lv[it], lvv[it] ()->vectorGet (i));
+       if (n > 0) {
+           for (i = 0; i < n; ++ i) {
+               for (it = 0; it < iu; ++ it) {
+                   wiki->mlenv->setVar (lv[it], lvv[it] ()->vectorGet (i));
+               }
+               if (iv.size () > 0) {
+                   h = newMNode_num (i);
+                   wiki->mlenv->setVar (iv, h ());
+               }
+               do_linevec (wl->block, wiki);
            }
-           if (iv.size () > 0) {
-               h = newMNode_num (i);
-               wiki->mlenv->setVar (iv, h ());
+           for (it = 0; it < iu; ++ it) {                      // 書き戻す
+               wiki->mlenv->setVar (lv[it], lvv[it] ());
            }
-           do_linevec (wl->block, wiki);
-       }
-       for (it = 0; it < iu; ++ it) {                  // 書き戻す
-           wiki->mlenv->setVar (lv[it], lvv[it] ());
+       } else {
+           if (wl->block2 && wl->block2->block)
+               do_linevec (wl->block2->block, wiki);
        }
+    } else {
+       if (wl->block2 && wl->block2->block)
+           do_linevec (wl->block2->block, wiki);
     }
 }
 
 /* ============================================================ */
 /*DOC:
-===$dotable===
- $dotable:''VARKEY'',''VARVAL'':''TABLEVAR''
+===$iteratetable===
+ $iteratetable:''VARKEY'',''VARVAL'':''TABLEVAR''
  ...
- $enddotable
+ [$noperform]
+ ...
+ $enditerate
 
-テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enddotableまでのブロックを繰り返し実行する。
+テーブル''TABLEVAR''の各要素のキーと値ををそれぞれ変数''VAR1'', ''VAR2''に代入しながら,$enditerateまでのブロックを繰り返し実行する。
 
 */
-//#WIKICMD     $dotable        $enddotable     wc_dotable
+//#WIKICMD     $dotable        $doperform      $enddotable     wc_dotable
+//#WIKICMD     $iteratetable   $doperform      $enditerate     wc_dotable
 void  wc_dotable (WikiLine* wl, WikiFormat* wiki) {
     WikiMotor  motor (wl->begin, wl->end, wiki);
     WikiMotorObjVec  objv;
@@ -283,7 +308,7 @@ void  wc_dotable (WikiLine* wl, WikiFormat* wiki) {
     motor.compile (objv);
     objv.splitCharA (':', args);
     if (args.size () != 2) {
-       wiki->errorMsg.append (CharConst ("$dovector: wrong number of parameters.\n"));
+       wiki->errorMsg.append (CharConst ("$iteratetable: wrong number of parameters.\n"));
        return;
     }
     WikiMotorObjVecVec  v;
@@ -295,16 +320,21 @@ void  wc_dotable (WikiLine* wl, WikiFormat* wiki) {
     s = clipWhite (args[1]->textOut (wiki));
     tbl = wiki->getVar (s);
     if (! isTable (tbl ())) {
-       wiki->errorMsg.append (CharConst ("$dovector: bad value type.\n"));
+       wiki->errorMsg.append (CharConst ("$iteratetable: bad value type.\n"));
        return;
     }
 
     MotorVar::iterator  b = tbl ()->table->begin ();
     MotorVar::iterator  t = tbl ()->table->end ();
-    for (; b != t; ++ b) {
-       wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列
-       wiki->mlenv->setVar (vval, (*b).second ());
-       do_linevec (wl->block, wiki);
+    if (b != t) {
+       for (; b != t; ++ b) {
+           wiki->mlenv->setVar (vkey, newMNode_str (new ustring ((*b).first))); // テーブルのキーは、文字列
+           wiki->mlenv->setVar (vval, (*b).second ());
+           do_linevec (wl->block, wiki);
+       }
+    } else {
+       if (wl->block2 && wl->block2->block)
+           do_linevec (wl->block2->block, wiki);
     }
 }