/* * translated from ZOJ judger r367 * http://code.google.com/p/zoj/source/browse/trunk/judge_client/client/text_checker.cc#25 * */ int compare_zoj(const char *file1, const char *file2) { int ret = OJ_AC; FILE * f1, *f2; f1 = fopen(file1, "r"); f2 = fopen(file2, "r"); if (!f1 || !f2) { ret = OJ_RE; } else for (;;) { // Find the first non-space character at the beginning of line. // Blank lines are skipped. int c1 = fgetc(f1); int c2 = fgetc(f2); find_next_nonspace(c1, c2, f1, f2, ret); // Compare the current line. for (;;) { // Read until 2 files return a space or 0 together. while ((!isspace(c1) && c1) || (!isspace(c2) && c2)) { if (c1 == EOF && c2 == EOF) { goto end; } if (c1 == EOF || c2 == EOF) { break; } if (c1 != c2) { // Consecutive non-space characters should be all exactly the same ret = OJ_WA; goto end; } c1 = fgetc(f1); c2 = fgetc(f2); } find_next_nonspace(c1, c2, f1, f2, ret); if (c1 == EOF && c2 == EOF) { goto end; } if (c1 == EOF || c2 == EOF) { ret = OJ_WA; goto end; } if ((c1 == '\n' || !c1) && (c2 == '\n' || !c2)) { break; } } } end: if (f1) fclose(f1); if (f2) fclose(f2); return ret; }
std::string word_wrap( const std::string & s, unsigned int line_length, const std::string & prefix, const std::string & prefix_first_line) { std::string t; const std::string *u = &prefix_first_line; std::string::const_iterator p0, p1, p2, p3; p0 = p1 = p2 = s.begin(); while (p2 != s.end() ) { // skip preceeding whitespace p1 = find_next_nonspace(p0, s.end()); p3 = find_next_endl(p0, s.end()); p2 = p1 = find_next_space(p1, s.end()); do { p1 = find_next_nonspace(p1, s.end()); p1 = find_next_space(p1, s.end()); if (p3 < p1) { p2 = p3; break; } unsigned int diff = p1 - p0; if (diff > (line_length - u->size())) break; p2 = p1; } while (p2 != s.end()); t.append(*u).append(p0, p2).append("\n"); if (p2 == p3) u = &prefix_first_line; else u = &prefix; p0 = p2 + 1; } return t; }