fs.c static char* skipelem(char *path, char *name)
トップページ
jupiteroak.hatenablog.com
fs.c
https://github.com/mit-pdos/xv6-public/blob/master/fs.c#L595
static char* skipelem(char *path, char *name) { char *s; int len; while(*path == '/') path++; if(*path == 0) return 0; s = path; while(*path != '/' && *path != 0) path++; len = path - s; if(len >= DIRSIZ) memmove(name, s, DIRSIZ); else { memmove(name, s, len); name[len] = 0; } while(*path == '/') path++; return path;
skipelem関数は、引数pathで指定されたファイルパスの先頭にあるディレクトリ名(またはファイル名)を、アドレスnameで指定されたメモリ領域に格納します。
引数 char *path
ファイルパスが保存されているメモリ領域の先頭アドレスです。
引数 char *name
ディレクトリ名(またはファイル名)を保存するメモリ領域の先頭アドレスです。
戻り値 char *path または 0
nameが指定するメモリ領域に格納されたディレクトリ名(またはファイル名)を除いたファイルパス(先頭に/を含まない)が戻り値となります。
pathが指定するファイルパスにディレクトリ名(またはファイル名)が含まれていない場合は、0が戻り値とまります。
処理の内容
- ファイルパスの先頭にあるディレクトリ名・ファイル名の一文字まで読み取り位置を進める
- 読み取った文字データがヌル文字の場合はリターンする
- ファイルパスの先頭にあるディレクトリ名・ファイル名のデータ長を求める
- ファイルパスの先頭にあるディレクトリ名・ファイル名をnameが指定するメモリ領域に保存する
- ファイルパスにおいて2番目のディレクトリ名・ファイル名の最初の一文字まで読み取り位置を進める
- 先頭のディレクトリ・ファイルを取り除いたファイルパスを戻り値としてリターンする
ファイルパスの先頭にあるディレクトリ名・ファイル名の一文字まで読み取り位置を進める
while(*path == '/') path++;
引数pathで指定されたファイルパスにおける読み取り位置を1文字分(1バイト分)ずつ進めていき、“ / ”を読み取れなくなった時点で次の処理へ進みます。
読み取った文字データがヌル文字の場合はリターンする
if(*path == 0) return 0;
読み取った文字データがヌル文字の場合は、0を戻り値にしてリターンします。
ファイルパスの先頭にあるディレクトリ名・ファイル名のデータ長を求める
ディレクトリ名・ファイル名の1文字目まで読み取り位置(アドレス)を保存する
s = path;
ファイルパスの先頭にあるディレクトリ名・ファイル名の次にある"/"まで読み取り位置を進める
while(*path != '/' && *path != 0) path++;
ファイルパスにおける読み取り位置を1文字分(1バイト分)ずつ進めていき、“ / ”を読み取った時点、または、ヌル文字を読み取った時点で、次の処理へ進みます。
ファイルパスの先頭にあるディレクトリ名・ファイル名をnameが指定するメモリ領域に保存する
if(len >= DIRSIZ) memmove(name, s, DIRSIZ); else { memmove(name, s, len); name[len] = 0; }
len >= DIRSIZ が真となる場合→ディレクトリ名・ファイル名の長さがDIRSIZ以上の場合は、ディレクトリ名・ファイル名のうち14文字(14バイト分)だけを読み取って、引数nameが指定するメモリ領域に格納します。
len >= DIRSIZ が偽となる場合→ディレクトリ名・ファイル名の長さがDIRSIZ未満の場合は、ディレクトリ名・ファイル名をそのまま読み取って、引数nameが指定するメモリ領域に格納します。
ファイルパスにおいて2番目のディレクトリ名・ファイル名の最初の一文字まで読み取り位置を進める
while(*path == '/') path++;
ファイルパスにおける読み取り位置を1文字分(1バイト分)ずつ進めていき、“ / ”を読み取れなくなったら次へ進みます。