今天接著分析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 函...