引数 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;
}
返り値 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;
}