2011年8月23日星期二

ODbgScript源碼學習(二)

var.h的代碼

#pragma once //避免頭文件被多次定義

using namespace std; //使用std命名空間

enum vtype { EMP, DW, STR, FLT }; //定義枚舉變量類型vtype

typedef unsigned long ulong; //定義類型ulong

class var //var類
{
public:
ulong dw;
string str;
long double flt;
vtype vt; //var關鍵字定義的變量的類型
bool isbuf; //緩衝區標誌
int size; //大小

//使用函數重載定義關鍵字var跟著不同類型
var();
var(const var& rhs);
var(string& rhs);
var(ulong rhs);
var(int rhs);
var(long double rhs);

// less than zero this < rhs
// zero this == rhs
// greater than zero this > rhs
int compare(const var& rhs) const;
int compare(const string& rhs) const;
int compare(const ulong& rhs) const;
int compare(const int& rhs) const;
int compare(const long double& rhs) const;

string strclean(void); //字符串清除
string strbuffhex(void); //字符串緩衝區hex
string strbuff(void); //字符串緩衝區

//var的參數重載,使得參數為不同類型
var& operator=(const var& rhs);
var& operator=(const string& rhs);
var& operator=(const ulong& rhs);
var& operator=(const int& rhs);
var& operator=(unsigned short& rhs);
var& operator=(unsigned char& rhs);
var& operator=(const long double& rhs);

//var的參數重載,使得參數為不同類型
var& operator+=(const var& rhs);
var& operator+=(const string& rhs);
var& operator+=(const ulong& rhs);
var& operator+=(const int& rhs);
var& operator+=(const long double& rhs);

void resize(ulong newsize); //重設大小

};

var.cpp代碼

#include "StdAfx.h"
#include "var.h"

var::var()
{
vt = EMP; //枚舉變量vt賦值為枚舉變量中的EMP
dw = 0; //dw初始值為0
flt = 0; //雙精度長整型flt初始值為0
str = ""; //字符串為空
size = 0; //大小初始值為0
isbuf = false; //isbuf初始值為false
}

var::var(const var& rhs) //參數類型rhs為var類的地址
{
vt = rhs.vt; //把rhs的vt賦值給vt
dw = rhs.dw;
flt = rhs.flt;
str = rhs.str;
size = rhs.size;
isbuf = rhs.isbuf;
}

var::var(string& rhs) //rhs為字符串的&
{
vt = STR; //腳本中,var關鍵字后定義變量類型為STR
dw = 0;
flt = 0;
str = rhs; //字符串初始變量為參數rhs,即腳本中var變量后的字符串
string s=rhs;
if (UnquoteString(s,'#','#')) { //使用幫助函數(HelperFunctions中)結束字符串,如果S未曾結束
size = s.length()/2; //大小為字符串s長度的一半
int (*pf)(int) = toupper; //轉換大小寫
transform(str.begin(), str.end(), str.begin(), pf); //遍歷容器元素,起始為str.begin(),結束為str.end(),str.begin()寫入目標起始地址,執行pf操作
isbuf = true; //緩衝區使用為真
} else {
size = rhs.length(); //否則大小為rhs.length()
isbuf = false; //緩衝區使用為假
}
}


没有评论:

发表评论