読者です 読者をやめる 読者になる 読者になる

OS自作入門 onLinux 7日目

7日目ソースコード

115cad8a.png

7日目無事に終わりました。
正直ほとんど内容がないので、8日目とくっつけようかと思いましたが、
日付ごとに分けた方が、後々から見やすいかなーと思ってわけました。
本心では記事数を稼ぎたかっただけです

では続きから。

==== 今回は、大きく分けて二本立てです。

①キーボードからデータを取得する
②マウスを有効化する

さて、キーボードからデータを取得するときに、本文ではバッファとして
FIFOバッファを採用していましたが、明らかにキューと同じなので、
FIFO8構造体は勝手ながら、名前だけQUEUEとさせていただきました。



そうですねえ…今回は最近続いた苦労がウソみたいにあっという間に終わったし、
暇なのでsprintf(lsprintf)を少しだけ弄ってました。

int lsprintf(char *str, const char *fmt, ...) {
        int *arg = (int *)(&str + 2);        // 可変個引数の配列
        int cnt;                        // 生成した文字数
        int argc = 0;                // 引数の個数
        int i;                                // カウンタ
        char buf[20];                // 数値変換用バッファ
        const char *p = fmt;// コピー元フォーマットを走査する

        strcls(str);
        strcls(buf);        // バッファの初期化
        for(cnt = 0; *p != '\0'; p++) {
                switch(*p) {
                case '%':
                        // フォーマット指定子の場合は引数の数値を文字列へ変換
                        switch(p[1]) {
                                //case 'c': int2char(buf, arg[argc++]);        break;
                                case 'd': int2dec(buf, arg[argc++]);        break;
                                case 'x': int2hex(buf, arg[argc++], 0);        break;
                                case 'X': int2hex(buf, arg[argc++], 1);        break;
                                case 's': int2str(buf, arg[argc++]);        break;
                                //case 'f':
                        }
                        // 変換した数値を生成文字列にコピー
                        for(i = 0; buf[i] != '\0'; i++,cnt++) *str++ = buf[i];
                        p++;
                        break;

                case '\\':

                        break;

                default:
                        // フォーマット指定子以外はそのままコピー
                        *str++ = *p; cnt++;
                }        
        }
        return cnt;
}

といっても、追加したのはフォーマット指定子の%cと%sと%Xだけ。
…なのですが、全部追加すると文字列が表示できなくなりました。

eaa9a3a3.png

納得がいかないですが、しかたないので明らかに使用頻度の低い%cを無効化しました^^;
また今度原因究明をしていきます。

%xと%Xの区別は、int2hex関数に第3引数をつけて、それによって変換後の
アルファベットを大文字にするか小文字にするか決めているだけです。

%cでのint2char関数は、身も蓋もなくint型で受け取った引数をchar型にキャストしているだけです。

%sでのint2str関数は、strcpy関数そのままです。

よって、ほとんど何も苦労していません(笑)

%fを実装すると、上の指定子よりは大分頭を使いそうなので後回しにしました。
時間がないんだもん
float型にキャストしてint2dec関数を拡張すればいけますね、たぶん。



さて、これではあまりにも中身がないので、例によってスクリーンキャストを投下したいと思います。



なんだこの時間稼ぎ感…