diff --git a/all.tar.gz b/all.tar.gz index a358a4d..53f5816 100644 Binary files a/all.tar.gz and b/all.tar.gz differ diff --git a/ccc.cpp b/ccc.cpp index 0c95c2d..a6fa247 100644 --- a/ccc.cpp +++ b/ccc.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -166,26 +168,15 @@ struct symbol { string name; int score; }; -struct node { - map children; - int token_id=-1; -}; -void insert(node* root,string str,int id) { - node* curr=root; - for (char c:str) { - if (curr->children.find(c)==curr->children.end()) { - curr->children[c]=new node(); - } - curr=curr->children[c]; - } - curr->token_id=id; -} -struct processed_file { - string path; - uint32_t payload_size; - vector payload; - bool is_payload_compressed; +#pragma pack(push,1) +struct header { + uint8_t sig[3]; + uint8_t flags; + size_t size_rec_table; + size_t entry_count; + size_t size_payload; }; +#pragma pack(pop) map> all_tokens; map rec_map; vector rec_list; @@ -310,6 +301,7 @@ vector process_file_nodes(vector *nodes,string code,vecto vector out; for (int i=0;isize();i++) { string type=string(ts_node_type(nodes->at(i))); + string supertext=code.substr(ts_node_start_byte(nodes->at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); if (type=="#if") { CCC_ADD_COMPOMENT(out,CCC_PREPROCESSOR_CONDITIONAL_IF); print_debug("if"); @@ -349,7 +341,7 @@ vector process_file_nodes(vector *nodes,string code,vecto } else if (type=="#warning") { CCC_ADD_COMPOMENT(out,CCC_PREPROCESSOR_OTHER_WARNING); print_debug("warning"); - } else if (type=="#pragma") { + } else if (type=="#pragma" || (type=="preproc_directive" && supertext=="#pragma")) { CCC_ADD_COMPOMENT(out,CCC_PREPROCESSOR_OTHER_PRAGMA); print_debug("pragma"); } else if (type=="#line") { @@ -553,131 +545,156 @@ int main(int argc,char **argv) { files_content.push_back(code); } construct_rec_table(files_content,files); - vector files_archive; + vector files_archive; + vector payloads_size; + vector payloads_start; for (int i=0;i payload_compressed; - payload_compressed.resize(payload_bytes.size()+payload_bytes.size()/3+128); - lzma_stream strm=LZMA_STREAM_INIT; - if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { - cout<<"Error: couldn't initialize LZMA compressor for file: "<=original_size) { - pfile.is_payload_compressed=false; - pfile.payload=payload_bytes; - pfile.payload_size=original_size; - } else { - pfile.is_payload_compressed=true; - pfile.payload=payload_compressed; - pfile.payload_size=compressed_size; - } + auto payload_bytes=process_file_nodes(&(all_tokens.at(files[i])),files_content[i],rec_list); + payloads_size.push_back(payload_bytes.size()); + payloads_start.push_back(files_archive.size()); + CCC_ADD_COMPOMENT(files_archive,payload_bytes); cout< rec_table; - // for (int i=0;i rec_table_compressed; - // rec_table_compressed.resize(rec_table.size()+rec_table.size()/3+128); - // lzma_stream strm=LZMA_STREAM_INIT; - // if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { - // cout<<"Error: couldn't initialize LZMA compressor."< out; - // out.push_back('C'); - // out.push_back(compressed_size>=original_size?'C':'c'); - // vector payload_bytes; - // unsigned char current=0; - // size_t bit_index=0; - // for (bool b:payload) { - // current|=(b<<(7-bit_index)); - // bit_index++; - // if (bit_index==8) { - // payload_bytes.push_back(current); - // current=0; - // bit_index=0; - // } - // } - // if (bit_index!=0) { - // payload_bytes.push_back(current); - // } - // vector payload_compressed; - // payload_compressed.resize(payload_bytes.size()+payload_bytes.size()/3+128); - // strm=LZMA_STREAM_INIT; - // if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { - // cout<<"Error: couldn't initialize LZMA compressor."<=original_size1?'C':'c'); - // if (compressed_size>=original_size) { - // CCC_ADD_COMPOMENT(out,rec_table); - // } else { - // CCC_ADD_COMPOMENT(out,rec_table_compressed); - // } - // if (compressed_size1>=original_size1) { - // CCC_ADD_COMPOMENT(out,payload_bytes); - // } else { - // CCC_ADD_COMPOMENT(out,payload_compressed); - // } - // ofstream fileout("test.ccc",ios::binary); - // if (!fileout) { - // cout<<"Error: couldn't open output file."<(out.data()),out.size()); - // fileout.close(); - // return 0; + vector payload_compressed; + payload_compressed.resize(files_archive.size()+files_archive.size()/3+128); + lzma_stream strm=LZMA_STREAM_INIT; + if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + cout<<"Error: couldn't initialize LZMA compressor for file archive."<=original_size) { + flags&= ~(0b00000001); + payload_total_size=original_size; + } else { + flags|=0b00000001; + payload_total_size=compressed_size; + } + vector rec_table; + for (int i=0;i rec_table_compressed; + rec_table_compressed.resize(rec_table.size()+rec_table.size()/3+128); + strm=LZMA_STREAM_INIT; + if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + cout<<"Error: couldn't initialize LZMA compressor for reccurences table."<=original_size) { + flags&= ~(0b00000010); + rec_table_total_size=original_size; + } else { + flags|=0b00000010; + rec_table_total_size=compressed_size; + } + vector files_table; + for (int i=0;i files_table_compressed; + files_table_compressed.resize(files_table.size()+files_table.size()/3+128); + strm=LZMA_STREAM_INIT; + if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + cout<<"Error: couldn't initialize LZMA compressor for files table."<=original_size) { + flags&= ~(0b00000100); + files_table_total_size=original_size; + } else { + flags|=0b00000100; + files_table_total_size=compressed_size; + } + header head; + head.sig[0]='C'; + head.sig[1]='C'; + head.sig[2]='C'; + head.flags=flags; + head.size_payload=payload_total_size; + head.size_rec_table=rec_table_total_size; + head.entry_count=files.size(); + vector out; + for (int i=0;i(out.data()),out.size()); + fileout.close(); + return 0; } diff --git a/test.ccc b/test.ccc new file mode 100644 index 0000000..d33b2bf Binary files /dev/null and b/test.ccc differ