「basename()」の編集履歴(バックアップ)一覧はこちら
「basename()」(2005/10/31 (月) 15:14:07) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
引数 char* name<br>
<br>
返り値 char*<br>
<br>
<br>
<br>
static char base[IM_NAME_MAX];<br>
char *p, *bp= base;<br>
<br>
if ((p= strchr(name, ':')) != nil) {<br>
while (name <= p && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *name++;<br>
}<br>
}<br>
<br>
↑"base" に "name"の':'までの左側をコピー?<br>
<br>
<br>
for (;;) {<br>
if ((p= strrchr(name, '/')) == nil) {<br>
p= name;<br>
break;<br>
}<br>
if (*++p != 0) break;<br>
*--p= 0;<br>
}<br>
'/'が見つかったらその左側を"p"が指す。なければ何もしない<br>
<br>
<br>
while (*p != 0 && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *p++;<br>
}<br>
<br>
'/'が見つかったらその左がわを"base"にコピーする<br>
つまり':' から
'/'までを取り除いたものをbaseにに格納する。<br>
'/'がなければ何もしない。<br>
<br>
<br>
<br>
*bp= 0;<br>
return base;<br>
}<br>
<br>
語尾に'0'を付与して"base"返す。<br>
<br>
この関数は<br>
static char base[IM_NAME_MAX];<br>
を返す。staticなので普通のローカル変数と違って安心なはず。<br>
<br>
<br>
以下全文<br>
<br>
char *basename(char *name)<br>
/* Return the last component of name, stripping trailing slashes from name.<br>
* Precondition: name != "/". If name is prefixed by a label, then the<br>
* label is copied to the basename too.<br>
*/<br>
{<br>
static char base[IM_NAME_MAX];<br>
char *p, *bp= base;<br>
<br>
if ((p= strchr(name, ':')) != nil) {<br>
while (name <= p && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *name++;<br>
}<br>
}<br>
for (;;) {<br>
if ((p= strrchr(name, '/')) == nil) {<br>
p= name;<br>
break;<br>
}<br>
if (*++p != 0) break;<br>
*--p= 0;<br>
}<br>
while (*p != 0 && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *p++;<br>
}<br>
*bp= 0;<br>
return base;<br>
}<br>
<br>
<br>
<br>
表示オプション
横に並べて表示:
変化行の前後のみ表示: