ruby049 string c原始碼分析2

2021-10-24 18:56:50 字數 2221 閱讀 3931

今天接著分析ruby049中string.c這個源程式,剛才忽然想,如果我教學生學軟體,我想,應該把ruby049的原始碼當成作業,讓學生課餘學著去讀原始碼,並進行交流。

我現在才開始讀原始碼,是不是太晚了些。

不多想了,開始正題。

static char

str_next(s)

char *s;

/* small alphabets */

else if ('a' <= c && c < 'z') (*s)++;

else if (c == 'z')

/* capital alphabets */

else if ('a' <= c && c < 'z') (*s)++;

else if (c == 'z')

return 0;

}這個函式很有意思,因為只有字母數字才有下一字元的說法。所以作者有很長的else if條件,注意對數字0,1,2,3,4,5,6,7,8是直接把數字變大,而對9呢,則變成10,此時,乙個字元只能放乙個,為此,把進製1放到return中返回。

static value

fstr_next(orig)

struct rstring *orig;

if (s < sbeg && c != -1)

gc_unlink;

return (value)str;

}這個函式使用了上面的函式,分析起來很有意思的。

例如對"abc".next進行計算,關鍵的處理在迴圈中:

while (sbeg <= s)

因為我們是從後向前遞增,所以s指向字串末尾。

s指向'c',sbeg是字串開頭,指向'a',所以進入迴圈體

'c'+1後變為'd',沒有進製。所以此時,執行break跳出迴圈體。

所以"abc"的後繼為"abd"

這是第一種情況。

下面再分析第二種情況:

對"abz"計算next,此時s指向'z',進入迴圈體:

while (sbeg <= s)

'z'='z'+1,才生進製,所以'z'變為'a'有進製為'a'

因此不執行break,s--,此時,s指向'b',同樣,再對'b'+1,則為'c',因為沒有進製,則執行break.

最終"abz"後繼為"aca"

這是第二種情況。

還有第三種情況。

計算"zz"的後繼。

while (sbeg <= s)

經過這個迴圈體後,變為"aa",因為slen+1));

str2->ptr[0] = c;

memmove(str2->ptr+1, str->ptr, str->len);

obj_free(str);

str = str2;

}此時,需要處理最終的進製。為此需要把字串擴大乙個位元組,"aa"變為" aa",再把進製加進來,則變為"aaa"

看起來,是不是很爽。matz寫程式很厲害吧。比我厲害。

static value

fstr_rindex(str, args)

struct rstring *str;

value args

這個函式沒看懂。不知道他的演算法,而且有些心理障礙。究竟如何實現的呢?下次再看。

static void

str_replace(str, beg, len, val)

struct rstring *str, *val;

int beg, len;

memmove(str->ptr+beg+val->len, str->ptr+beg+len, str->len-(beg+len));

memmove(str->ptr+beg, val->ptr, val->len);

str->len += val->len - len;

str->ptr[str->len] = '\0';

}這個函式沒有執行成功,報錯了。但我沒看懂。我的理解是如果:

s="012345"

s.replace(2,3,"abcd")應該變成"01abcd5",因此,如何挪動呢?

012345

0123455 對應操作:memmove(str->ptr+beg+val->len, str->ptr+beg+len, str->len-(beg+len));

012abc5 對應操作:memmove(str->ptr+beg, val->ptr, val->len);

但沒有弄懂。我的理解是,對庫函式不熟悉。

ruby 0 49原始碼分析

今天想想,讀讀ruby0.49的原始碼。用c寫東西,那是太慢了。真要幹活,還是用perl或者ruby.現在時間充足,就相看看ruby0.49。收到了王亞剛寫的gcc原始碼分析的書,他的版本太高,感覺還是讀最古老的版本較划算。量太大了,這何年何月才能看完呢。wget tar zxvf ruby 0.4...

ruby0 49 regex c原始碼分析

ruby0.49 regex.c原始碼分析 網上買個日本人的二手顯示器,保護眼睛吧。安裝好顯示器就開始讀原始碼。看regex.c,因為可以單獨進行測試,先加上幾句 define test 1 include include 進行編譯時,報錯,說xmalloc,xrealloc等函式找不到,網上也找不...

ruby0 49原始碼分析 array c

ruby0.49原始碼分析 array.c 今天讀ruby0.49,感覺讀 的速度越來越快了。大腦好象開竅了。先讀makefile,根據基編譯順序,從下向上讀。在array.c的上面定義了若干函式,在末尾把函式進行註冊。檔案末尾 有init string 函式 用rb define method 函...