예제 #1
0
        //------------------------------------------------------------------
        //マクロコピー
        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);
        }
예제 #2
0
        //------------------------------------------------------------------

        /*
         *      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);
        }
예제 #3
0
        //------------------------------------------------------------------
        //コマンドマージ
        //	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);
        }
예제 #4
0
        //------------------------------------------------------------------
        //指定されたバッファ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';
        }
예제 #5
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;
        }