string.c int strncmp(const char *p, const char *q, uint n)

トップページ
jupiteroak.hatenablog.com


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

int strncmp(const char *p, const char *q, uint n)
{
  while(n > 0 && *p && *p == *q)
    n--, p++, q++;
  if(n == 0)
    return 0;
  return (uchar)*p - (uchar)*q;
}

strncmp関数は、引数pで指定されたアドレス以降に配置されている文字列と引数qで指定されたアドレス以降に配置されている文字列について、それぞれ先頭からnバイト分の文字列を比較します。

引数 const char *p
比較対象となる文字列が格納されているメモリ領域の先頭アドレスです。

引数 const char *q
比較対象となる文字列が格納されているメモリ領域の先頭アドレスです。

引数 uint n
比較対象となる文字列のデータサイズ(バイト単位)です。

戻り値
比較された各文字列が同じ場合は、0が戻り値となります。
比較された各文字列が異なる場合は、異なる文字データ同士における文字コードの差が戻り値となります。

処理の内容

各文字列を先頭から順に1バイトずつ比較する

while(n > 0 && *p && *p == *q)
    n--, p++, q++;

引数pで指定されたアドレス以降に配置されている文字列 と 引数qで指定されたアドレス以降に配置されている文字列について、それぞれ先頭から順に1バイトずつ文字データを比較します。
n > 0 && *p && *p == *q が偽となる場合→①引数nで指定したデータサイズ分の比較を最後まで行えた、または、②*pの値がヌル文字だった、または、③*p の文字データと *qの文字データが異なる場合は、ループを脱出して次の処理へ進みます。

比較された各文字列が同じ場合

if(n == 0)
    return 0;

比較された各文字列が同じ場合→引数nで指定したデータサイズ分の比較を最後まで行えた場合は、0を戻り値としてリターンします。

比較された各文字列が異なる場合

return (uchar)*p - (uchar)*q;

比較された各文字列が異なる場合は、異なる文字データ同士における文字コードの差を戻り値としてリターンします。