C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

高木信尚

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧

 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:--|スポンサー広告

 

今回からホスト環境用のライブラリの実装に入ります。ホスト環境用といっても、最初はやはり地味なライブラリ要素が続きます。今回はエラー番号のためのマクロを定義する<errno.h>の実装です。

標準規格で、<errno.h>の中で定義することを要求されているマクロは四つです。すなわち、errno、EDOM、ERANGE、およびEILSEQです。このうち、errnoを除く三つはエラーの状態を表す正の整数値に定義します。値は勝手に決めてもよいのですが、一応Cygwinに合わせて

#define EDOM   33
#define ERANGE 34
#define EILSEQ 138

としておきます。

さて、肝心のerrnoですが、最も簡単な実装は、int型の外部変数にすることです。シングルタスクの環境であればこれで十分ですが、マルチタスクの場合にはいろいろ厄介な問題がついて回ります。

errno以外にも、strtokやasctimeなど、静的変数をアプリケーションに参照させるタイプのものは、排他制御だけではマルチタスク対応になりません。タスクごとに、それぞれ異なる記憶域を設けて、実行中のタスクに応じた記憶域を参照させなければならないからです。

タスクに対して局所的な記憶域の扱いは、後ほどまとめて対応することにし、とりあえず現時点では最小限の実装にとどめておきます。ただし、ヘッダ自体はこれでフィックスしたいので、errnoの実体を関数呼び出しにしておきます。

#ifdef __cplusplus
extern "C"
#endif
int *__errno(void);

#define errno (*__errno())

関数__errnoの定義は、現段階では

int *__errno(void)
{
  static int e;
  return &e;
}

とするにとどめておきます。
スポンサーサイト
2006/01/30 01:22|プログラム診断TB:0CM:0

ホーム 全記事一覧

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。