string.c int memcmp(const void *v1, const void *v2, uint n)

トップページ
jupiteroak.hatenablog.com


string.c
https://github.com/mit-pdos/xv6-public/blob/master/string.c#L15

int memcmp(const void *v1, const void *v2, uint n)
{
  const uchar *s1, *s2;

  s1 = v1;
  s2 = v2;
  while(n-- > 0){
    if(*s1 != *s2)
      return *s1 - *s2;
    s1++, s2++;
  }

  return 0;
}

memcmp関数は、先頭アドレスが引数v1・サイズが引数nのメモリ領域と先頭アドレスが引数v2・サイズが引数nのメモリ領域において、それぞれのメモリ領域に格納されている値が同じであるかどうかを調べます。

引数 v1
比較対象となる1つ目のメモリ領域の先頭アドレスです。

引数 v2
比較対象となる2つ目のメモリ領域の先頭アドレスです。

引数 b
メモリ領域のサイズ(バイト単位)です。

戻り値
2つのメモリ領域にそれぞれ格納されている値が同じ場合は、0が戻り値となります。
2つのメモリ領域にそれぞれ格納されている値が異なる場合は、異なる値(1バイト)どうしの差が戻り値となります。


処理の内容

各メモリ領域の先頭アドレスをポインタs1とポインタs2に代入する

const uchar *s1, *s2;
s1 = v1;
s2 = v2;

引数nで指定された回数分*s1の値と*s2の値を比較する

while(n-- > 0){
    ..

while文を用いて、引数nで指定された回数分*s1の値(1バイト)と*s2の値(1バイト)を比較するようにします。

∗s1の値と∗s2の値が異なる場合

 if(*s1 != *s2)
      return *s1 - *s2;

∗s1の値と∗s2の値が異なる場合は、異なる値どうしの差を戻り値としてリターンします。

s1が指定するアドレスとs2が指定するアドレスをそれぞれ1バイト進める

 s1++, s2++;

∗s1の値と∗s2の値が同じだった場合は、s1が指定するアドレスとs2が指定するアドレスをそれぞれ1バイト進め、比較を続けます。