|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|

basename()

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

引数 char* name

返り値 char*



  static char base[IM_NAME_MAX];
  char *p, *bp= base;

  if ((p= strchr(name, ':')) != nil) {
    while (name <= p && bp < base + IM_NAME_MAX - 1) {
      *bp++ = *name++;
    }
  }

↑"base" に "name"の':'までの左側をコピー?


  for (;;) {
    if ((p= strrchr(name, '/')) == nil) {
      p= name;
      break;
    }
    if (*++p != 0) break;
    *--p= 0;
  }
'/'が見つかったらその左側を"p"が指す。なければ何もしない


  while (*p != 0 && bp < base + IM_NAME_MAX - 1) {
    *bp++ = *p++;
  }

'/'が見つかったらその左がわを"base"にコピーする
つまり':' から '/'までを取り除いたものをbaseにに格納する。
'/'がなければ何もしない。



  *bp= 0;
  return base;
}

語尾に'0'を付与して"base"返す。

この関数は
  static char base[IM_NAME_MAX];
を返す。staticなので普通のローカル変数と違って安心なはず。


以下全文

char *basename(char *name)
/* Return the last component of name, stripping trailing slashes from name.
* Precondition: name != "/". If name is prefixed by a label, then the
* label is copied to the basename too.
*/
{
  static char base[IM_NAME_MAX];
  char *p, *bp= base;

  if ((p= strchr(name, ':')) != nil) {
    while (name <= p && bp < base + IM_NAME_MAX - 1) {
      *bp++ = *name++;
    }
  }
  for (;;) {
    if ((p= strrchr(name, '/')) == nil) {
      p= name;
      break;
    }
    if (*++p != 0) break;
    *--p= 0;
  }
  while (*p != 0 && bp < base + IM_NAME_MAX - 1) {
    *bp++ = *p++;
  }
  *bp= 0;
  return base;
}