//------------------------------------------------------------------ //マクロコピー private void mk_mcopy() { int l = Common.searchm(gWork.com.prm[0][0]); if (l == DEF.ERROR) { DEF.PF(string.Format( "\n指定されたマクロナンバ({0})がない、またはマクロ行ではありません" , gWork.com.prm[0][0] )); throw new M98Exception(); } Common.lnkdat(l, l + 1); //set MML to sndbuf1 if (gWork.hismac != 0) { //コピー先がマクロ行なら int tmp = gWork.hismac; m98.settone(); gWork.hismac = tmp; } else { DEF.PF("\nコピー先がマクロでない"); throw new M98Exception(); } Common.initprg(); m98.initcpyt(gWork.TNUM); }
//------------------------------------------------------------------ /* * n行の'{'と対になっている'}'の行番号を得る * 戻り値:行番号 */ private int searche(int n) { n++; while (gWork.mml[n].chheader != "}") { if (gWork.mml[n].chheader == "{" || gWork.mml[n].chheader == "") { DEF.PF("\nError:{の後に}がありません"); throw new M98Exception(); } n++; } return(n); }
//------------------------------------------------------------------ //コマンドマージ // mgadrから始まるコマンド文字列に、コマンドグループcomgの内容 // をコマンドバッファにマージする private void mg_com(ref string mgadr, ref int mgPtr, int comg) { int coms = 0, mmls = 0; bool found = false; string pushbuf = ""; //一時待避用バッファ int i = 0; for (i = mgPtr; i < mgadr.Length; i++) { pushbuf += mgadr[i].ToString(); } if (null == pushbuf) //mgadr以降のコマンドを待避 { DEF.PF("\nコマンドバッファオーバーフロー"); throw new M98Exception(); } for (i = 0; i < gWork.mml.Length; i++) { if (gWork.mml[i].chheader == "{") { int p = 0; while (p < gWork.mml[i].mmldat.Length && gWork.mml[i].mmldat[p] == ' ') { p++; } if (Common.atoi(gWork.mml[i].mmldat, p) == comg) { coms = i + 1; mmls = searche(i); found = true; break; } } } if (!found) { DEF.PF(string.Format("\n{0}<- 指定されたコマンドグループは存在しません", comg)); throw new M98Exception(); } mgadr = mgadr.Substring(0, mgPtr); setcomb(coms, mmls, ref mgadr); //新たにmgadrからマージする mgadr += pushbuf; //gWork.allcombf += pushbuf; //待避していた文字列をもどす //free(pushbuf); }
//------------------------------------------------------------------ //指定されたバッファbufferにcoms行からmmls-1行までのコマンドをセットする private void setcomb(int coms, int mmls, ref string buffer) { int i = 0; while (coms != mmls) { string a = gWork.mml[coms].mmldat; int aPtr = 0; while (aPtr < a.Length && a[aPtr] != '\n') { if (a[aPtr] == ';') //コマンドライン中のリマーク { while (aPtr < a.Length && a[aPtr] != '\n') { aPtr++; } } else { if (a[aPtr] == ' ' || a[aPtr] == '\t') { aPtr++; } else { buffer += a[aPtr++]; i++; if (i > DEF.MAXCOMBF * 1024) { DEF.PF("\nコマンドバッファオーバー"); throw new M98Exception(); } } } } coms++; } //*buffer = '\0'; }
//--------------------------------------------------------------------------- //x行からy行までのMMLを総括してsndbuf1にいれる public static void lnkdat(int x, int y) { int a = 0; string b = ""; // gWork.sndbuf1; int i = 0; while (x != y) { //a = gWork.mml[x].mmldat; while (gWork.mml[x].mmldat.Length != a && gWork.mml[x].mmldat[a] != '\n') { b += gWork.mml[x].mmldat[a++]; i++; if (i > DEF.MAXBUF * 1024) { DEF.PF("\nError:変換バッファオーバー"); throw new M98Exception(); } } x++; } //b += '\n'; gWork.sndbuf1 = b; }