fc2ブログ

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

プロフィール 

高木信尚

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

今回から数回にわたって、<ctype.h>の中で宣言される関数の具体的な実装についてお話します。まずは、英数字の判別を行う関数群です。この中には、isalnum, isalpha, isdigit, islower, isupper, およびisxdigit関数が含まれます。

まず、効率を考えて、これらの関数はヘッダ内でインライン関数として実装することを考えます。このとき、C99ではinlineがサポートされますが、C89等での使用も考慮に入れ、GNU拡張である__inline__キーワードを使用することにします。これは、localeconv関数の実装でも利用した方法です。

static __inline__ int isalnum(int c)
{
  return __ctype[c] & (_LOWER|_UPPER|_DIGIT);
}

このように、前回定義した_LOWER等を用いて、表中の値のビットパターンを調べることで文字種別の判別を行います。is~系関数は、真のときには非0を返せばよいので、必ずしも1ではない値が返却値になりますが、これに関しては問題ないでしょう。

以下、同様に、

static __inline__ int isalpha(int c)
{
  return __ctype[c] & (_LOWER|_UPPER);
}
static __inline__ int isdigit(int c)
{
  return __ctype[c] & _DIGIT;
}
static __inline__ int islower(int c)
{
  return __ctype[c] & _LOWER;
}
static __inline__ int isupper(int c)
{
  return __ctype[c] & _UPPER;
}
static __inline__ int isxdigit(int c)
{
  return __ctype[c] & _XDIGIT;
}

のように記述することが可能です。

さて、インライン関数に関してはこれでよいのですが、<ctype.h>をインクルードせず、ユーザーが自分で関数原型を記述して、これらの関数を呼び出した場合でも正しく動作する必要があります。これを実現するには、インライン関数と同等の定義を外部関数として行う必要があります。

ライブラリが提供する外部関数は、極力、一関数につき一翻訳単位とする方が望ましいでしょう。アプリケーションであれば、これらの関連性のある関数は、一つのソースコードに列記したくなるところですが、ライブラリでそのようなことをすると、不必要な関数までリンクされる結果となり、空間効率が悪くなります。
2006/02/08 00:54|文字種別TB:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/23-657c288e

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

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

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.