// Reads from the given file. Returns false in case of error. // If swap is true, assumes a big/little-endian swap is needed. bool STRING::DeSerialize(bool swap, FILE* fp) { inT32 len; if (fread(&len, sizeof(len), 1, fp) != 1) return false; if (swap) ReverseN(&len, sizeof(len)); truncate_at(len); if (fread(GetCStr(), 1, len, fp) != len) return false; return true; }
static void process_find_file(const char *findfile) { std::ifstream in; in.open(findfile,std::ifstream::in); if(!in.good()) { err(1,"Cannot open %s",findfile); } while(!in.eof()){ std::string line; getline(in,line); truncate_at(line,'\r'); // remove a '\r' if present if(line.size()>0) { if(line[0]=='#') continue; // ignore lines that begin with a comment character add_find_pattern(line); } } }
void feature_recorder::make_histogram(const class histogram_def &def) { beregex reg(def.pattern,REG_EXTENDED); string ifname = fname_counter(""); // source of features ifstream f(ifname.c_str()); if(!f.is_open()){ std::cerr << "Cannot open histogram input file: " << ifname << "\n"; return; } /* Read each line of the feature file and add it to the histogram. * If we run out of memory, dump that histogram to a file and start * on the next histogram. */ for(int histogram_counter = 0;histogram_counter<max_histogram_files;histogram_counter++){ HistogramMaker h(def.flags); /* of seen features, created in pass two */ try { string line; while(getline(f,line)){ if(line.size()==0) continue; // empty line if(line[0]=='#') continue; // comment line truncate_at(line,'\r'); // truncate at a \r if there is one. /** If there is a string required in the line and it isn't present, don't use this line */ if(def.require.size()){ if(line.find_first_of(def.require)==std::string::npos){ continue; } } string feature = extract_feature(line); if(feature.find('\\')!=string::npos){ feature = unquote_string(feature); // reverse \xxx encoding } /** If there is a pattern to use to prune down the feature, use it */ if(def.pattern.size()){ string new_feature = feature; if(!reg.search(feature,&new_feature,0,0)){ // no search match; avoid this feature continue; } feature = new_feature; } /* Remove what follows after \t if this is a context file */ size_t tab=feature.find('\t'); if(tab!=string::npos) feature.erase(tab); // erase from tab to end h.add(feature); } f.close(); } catch (const std::exception &e) { std::cerr << "ERROR: " << e.what() << " generating histogram " << name << "\n"; } /* Output what we have */ stringstream real_suffix; real_suffix << def.suffix; if(histogram_counter>0) real_suffix << histogram_counter; string ofname = fname_counter(real_suffix.str()); // histogram name ofstream o; o.open(ofname.c_str()); if(!o.is_open()){ cerr << "Cannot open histogram output file: " << ofname << "\n"; return; } HistogramMaker::FrequencyReportVector *fr = h.makeReport(); if(fr->size()>0){ banner_stamp(o,histogram_file_header); o << *fr; // sends the entire histogram } delete fr; o.close(); if(f.is_open()==false){ return; // input file was closed } } std::cerr << "Looped " << max_histogram_files << " times on histogram; something seems wrong\n"; }
/** * process a path for a given filename. * Opens the image and calls the function above. * Also implements HTTP server with "-http" option. * Feature recorders disabled. */ static void process_path(const char *fn,std::string path,size_t pagesize,size_t marginsize) { image_process *pp = image_process::open(fn,0,pagesize,0); if(pp==0){ if(path=="-http"){ std::cout << "HTTP/1.1 502 Filename " << fn << " is invalid" << HTTP_EOL << HTTP_EOL; } else { std::cerr << "Filename " << fn << " is invalid\n"; } exit(1); } if(path=="-"){ /* process path interactively */ printf("Path Interactive Mode:\n"); if(pp==0){ std::cerr << "Invalid file name: " << fn << "\n"; exit(1); } do { getline(std::cin,path); if(path==".") break; scanner_params::PrintOptions po; scanner_params::setPrintMode(po,scanner_params::MODE_HEX); process_open_path(*pp,path,po,pagesize+marginsize); } while(true); return; } if(path=="-http"){ do { /* get the HTTP query */ std::string line; // the specific query scanner_params::PrintOptions po; scanner_params::setPrintMode(po,scanner_params::MODE_HTTP); // options for this query getline(std::cin,line); truncate_at(line,'\r'); if(line.substr(0,4)!="GET "){ std::cout << "HTTP/1.1 501 Method not implemented" << HTTP_EOL << HTTP_EOL; return; } size_t space = line.find(" HTTP/1.1"); if(space==std::string::npos){ std::cout << "HTTP/1.1 501 Only HTTP/1.1 is implemented" << HTTP_EOL << HTTP_EOL; return; } std::string p2 = line.substr(4,space-4); /* Get the additional header options */ do { getline(std::cin,line); truncate_at(line,'\r'); if(line.size()==0) break; // double new-line size_t colon = line.find(":"); if(colon==std::string::npos){ std::cout << "HTTP/1.1 502 Malformed HTTP request" << HTTP_EOL; return; } std::string name = line.substr(0,colon); std::string val = line.substr(colon+1); while(val.size()>0 && (val[0]==' '||val[0]=='\t')) val = val.substr(1); po[name]=val; } while(true); /* Process some specific URLs */ if(p2=="/info"){ std::cout << "X-Image-Size: " << pp->image_size() << HTTP_EOL; std::cout << "X-Image-Filename: " << pp->image_fname() << HTTP_EOL; std::cout << "Content-Length: 0" << HTTP_EOL; std::cout << HTTP_EOL; continue; } /* Ready to go with path and options */ process_open_path(*pp,p2,po,pagesize+marginsize); } while(true); return; } scanner_params::PrintOptions po; scanner_params::print_mode_t mode = scanner_params::MODE_HEX; if(path.size()>2 && path.substr(path.size()-2,2)=="/r"){ path = path.substr(0,path.size()-2); mode = scanner_params::MODE_RAW; } if(path.size()>2 && path.substr(path.size()-2,2)=="/h"){ path = path.substr(0,path.size()-2); mode = scanner_params::MODE_HEX; } scanner_params::setPrintMode(po,mode); process_open_path(*pp,path,po,pagesize+marginsize); }