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が戻り値とまります。


処理の内容

ファイルパスの先頭にあるディレクトリ名・ファイル名の一文字まで読み取り位置を進める

while(*path == '/')
  path++;

引数pathで指定されたファイルパスにおける読み取り位置を1文字分(1バイト分)ずつ進めていき、“ / ”を読み取れなくなった時点で次の処理へ進みます。

読み取った文字データがヌル文字の場合はリターンする

if(*path == 0)
   return 0;

読み取った文字データがヌル文字の場合は、0を戻り値にしてリターンします。

ファイルパスの先頭にあるディレクトリ名・ファイル名のデータ長を求める

ディレクトリ名・ファイル名の1文字目まで読み取り位置(アドレス)を保存する

s = path;

ファイルパスの先頭にあるディレクトリ名・ファイル名の次にある"/"まで読み取り位置を進める

while(*path != '/' && *path != 0)
  path++;

ファイルパスにおける読み取り位置を1文字分(1バイト分)ずつ進めていき、“ / ”を読み取った時点、または、ヌル文字を読み取った時点で、次の処理へ進みます。

ディレクトリ名・ファイル名のデータ長を求める

len = path - s;

ディレクトリ名・ファイル名)の1文字目の読み取り位置sと現在の読み取り位置pathの差から、ディレクトリ名・ファイル名のデータ長を取得します。

ファイルパスの先頭にあるディレクトリ名・ファイル名を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バイト分)ずつ進めていき、“ / ”を読み取れなくなったら次へ進みます。

先頭のディレクトリ・ファイルを取り除いたファイルパスを戻り値としてリターンする

return path;

nameに格納したディレクトリ名・ファイル名を除いたファイルパス(先頭に/を含まない)の先頭アドレスを戻り値としてリターンします。