gets関数の追加

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ライブラリソースから[drive:\sdccdir]\lib\src\gets.cファイルにあるgets()関数のCソースを編集しコンパイルする。
gets()関数はgetchar()を内部で利用する。


修正箇所はputchar()部分を全てコメントアウト。
システムコール0x01番は内部でエコーバックするため、gets()関数内部putchar()による
エコーバック処理は必要無し。


gets.c
#include <stdio.h>

char *
gets (char *s)
{
  char c;
  unsigned int count = 0;

  while (1)
    {
      c = getchar ();
      switch(c)
      {
       case '\b': /* backspace */
          if (count)
            {
              //putchar ('\b');
              //putchar (' ');
	      //putchar ('\b');
	      --s;
	      --count;
            }
          break;

        case '\n':
        case '\r': /* CR or LF */
          //putchar ('\r');
          //putchar ('\n');
          *s = 0;
          return s;

        default:
          *s++ = c;
          ++count;
          //putchar (c);
          break;
        }
    }
}


修正後gets.cをコンパイル。

> sdcc -mz80 -c gets.c


修正版gets.cライブラリは↓
本来は標準入出力ライブラリとして他の関数を一つにまとめる。

> sdcclib gets.lib getchar.rel gets.rel



  • C言語からの利用

gets()関数のC言語の利用方法を示す。

#include <stdio.h>

void main(void){
	char buf[120];
 
	gets(buf);
}


> sdcc -mz80 -c source.c

> sdld -b _CODE=0x100 -b _DATA=0x100 -i out.ihx source.rel getchar.rel gets.rel

I/Oライブラリのgetchar()はアセンブラで実装されこの部分を変更すると異なる機種用が可能。
getchar()はCPM互換のシステムコールを用いるのでMSXDOS他CPM互換マシンで動作する。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。