调整与添加
调整了配置文件的读取方式,为数据库的加入铺平道路。
This commit is contained in:
parent
dbaa0fc064
commit
1265216866
173
include/cproj.h
173
include/cproj.h
@ -24,6 +24,27 @@ struct check_table_column{
|
|||||||
int pk;
|
int pk;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct setting_file_register{
|
||||||
|
vector<string> block_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stn_register{
|
||||||
|
vector<string> stn_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct setting_file_read{
|
||||||
|
string key;
|
||||||
|
string name;
|
||||||
|
string sentence;
|
||||||
|
bool if_blk;
|
||||||
|
vector<setting_file_read *> childs;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stn_read{
|
||||||
|
string key;
|
||||||
|
string value;
|
||||||
|
};
|
||||||
|
|
||||||
//配置文件通用方法类
|
//配置文件通用方法类
|
||||||
class setting_file{
|
class setting_file{
|
||||||
protected:
|
protected:
|
||||||
@ -38,6 +59,13 @@ protected:
|
|||||||
if(isalnum(c) || c == '_') return true;
|
if(isalnum(c) || c == '_') return true;
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
// 检查名字是否合法
|
||||||
|
bool if_name_illegal(string str){
|
||||||
|
for(auto c:str){
|
||||||
|
if(!if_illegal(c)) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// 寻找保留字
|
// 寻找保留字
|
||||||
bool search_key(ifstream &ifsfile,string key){
|
bool search_key(ifstream &ifsfile,string key){
|
||||||
string line;
|
string line;
|
||||||
@ -63,18 +91,133 @@ protected:
|
|||||||
return arg.substr(1,arg.size()-2);
|
return arg.substr(1,arg.size()-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int read_file(string path, Byte *buff){
|
int read_file(string path, Byte *buff, uint64_t size){
|
||||||
ifstream ifsf(path.data(),std::ios::binary);
|
ifstream ifsf(path.data(),std::ios::binary);
|
||||||
char tmp[512] = {0}, *idx = buff;
|
char tmp[512] = {0}, *idx = buff;
|
||||||
while (!ifsf.eof()) {
|
uint64_t idx_count = 0;
|
||||||
memset(tmp, 0, 512);
|
while (!ifsf.eof() && idx_count < size) {
|
||||||
ifsf.read(tmp, 512);
|
if(size < 512){
|
||||||
memcpy(idx, tmp, 512);
|
memset(tmp, 0, size);
|
||||||
idx += 512;
|
ifsf.read(tmp, size);
|
||||||
|
memcpy(idx, tmp, size);
|
||||||
|
idx_count += size;
|
||||||
|
}
|
||||||
|
else if (size > 512){
|
||||||
|
if(size - idx_count >= 512){
|
||||||
|
memset(tmp, 0, 512);
|
||||||
|
ifsf.read(tmp, 512);
|
||||||
|
memcpy(idx, tmp, 512);
|
||||||
|
idx_count += 512;
|
||||||
|
idx += 512;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
memset(tmp, 0, size-idx_count);
|
||||||
|
ifsf.read(tmp, size-idx_count);
|
||||||
|
memcpy(idx, tmp, size-idx_count);
|
||||||
|
idx_count += size-idx_count;
|
||||||
|
idx += size-idx_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ifsf.close();
|
ifsf.close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 消去配置文件中的所有的空字符
|
||||||
|
void read_settings(string path, string &tstr){
|
||||||
|
struct stat tstat;
|
||||||
|
stat(path.data(), &tstat);
|
||||||
|
Byte *fbs = (Byte *)malloc(tstat.st_size);
|
||||||
|
read_file(path, fbs,tstat.st_size);
|
||||||
|
for(off_t i = 0; i < tstat.st_size; i++){
|
||||||
|
if(isgraph(fbs[i])) tstr += fbs[i];
|
||||||
|
}
|
||||||
|
free(fbs);
|
||||||
|
}
|
||||||
|
// 读取关键字及代码块
|
||||||
|
void read_blocks(string str, setting_file_register &tsfr, vector<setting_file_read *> *blocks){
|
||||||
|
string tstr = str;
|
||||||
|
string::size_type curs_idx = 0;
|
||||||
|
while (tstr.size()) {
|
||||||
|
// 寻找语句或代码块
|
||||||
|
string::size_type sem_idx = tstr.find(";",curs_idx);
|
||||||
|
// 如果没找到分号则读完
|
||||||
|
if(sem_idx == string::npos) break;
|
||||||
|
string tmpstr = tstr.substr(curs_idx,sem_idx-curs_idx);
|
||||||
|
string::size_type blq_idx = tmpstr.find("{",curs_idx),brq_idx = string::npos;
|
||||||
|
bool if_blk = true;
|
||||||
|
string pcsstr;
|
||||||
|
// 如果是语句
|
||||||
|
if(blq_idx == string::npos){
|
||||||
|
brq_idx = tstr.find(";",curs_idx);
|
||||||
|
pcsstr = tstr.substr(curs_idx,brq_idx);
|
||||||
|
if_blk = false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
int blk_stack = 1;
|
||||||
|
for(auto c : tstr){
|
||||||
|
pcsstr.push_back(c);
|
||||||
|
if(c == '{') blk_stack++;
|
||||||
|
else if(c == '}'){
|
||||||
|
blk_stack--;
|
||||||
|
if(blk_stack == 1) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
brq_idx = pcsstr.rfind('}') + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setting_file_read *ptsfbr = new setting_file_read();
|
||||||
|
// 记录是语句还是信息块
|
||||||
|
ptsfbr->if_blk = if_blk;
|
||||||
|
// 如果是信息块
|
||||||
|
if(if_blk){
|
||||||
|
string head = pcsstr.substr(0,blq_idx);
|
||||||
|
string keystr, namestr;
|
||||||
|
string::size_type key_idx;
|
||||||
|
|
||||||
|
// 检查关键字
|
||||||
|
for(auto key:tsfr.block_keys){
|
||||||
|
if((key_idx = head.find(key)) != string::npos){
|
||||||
|
keystr = pcsstr.substr(0,key.size());
|
||||||
|
namestr = pcsstr.substr(key.size(),blq_idx-key.size());
|
||||||
|
if(!if_name_illegal(namestr)){
|
||||||
|
throw "block name is illegal";
|
||||||
|
}
|
||||||
|
ptsfbr->key = keystr;
|
||||||
|
ptsfbr->name = namestr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ptsfbr->key.empty()) throw "unknown block key";
|
||||||
|
blocks->push_back(ptsfbr);
|
||||||
|
string inblkstr = pcsstr.substr(blq_idx+1,brq_idx-blq_idx-2);
|
||||||
|
read_blocks(inblkstr, tsfr, &blocks->back()->childs);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// 记录语句
|
||||||
|
ptsfbr->sentence = pcsstr;
|
||||||
|
blocks->push_back(ptsfbr);
|
||||||
|
}
|
||||||
|
|
||||||
|
curs_idx = brq_idx+1;
|
||||||
|
tstr = tstr.substr(curs_idx,tstr.size()-curs_idx);
|
||||||
|
curs_idx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int read_stn(string stn_str, stn_register &tsr,stn_read *stn){
|
||||||
|
string::size_type key_idx = string::npos;
|
||||||
|
stn->key.clear();
|
||||||
|
stn->value.clear();
|
||||||
|
for(auto key:tsr.stn_keys){
|
||||||
|
if((key_idx = stn_str.find(key)) != string::npos){
|
||||||
|
stn->key = key;
|
||||||
|
stn->value = stn_str.substr(key.size(),stn_str.size()-key.size());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(stn->key.empty()) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -102,9 +245,17 @@ class Cpt:public setting_file{
|
|||||||
vector<cpt_func_args> deal_args(string args);
|
vector<cpt_func_args> deal_args(string args);
|
||||||
// 处理参数
|
// 处理参数
|
||||||
cpt_func_args deal_arg(string arg);
|
cpt_func_args deal_arg(string arg);
|
||||||
|
// 配置文件文件解析结构
|
||||||
|
vector<setting_file_read *> blocks;
|
||||||
|
// 文件数据
|
||||||
|
string content;
|
||||||
|
// 处理文件数据
|
||||||
|
void deal_content(string data_content);
|
||||||
public:
|
public:
|
||||||
// 构造函数
|
// 构造函数
|
||||||
Cpt(string path, string proj_name);
|
Cpt(string path, string proj_name);
|
||||||
|
// 数据库数据直接构造函数
|
||||||
|
Cpt(string data_content, int if_db, string proj_name);
|
||||||
};
|
};
|
||||||
|
|
||||||
//map文件管理类
|
//map文件管理类
|
||||||
@ -123,6 +274,8 @@ class Proj:public setting_file{
|
|||||||
string name;
|
string name;
|
||||||
// 计算工程读入流
|
// 计算工程读入流
|
||||||
ifstream ifsproj;
|
ifstream ifsproj;
|
||||||
|
// 工程文件内容
|
||||||
|
string content;
|
||||||
// 源文件所在的目录
|
// 源文件所在的目录
|
||||||
vector<string> src_paths;
|
vector<string> src_paths;
|
||||||
// 源文件搜索目录下的所有源文件
|
// 源文件搜索目录下的所有源文件
|
||||||
@ -149,6 +302,8 @@ class Proj:public setting_file{
|
|||||||
sqlite3 *psql;
|
sqlite3 *psql;
|
||||||
// 数据库文件路径
|
// 数据库文件路径
|
||||||
string db_path;
|
string db_path;
|
||||||
|
// 配置文件文件解析结构
|
||||||
|
vector<setting_file_read *> blocks;
|
||||||
|
|
||||||
// 处理描述文件的命令
|
// 处理描述文件的命令
|
||||||
void deal_order(string tag, string arg);
|
void deal_order(string tag, string arg);
|
||||||
@ -182,9 +337,13 @@ class Proj:public setting_file{
|
|||||||
void check_database(void);
|
void check_database(void);
|
||||||
// 检查数据库表
|
// 检查数据库表
|
||||||
void check_table(int cnum, vector<check_table_column> tctc,sqlite3_stmt *psqlsmt);
|
void check_table(int cnum, vector<check_table_column> tctc,sqlite3_stmt *psqlsmt);
|
||||||
|
// 解析数据
|
||||||
|
void deal_content(string data_content);
|
||||||
public:
|
public:
|
||||||
// 读取Proj文件
|
// 读取Proj文件
|
||||||
Proj(string t_projpath, string t_projfile);
|
Proj(string t_projpath, string t_projfile);
|
||||||
|
// 接受数据库数据
|
||||||
|
Proj(string data_content);
|
||||||
// 检查目录以及描述文件是否存在
|
// 检查目录以及描述文件是否存在
|
||||||
void GeneralCheckInfo(void);
|
void GeneralCheckInfo(void);
|
||||||
// 搜寻源文件搜索目录并读取Cpt文件
|
// 搜寻源文件搜索目录并读取Cpt文件
|
||||||
@ -203,6 +362,8 @@ public:
|
|||||||
string GetName(void);
|
string GetName(void);
|
||||||
// 更新工程
|
// 更新工程
|
||||||
void UpdateProcess(void);
|
void UpdateProcess(void);
|
||||||
|
// 获得数据库
|
||||||
|
void AttachDatabases(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* cproj_h */
|
#endif /* cproj_h */
|
||||||
|
@ -47,6 +47,7 @@ using std::list;
|
|||||||
using std::ifstream;
|
using std::ifstream;
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
using std::stringstream;
|
||||||
|
|
||||||
typedef char Byte;
|
typedef char Byte;
|
||||||
|
|
||||||
|
@ -12,110 +12,89 @@ Cpt::Cpt(string path, string proj_name){
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Reading Cpt File %s\n[*]Require Project Name %s\n",path.data(),proj_name.data());
|
printf("Reading Cpt File %s\n[*]Require Project Name %s\n",path.data(),proj_name.data());
|
||||||
#endif
|
#endif
|
||||||
ifscpt.open(path);
|
string tifscpt;
|
||||||
string line;
|
read_settings(path, tifscpt);
|
||||||
if(search_key(ifscpt, "cparts")){
|
name = proj_name;
|
||||||
// 读取下一段信息
|
deal_content(tifscpt);
|
||||||
ifscpt>>line;
|
|
||||||
// 大括号位置
|
|
||||||
string::size_type qb_idx = line.find("{");
|
|
||||||
// 寻找任务工程名
|
|
||||||
string t_name;
|
|
||||||
if(qb_idx == string::npos) t_name = line;
|
|
||||||
else t_name = line.substr(0,qb_idx);
|
|
||||||
// 检查工程名是否含有非法字符
|
|
||||||
for(auto c:t_name){
|
|
||||||
if(if_illegal(c));
|
|
||||||
else throw "project's name has illegal char";
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Project Name %s\n",t_name.data());
|
|
||||||
#endif
|
|
||||||
// 检查工程名
|
|
||||||
if(t_name == proj_name) name = t_name;
|
|
||||||
else throw "project's name confilct";
|
|
||||||
// 寻找左大括号
|
|
||||||
if(qb_idx == string::npos){
|
|
||||||
ifscpt>>line;
|
|
||||||
if((qb_idx = line.find("{")) == string::npos) throw "syntax error";
|
|
||||||
}
|
|
||||||
// 源文件描述遍历
|
|
||||||
while(search_key(ifscpt, "srcfile")){
|
|
||||||
ifscpt>>line;
|
|
||||||
// 大括号位置
|
|
||||||
string::size_type qb_idx = line.find("{");
|
|
||||||
// 寻找源文件名
|
|
||||||
string tsrc_name;
|
|
||||||
if(qb_idx == string::npos) tsrc_name = line;
|
|
||||||
else tsrc_name = line.substr(0,qb_idx);
|
|
||||||
tsrc_name = tsrc_name.substr(1,tsrc_name.size()-2);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Source File Name %s\n",tsrc_name.data());
|
|
||||||
#endif
|
|
||||||
// 记录源文件名
|
|
||||||
src_files.push_back(tsrc_name);
|
|
||||||
// 寻找左大括号
|
|
||||||
if(qb_idx == string::npos){
|
|
||||||
ifscpt>>line;
|
|
||||||
if((qb_idx = line.find("{")) == string::npos) throw "syntax error";
|
|
||||||
}
|
|
||||||
// 入口函数描述遍历
|
|
||||||
while(getline(ifscpt,line)){
|
|
||||||
string real_line;
|
|
||||||
for(auto c:line){
|
|
||||||
if(isgraph(c) || c == ' ') real_line.push_back(c);
|
|
||||||
}
|
|
||||||
if(real_line.empty()) continue;
|
|
||||||
if(real_line != "};"){
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Function Description %s\n",real_line.data());
|
|
||||||
#endif
|
|
||||||
// 分离输出参数列表
|
|
||||||
string::size_type dq_l = real_line.find("{");
|
|
||||||
string::size_type dq_r = real_line.find("}");
|
|
||||||
if(dq_l == string::npos || dq_r == string::npos) throw "syntax error";
|
|
||||||
string str_argout = real_line.substr(dq_l+1,dq_r-dq_l-1);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Args (OUT) Description %s\n",str_argout.data());
|
|
||||||
#endif
|
|
||||||
vector<cpt_func_args> cfgo = deal_args(str_argout);
|
|
||||||
// 分离输入参数列表
|
|
||||||
string::size_type yq_l = real_line.find("(");
|
|
||||||
string::size_type yq_r = real_line.find(")");
|
|
||||||
if(yq_l == string::npos || yq_r == string::npos) throw "syntax error";
|
|
||||||
string str_argin = real_line.substr(yq_l+1,yq_r-yq_l-1);
|
|
||||||
vector<cpt_func_args> cfgi = deal_args(str_argin);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Args (IN) Description %s\n",str_argin.data());
|
|
||||||
#endif
|
|
||||||
// 分离入口函数名
|
|
||||||
string func = real_line.substr(dq_r+1,yq_l-dq_r-1);
|
|
||||||
string real_func;
|
|
||||||
for(auto c : func){
|
|
||||||
if(isgraph(c)){
|
|
||||||
real_func.push_back(c);
|
|
||||||
if(!if_illegal(c)) throw "func name has illegal char";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Read Function Name %s\n",real_func.data());
|
|
||||||
#endif
|
|
||||||
// 记录入口函数名
|
|
||||||
funcs_src.insert({real_func,tsrc_name});
|
|
||||||
// 添加相关参数
|
|
||||||
fargs_out.insert({real_func,cfgo});
|
|
||||||
fargs_in.insert({real_func,cfgi});
|
|
||||||
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else throw "fail to find key word";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Cpt::Cpt(string data_content, int if_db, string proj_name){
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Receive Data To Build Class Cpt\n [*]%s\n",data_content.data());
|
||||||
|
#endif
|
||||||
|
name = proj_name;
|
||||||
|
deal_content(data_content);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cpt::deal_content(string data_content){
|
||||||
|
setting_file_register tsfr = {
|
||||||
|
{
|
||||||
|
"cparts",
|
||||||
|
"srcfile",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// 解析数据
|
||||||
|
read_blocks(data_content, tsfr, &blocks);
|
||||||
|
content = data_content;
|
||||||
|
bool if_pblk = false;
|
||||||
|
int idx = 0;
|
||||||
|
// 寻找工程对应的块
|
||||||
|
for(auto block :blocks){
|
||||||
|
if(block->name == name){
|
||||||
|
if_pblk = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
if(!if_pblk) throw "proper blocks not found";
|
||||||
|
if(blocks[idx]->if_blk){
|
||||||
|
for(auto src : blocks[idx]->childs){
|
||||||
|
if(src->key == "srcfile"){
|
||||||
|
// 记录源文件名
|
||||||
|
string tsrc_name = src->name+".cpp";
|
||||||
|
src_files.push_back(tsrc_name);
|
||||||
|
for(auto func : src->childs){
|
||||||
|
if(!func->if_blk){
|
||||||
|
// 分离输出参数列表
|
||||||
|
string::size_type dq_l = func->sentence.find("(");
|
||||||
|
string::size_type dq_r = func->sentence.find(")");
|
||||||
|
if(dq_l == string::npos || dq_r == string::npos) throw "syntax error";
|
||||||
|
string str_argout = func->sentence.substr(dq_l+1,dq_r-dq_l-1);
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Read Args (OUT) Description %s\n",str_argout.data());
|
||||||
|
#endif
|
||||||
|
vector<cpt_func_args> cfgo = deal_args(str_argout);
|
||||||
|
// 分离输入参数列表
|
||||||
|
string::size_type yq_l = func->sentence.find("(",dq_r+1);
|
||||||
|
string::size_type yq_r = func->sentence.find(")",yq_l);
|
||||||
|
if(yq_l == string::npos || yq_r == string::npos) throw "syntax error";
|
||||||
|
string str_argin = func->sentence.substr(yq_l+1,yq_r-yq_l-1);
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Read Args (IN) Description %s\n",str_argin.data());
|
||||||
|
#endif
|
||||||
|
vector<cpt_func_args> cfgi = deal_args(str_argin);
|
||||||
|
|
||||||
|
// 分离入口函数名
|
||||||
|
string func_name = func->sentence.substr(dq_r+1,yq_l-dq_r-1);
|
||||||
|
if(!if_name_illegal(func_name)) throw "function name is illegal";
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Read Function Name %s\n",func_name.data());
|
||||||
|
#endif
|
||||||
|
// 记录入口函数名
|
||||||
|
funcs_src.insert({func_name,tsrc_name});
|
||||||
|
// 添加相关参数
|
||||||
|
fargs_out.insert({func_name,cfgo});
|
||||||
|
fargs_in.insert({func_name,cfgi});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
vector<cpt_func_args> Cpt::deal_args(string args){
|
vector<cpt_func_args> Cpt::deal_args(string args){
|
||||||
string::size_type lcma_dix = 0;
|
string::size_type lcma_dix = 0;
|
||||||
string::size_type cma_idx = args.find(",",0);
|
string::size_type cma_idx = args.find(",",0);
|
||||||
@ -156,28 +135,34 @@ vector<cpt_func_args> Cpt::deal_args(string args){
|
|||||||
cpt_func_args Cpt::deal_arg(string arg){
|
cpt_func_args Cpt::deal_arg(string arg){
|
||||||
cpt_func_args ncfa;
|
cpt_func_args ncfa;
|
||||||
std::stringstream ss,sr;
|
std::stringstream ss,sr;
|
||||||
ss<<arg;
|
stn_register tsr = {
|
||||||
string key;
|
{
|
||||||
ss>>key;
|
"int",
|
||||||
|
"double"
|
||||||
|
}
|
||||||
|
};
|
||||||
// 读取数组标号
|
// 读取数组标号
|
||||||
string::size_type fq_l = key.find("[");
|
string::size_type fq_l = arg.find("[");
|
||||||
string::size_type fq_r = key.find("]");
|
string::size_type fq_r = arg.find("]");
|
||||||
int size = 1;
|
int size = 1;
|
||||||
string type;
|
string type;
|
||||||
if(fq_l != string::npos && fq_r != string::npos){
|
if(fq_l != string::npos && fq_r != string::npos){
|
||||||
string size_str = key.substr(fq_l+1,fq_r-fq_l-1);
|
string size_str = arg.substr(fq_l+1,fq_r-fq_l-1);
|
||||||
sr<<size_str;
|
sr<<size_str;
|
||||||
sr>>size;
|
sr>>size;
|
||||||
type = key.substr(0,fq_l);
|
type = arg.substr(0,fq_l);
|
||||||
|
ncfa.size = size;
|
||||||
|
ncfa.type = type;
|
||||||
|
string key = arg.substr(fq_r+1,arg.size()-fq_r-1);
|
||||||
|
ncfa.key = key;
|
||||||
}
|
}
|
||||||
else if (fq_r == string::npos && fq_r == string::npos){
|
else if (fq_r == string::npos && fq_r == string::npos){
|
||||||
type = key.substr(0,fq_l);
|
stn_read nstnr;
|
||||||
|
read_stn(arg, tsr, &nstnr);
|
||||||
|
ncfa.type = nstnr.key;
|
||||||
|
ncfa.key = nstnr.value;
|
||||||
}
|
}
|
||||||
else throw "syntax error";
|
else throw "syntax error";
|
||||||
ncfa.size = size;
|
|
||||||
ncfa.type = type;
|
|
||||||
ss>>ncfa.key;
|
|
||||||
return ncfa;
|
return ncfa;
|
||||||
}
|
}
|
||||||
|
@ -463,7 +463,7 @@ void Proj::write_cpt_info(void){
|
|||||||
throw "cpt file not exist";
|
throw "cpt file not exist";
|
||||||
};
|
};
|
||||||
char *buff = (char *)malloc(tstat.st_size);
|
char *buff = (char *)malloc(tstat.st_size);
|
||||||
read_file(treal_path, buff);
|
read_file(treal_path, buff, tstat.st_size);
|
||||||
sqlite3_bind_int(psqlsmt, 1, idx++);
|
sqlite3_bind_int(psqlsmt, 1, idx++);
|
||||||
string md5;
|
string md5;
|
||||||
ComputeFile(treal_path.data(), md5);
|
ComputeFile(treal_path.data(), md5);
|
||||||
@ -504,7 +504,7 @@ void Proj::write_proj_info(void){
|
|||||||
throw "project file not exist";
|
throw "project file not exist";
|
||||||
};
|
};
|
||||||
Byte *buff = (Byte *)malloc(tstat.st_size);
|
Byte *buff = (Byte *)malloc(tstat.st_size);
|
||||||
read_file(proj_path+"netc.proj", buff);
|
read_file(proj_path+"netc.proj", buff,tstat.st_size);
|
||||||
sqlite3_bind_text(psqlsmt, 1, name.data(), -1, SQLITE_TRANSIENT);
|
sqlite3_bind_text(psqlsmt, 1, name.data(), -1, SQLITE_TRANSIENT);
|
||||||
sqlite3_bind_blob(psqlsmt, 2, buff, (int)tstat.st_size, SQLITE_TRANSIENT);
|
sqlite3_bind_blob(psqlsmt, 2, buff, (int)tstat.st_size, SQLITE_TRANSIENT);
|
||||||
string md5;
|
string md5;
|
||||||
@ -700,60 +700,123 @@ Proj::Proj(string t_projpath, string t_projfile){
|
|||||||
|
|
||||||
|
|
||||||
proj_file = t_projfile;
|
proj_file = t_projfile;
|
||||||
ifsproj.open(proj_path+proj_file);
|
|
||||||
if(ifsproj.good()){
|
string tifsproj;
|
||||||
string line;
|
read_settings(proj_path+proj_file, tifsproj);
|
||||||
// 寻找保留字
|
// 处理文件数据
|
||||||
if(!search_key(ifsproj,"proj")) throw "project struct not found";
|
deal_content(tifsproj);
|
||||||
// 读取下一段信息
|
}
|
||||||
ifsproj>>line;
|
|
||||||
// 大括号位置
|
|
||||||
string::size_type qb_idx = line.find("{");
|
|
||||||
// 寻找任务工程名
|
|
||||||
string t_name;
|
|
||||||
if(qb_idx == string::npos) t_name = line;
|
|
||||||
else t_name = line.substr(0,qb_idx);
|
|
||||||
// 检查工程名是否含有非法字符
|
|
||||||
for(auto c:t_name){
|
|
||||||
if(if_illegal(c));
|
|
||||||
else throw "project's name has illegal char";
|
|
||||||
}
|
|
||||||
name = t_name;
|
|
||||||
// 寻找左大括号
|
|
||||||
if(qb_idx == string::npos){
|
|
||||||
ifsproj>>line;
|
|
||||||
if((qb_idx = line.find("{")) == string::npos) throw "syntax error";
|
|
||||||
}
|
|
||||||
// 逐行分析语句
|
|
||||||
string tag,cma,arg;
|
|
||||||
bool if_ctn = false;
|
|
||||||
do{
|
|
||||||
// 读取命令标签
|
|
||||||
ifsproj>>tag;
|
|
||||||
// 读取冒号
|
|
||||||
ifsproj>>cma;
|
|
||||||
// 读取命令变量
|
|
||||||
ifsproj>>arg;
|
|
||||||
// 检查参数是否含有非法字符
|
|
||||||
for(auto c:t_name){
|
|
||||||
if(if_illegal(c));
|
|
||||||
else throw " arg has illegal char";
|
|
||||||
}
|
|
||||||
if(cma != ":") throw "syntax error";
|
|
||||||
if((if_ctn = if_continue(arg)) == true){
|
|
||||||
// 消掉逗号
|
|
||||||
arg = arg.substr(0,arg.size()-1);
|
|
||||||
}
|
|
||||||
if(if_string(arg)){
|
|
||||||
deal_order(tag, cut_string(arg));
|
|
||||||
}
|
|
||||||
else throw "syntax error";
|
|
||||||
}while(if_ctn);
|
|
||||||
ifsproj>>line;
|
|
||||||
if(line != "};") throw "syntax error";
|
|
||||||
}
|
|
||||||
else throw "fail to open project file";
|
|
||||||
|
|
||||||
|
Proj::Proj(string data_content){
|
||||||
|
deal_content(data_content);
|
||||||
|
}
|
||||||
|
|
||||||
|
//处理文件数据
|
||||||
|
void Proj::deal_content(string data_content){
|
||||||
|
setting_file_register tsfr = {
|
||||||
|
{
|
||||||
|
"proj",
|
||||||
|
"cpt",
|
||||||
|
"map",
|
||||||
|
"src_dir",
|
||||||
|
"lib_dir"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
stn_register tsr = stn_register{
|
||||||
|
{
|
||||||
|
"path",
|
||||||
|
"name",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// 解析配置文件
|
||||||
|
read_blocks(data_content, tsfr, &blocks);
|
||||||
|
content = data_content;
|
||||||
|
stn_read tsread;
|
||||||
|
// 获得解析后的信息
|
||||||
|
if (blocks[0]->key == "proj" && blocks[0]->if_blk) {
|
||||||
|
name = blocks[0]->name;
|
||||||
|
if(name.empty()) throw "a project must have a name";
|
||||||
|
for(auto block : blocks[0]->childs){
|
||||||
|
// 读取cpt描述
|
||||||
|
if(block->key == "cpt"){
|
||||||
|
string ncptp,tpath,tname;
|
||||||
|
for(auto stn : block->childs){
|
||||||
|
if(!stn->if_blk){
|
||||||
|
if(!~read_stn(stn->sentence, tsr, &tsread))
|
||||||
|
throw "sentence illegal";
|
||||||
|
|
||||||
|
if(tsread.key == "path"){
|
||||||
|
if(tpath.empty()){
|
||||||
|
tpath = tsread.value;
|
||||||
|
}
|
||||||
|
else throw "only can a 'cpt' block have one 'path' tag";
|
||||||
|
}
|
||||||
|
else if (tsread.key == "name"){
|
||||||
|
tname = tsread.value + ".cpt";
|
||||||
|
ncptp = tpath+"/"+tname;
|
||||||
|
cpt_paths.push_back(ncptp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (block->key == "map"){
|
||||||
|
string nmapp,tpath,tname;
|
||||||
|
for(auto stn : block->childs){
|
||||||
|
if(!stn->if_blk){
|
||||||
|
if(!~read_stn(stn->sentence, tsr, &tsread))
|
||||||
|
throw "sentence illegal";
|
||||||
|
|
||||||
|
if(tsread.key == "path"){
|
||||||
|
if(tpath.empty()){
|
||||||
|
tpath = tsread.value;
|
||||||
|
}
|
||||||
|
else throw "only can a 'map' block have one 'path' tag";
|
||||||
|
}
|
||||||
|
else if (tsread.key == "name"){
|
||||||
|
tname = tsread.value + ".map";
|
||||||
|
nmapp = tpath + "/" + tname;
|
||||||
|
map_paths.push_back(nmapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (block->key == "src_dir"){
|
||||||
|
string tpath;
|
||||||
|
for(auto stn : block->childs){
|
||||||
|
if(!stn->if_blk){
|
||||||
|
if(!~read_stn(stn->sentence, tsr, &tsread))
|
||||||
|
throw "sentence illegal";
|
||||||
|
if(tsread.key == "path"){
|
||||||
|
tpath = tsread.value;
|
||||||
|
src_paths.push_back(tpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (block->key == "lib_dir"){
|
||||||
|
if(!lib_path.empty()) throw "only can a 'proj' block have one 'lib_dir' block";
|
||||||
|
string tpath;
|
||||||
|
for(auto stn : block->childs){
|
||||||
|
if(!stn->if_blk){
|
||||||
|
if(!~read_stn(stn->sentence, tsr, &tsread))
|
||||||
|
throw "sentence illegal";
|
||||||
|
if(tsread.key == "path"){
|
||||||
|
if(tpath.empty()){
|
||||||
|
tpath = tsread.value;
|
||||||
|
lib_path = tpath;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw "only can a 'lib_dir' block have one 'path' tag";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else throw "project file illegal";
|
||||||
}
|
}
|
||||||
|
|
||||||
//检查目录以及描述文件是否存在
|
//检查目录以及描述文件是否存在
|
||||||
@ -908,8 +971,42 @@ string Proj::GetName(void){
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//更新工程
|
//更新工程
|
||||||
void Proj::UpdateProcess(void){
|
void Proj::UpdateProcess(void){
|
||||||
|
AttachDatabases();
|
||||||
|
// 检查工程描述文件的MD5
|
||||||
|
string md5;
|
||||||
|
ComputeFile(proj_path+"netc.proj", md5);
|
||||||
|
sqlite3_stmt *psqlsmt;
|
||||||
|
const char *pzTail;
|
||||||
|
sqlite3_prepare(psql, "SELECT md5 FROM projfile;", -1, &psqlsmt, &pzTail);
|
||||||
|
sqlite3_step(psqlsmt);
|
||||||
|
string tmd5 = (char *) sqlite3_column_text(psqlsmt, 0);
|
||||||
|
sqlite3_finalize(psqlsmt);
|
||||||
|
if(tmd5 != md5){
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Curent Project File's MD5 Is Not Matched.\n");
|
||||||
|
#endif
|
||||||
|
// 获取原工程描述文件的内容
|
||||||
|
sqlite3_blob *psqlblb;
|
||||||
|
sqlite3_blob_open(psql, NULL, "projfile", "content", 1, 0, &psqlblb);
|
||||||
|
int size = sqlite3_blob_bytes(psqlblb);
|
||||||
|
char tempfile[] = "tempblob-XXXXXX";
|
||||||
|
int fd = mkstemp(tempfile);
|
||||||
|
sqlite3_blob_close(psqlblb);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("Curent Project File's MD5 Is Matched.\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//获得数据库
|
||||||
|
void Proj::AttachDatabases(void){
|
||||||
|
// 合成数据库路径
|
||||||
db_path = proj_path +"dbs/"+ name+".db";
|
db_path = proj_path +"dbs/"+ name+".db";
|
||||||
if(access(db_path.data(), F_OK) == -1){
|
if(access(db_path.data(), F_OK) == -1){
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -918,6 +1015,7 @@ void Proj::UpdateProcess(void){
|
|||||||
throw "database not exist";
|
throw "database not exist";
|
||||||
}
|
}
|
||||||
sqlite3_open(db_path.data(), &psql);
|
sqlite3_open(db_path.data(), &psql);
|
||||||
// 检查数据库的完成性
|
// 检查数据库的完整性
|
||||||
check_database();
|
check_database();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user