2011年8月24日星期三

ODbgScript源碼學習(四)

var& var::operator+=(const var& rhs) //重載+=,根據關鍵字類型vt來把rhs的類型賦給+=運算對象,返回自身指針
{
if(rhs.vt == DW) //如果是雙字節類型
*this+=rhs.dw; //自身指針+=運算為rhs.dw
else if(rhs.vt == FLT) //如果是FLT類型
*this+=rhs.flt; //自身指針+=運算為rhs.flt
else if(rhs.vt == STR) { //如果是字符串類型
//operator+=(const string& rhs) //操作符重載為字串類型
*this+=rhs.str; //自身指針+=運算為rhs.str
}
return *this;
}

var& var::operator+=(const string& rhs) //重載操作符,字符串類型賦值給對象,返回自身指針
{
string s; //定義字符串變量s
if(vt == STR) { //如果關鍵字var類型為STR
string s=rhs; //定義變量為rhs
if (UnquoteString(s,'#','#')) { //如果字符串未曾結束
if (!isbuf) { //如果沒有使用緩衝區,即緩衝區標誌為假
//String + buf Hex Buffer to String ok
size_t len=s.length()/2; //定義size_t類型長度為字串長度的一半
char* buf = (char*)malloc(len+1); //分配長度為字串長度一半加1長度的緩衝區
Str2Rgch(s,buf,len+1); //字串s轉換到Rgch類型,轉換目的緩衝區為前面分配的緩衝區,長度為字串長度的一半加1
s.assign(buf,len); //字串賦值緩衝區長度為len
str += s; //類的全局變量+=為s,str為str+s
size += len; //size為size+len
free(buf); //釋放緩衝區
} else { //如果已經使用緩衝區
// Buffer + Buffer
str = "#"+str.substr(1,str.length()-2)+s+"#"; //替換字串str開頭結尾為"#",在結束"#"前插入字串s
size += s.length()/2; //大小為原本大小加上s長度的一半
}
} else { //如果字符串已經結束
if (!isbuf) { //未使用緩衝區
//str + str
str += rhs; //全局字符串變量str為原str加上rhs
size += rhs.length(); //大小為原來大小加上rhs長度
} else { //如果使用緩衝區
//buf + str
string Hex; //定義字串hex
Str2Hex(s,Hex,s.length()); //s轉換類型到hex類型
str = "#"+str.substr(1,str.length()-2)+Hex+"#"; //截掉str開頭結尾字符,加上轉換后字串,新字串開頭結尾為"#"
size += s.length(); //大小為原大小加上字符串長度
}
}

} else if(vt == DW) { //如果關鍵字var是雙字節類型
var v=(string)rhs; //用這個var類定義變量v為字符產類型的rhs

char dwbuf[12]; //定義12個字節的char類型變量dwbuf
if (v.isbuf) { //類v的使用緩衝區標誌為真的話,即使用緩衝區
//ulong + BUFFER >> CONCATE HEX
s = strbuffhex(); //用函數strbuffhex截取掉開頭和結尾的"#"
sprintf(dwbuf, "%08X",dw); //打印到緩衝區
*this = "#"+((string)dwbuf)+s+"#"; /截掉dwbuf開頭結尾字符,加上新字串s,新字串開頭結尾為"#"
} else { //如果未曾使用緩衝區
//ulong + STRING >> CONCATE ultoa+str
s = strupr(ultoa(dw, dwbuf, 16)); //先把dwbuf從無符號長整型轉換為字符串,再把它轉換為大寫
*this = s+v.str; //自身指針為s加上類v的str全局變量
}
}

return *this; //返回自身指針
}

var& var::operator+=(const ulong& rhs) //重載操作符+=,ulong賦值給對象
{
if(vt == DW) //如果關鍵字類型為雙字節
dw += rhs; //dw為dw+rhs
else if(vt == FLT) //如果關鍵字類型為FLT
flt += rhs; //dw為flt+rhs
else if(vt == STR) { //如果關鍵字類型為字符串
string s;
char dwbuf[12]; //定義長度為12字節的char變量dwbuf
if (isbuf) { //如果使用了緩衝區
//Concate Num ulong to a buffer (4 octets)
s = strbuffhex(); //截去開頭結尾的"#"
sprintf(dwbuf, "%08X",rev(rhs)); //格式化輸出已反向雙字節的rhs
*this = "#"+s+dwbuf+"#"; //自身指針為字串s加上dwbuf,開頭結尾加上"#"
} else { //如果未使用緩衝區
//Add Number to a String添加數字到字符串
s = strupr(ultoa(rhs, dwbuf, 16)); //把無符號類型dwbuf轉換為16字節的字符串,再轉換我大寫
str += s; //str為str加上新的s
size += s.length(); //大小我s的長度
}
}
return *this; //返回自身指針
}

var& var::operator+=(const int& rhs) //重載操作符+=,int賦值給對象
{
if(vt == DW) //如果關鍵字var的類型為雙字節
dw += (ulong)rhs; //dw為dw加上轉換類型後的rhs
else if(vt == FLT) //如果關鍵字var的類型為FLT
flt += rhs; //flt為dw加上rhs
else if(vt == STR) //如果關鍵字var的類型為字符串
*this+=(ulong) rhs; //自身指針為自身指針加上轉換類型後的rhs

return *this; //返回自身指針
}

var& var::operator+=(const long double& rhs) //重載操作符+=,long double賦值給變量
{
if(vt == FLT) //如果vt類型我FLT
flt += (long double)rhs; //flt為flt加上轉換類型後的rhs
return *this; //返回自身指針
}


没有评论:

发表评论