// The contents of this file are subject to the BOINC Public License // Version 1.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://boinc.berkeley.edu/license_1.0.txt // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is the Berkeley Open Infrastructure for Network Computing. // // The Initial Developer of the Original Code is the SETI@home project. // Portions created by the SETI@home project are Copyright (C) 2002 // University of California at Berkeley. All Rights Reserved. // // Contributor(s): // #ifdef _WIN32 #include "boinc_win.h" #endif #ifndef _WIN32 #include #include #include #endif #include "error_numbers.h" #include "miofile.h" using std::string; MIOFILE::MIOFILE() { mf = 0; f = 0; buf = 0; } MIOFILE::~MIOFILE() { } void MIOFILE::init_mfile(MFILE* _mf) { mf = _mf; } void MIOFILE::init_file(FILE* _f) { f = _f; } void MIOFILE::init_buf(char* _buf) { buf = _buf; } int MIOFILE::printf(const char* format, ...) { int retval; va_list ap; va_start(ap, format); if (mf) { retval = mf->vprintf(format, ap); } else { retval = vfprintf(f, format, ap); } va_end(ap); return retval; } char* MIOFILE::fgets(char* dst, int len) { if (f) { return ::fgets(dst, len, f); } char* q = strchr(buf, '\n'); if (!q) return 0; q++; int n = (int)(q - buf); if (n > len-1) n = len-1; memcpy(dst, buf, n); dst[n] = 0; buf = q; return dst; } // copy from a file to static buffer // int copy_element_contents(MIOFILE& in, const char* end_tag, char* p, int len) { char buf[256]; int n; strcpy(p, ""); while (in.fgets(buf, 256)) { if (strstr(buf, end_tag)) { return 0; } n = strlen(buf); if (n >= len-1) return ERR_XML_PARSE; strcat(p, buf); len -= n; } return ERR_XML_PARSE; } int copy_element_contents(MIOFILE& in, const char* end_tag, string& str) { char buf[256]; str = ""; while (in.fgets(buf, 256)) { if (strstr(buf, end_tag)) { return 0; } str += buf; } fprintf(stderr, "copy_element_contents(): no end tag\n"); return ERR_XML_PARSE; }