(toppers-users 265) Re: イベントフラグの初期値

Takayuki WAKABAYASHI takayuki @ ertl.ics.tut.ac.jp
2001年 8月 23日 (木) 00:46:26 JST


アドバンスドデータコントロールズ 森田様

豊橋技術科学大学の若林です。

Hiroshi Morita <morita @ adac.co.jp>さんは書きました:
 > このように初期値が0になってしまうのですが
 > 16進数や2進数などでの指定は可能なのでしょうか?

現在 配布しているコンフィギュレータは、10進数以外を認識しません。
 #正確には、引数の最初が[0-9]で始まっている場合、[0-9]以外の文字から
 #先は読み飛ばしてしまいます。ですので、0xと書いた場合、xから先が
 #読み飛ばされて、0として評価されます。

そこで、16/8/2進数を受け入れるように修正しました。
simpleparser.c:117 の直後に次のコードを挿入してください。
 #case '0': と case '1': の間

---8<---
{
	int work = 0;

	ch = in->get();
	switch(ch)
	{
	case 'x':	//16進数
		do{
			ch = in->get();
			if(ch >= '0' && ch <='9')
				work = work * 16 + ch - '0';
			else if(ch >= 'A' && ch <= 'F')
				work = work * 16 + ch - 'A' + 10;
			else if(ch >= 'a' && ch <= 'f')
				work = work * 16 + ch - 'a' + 10;
			else
				break;
		}while(true);
		in->putback(ch);
		break;

	case 'b':	//2進数
		do{
			ch = in->get();
			work <<= 1;
			if(ch == '1')
				work |= 1;
			else if(ch != '0')
				break;
		}while(true);
		work >>= 1;
		in->putback(ch);
		break;

	default:	//8進数 または 予想外の文字
		do{
			if(ch >= '0' && ch <='7')
				work = work * 8 + ch - '0';
			else
				break;
			ch = in->get();
		}while(true);
		in->putback(ch);
		break;
	}

	param.Set(offset++,new Valient(work));
	break;
}
---8<---

フォーマットは、正規表現で書くと次のようになります。
  16進数 : 0x[0-9A-Fa-f]+
   8進数 : 0[0-7]+
   2進数 : 0b[01]+
    #フォーマットに従わない文字が出現した場合、その先は読み飛ばします。

また値はkernel_cfg.cの各オブジェクトの初期化テーブルに
10進数の形で格納されます。

以上 よろしくお願いします。

//-------------------------------------------------
//Takayuki WAKABAYASHI (わかばやし たかゆき)
//  mailto: takayuki @ ertl.ics.tut.ac.jp
//-------------------------------------------------
//豊橋技術科学大学 工学研究科 情報工学専攻
//  組込みリアルタイムシステム研究室
//    Embedded and realtime system laboratory
//      Dept. of information and computer science
//        Toyohashi univ. of technology