int parse_url(const char *urlstr,char *proto,char *user,char *pass,char *host,int *port,char *path) { const char *ptr,*ptr2; char hostpart[1000]; int ret; ptr2 = urlstr; if(!(ptr = strchr(urlstr,':'))){return -1;} strncpy2(proto,ptr2,ptr-ptr2); ptr2 = ptr+1; tolowerstr(proto); if(strcmp(proto,"ftp")==0 || strcmp(proto,"http")==0){ if(strncmp(ptr2,"//",2)==0){ptr2+=2;}else{return -1;} if(ptr = strchr(ptr2,'/')){ strncpy2(hostpart,ptr2,ptr-ptr2); strcpy(path,ptr); }else{ strcpy(hostpart,ptr2); strcpy(path,"/"); } ret = parse_hostpart(hostpart,user,pass,host,port); if(ret==-1){return -1;} if(*port=='\0' && strcmp(proto,"ftp")==0){*port = 21;} if(*user=='\0' && strcmp(proto,"ftp")==0){strcpy(user,"anonymous");} if(*port=='\0' && strcmp(proto,"http")==0){*port = 80;} }else if(strcmp(proto,"mailto")==0){ ret = parse_hostpart(ptr2,user,pass,host,port); if(ret==-1){return -1;} if(*port=='\0' && strcmp(proto,"mailto")==0){*port = 25;} }else{ return -1; } return 0; }
const char *plainconf::getRealName(char *name) { assert(bKeywordsInited == true); tolowerstr(name); HashStringMap<plainconfKeywords *>::iterator it = allKeyword.find(name); if (it == allKeyword.end()) return NULL; else return it.second()->name; }
int parse_hostport(const char *hostport,char *host,int *port) { char *ptr; if(ptr=strchr(hostport,':')){ *port = atoi(ptr+1); strncpy2(host,hostport,ptr-hostport); }else{ strcpy(host,hostport); *port = 0; } tolowerstr(host); return 0; }
Result TestCaseDrv::exec(const string& fileName) throw (Exception) { const string fileHeadSignature = "[testcase]"; /// debe estar en minuscula int lineNumber = 0; string textLine; Result result(Result::ok); try { ifstream ifs(fileName.c_str()); if (!ifs) throw InvalidTestException("no se encuentra el archivo"); ObjectTable symbolTable; getline(ifs, textLine); tolowerstr(trim(textLine)); if (textLine != fileHeadSignature) throw FileFormatException(fileName, "encabezado incorrecto (no es [testcase])"); lineNumber++; while (!ifs.eof()) { getline(ifs, textLine); trim(textLine); lineNumber++; if (!textLine.empty() and textLine[0] != '#') { #ifndef NDEBUG cout << " DEBUG " << " cmd: " << textLine << endl; //! DEBUG #endif cmd::exec(textLine, symbolTable, result); } } } // TODO: hay que factorizar el código que sigue. está despolijro. catch (ErrorTestException& e) { return Result(Result::error, "caso de test: " + fileName + '\n' + "linea " + toString<int>(lineNumber) + ": " + textLine + '\n' + "problema: " + e.message()); } catch (InvalidTestException& e) { // TODO tengo la sospecha de que este código es inalcanzable. revisarlo. // debiera venirse acá cuando hay parámetros de más, de menos, errores // de tipo y cosas similares. en todo caso, puede que haya que corregir // cmd.cpp en lugar de quitar esta sección. return Result(Result::invalid, "caso de test: " + fileName + '\n' + "linea " + toString<int>(lineNumber) + ": " + textLine + '\n' + "problema: " + e.message()); // FIXME: ojo. invalidTest también es arrojada por fileNotFound y se ve // feíto que el error diga "linea 0: problema: bla, bla". no me gusta el // "linea 0". :-( } catch (std::ios_base::failure& e) { return Result(Result::invalid, "caso de test: " + fileName + '\n' + "linea " + toString<int>(lineNumber) + ": " + textLine + '\n' + "problema: E/S incorrecta - " + e.what() + '\n' + "esta es una excepcion tal vez causada por el operador >> o el <<, por la falta de un parametro, " + "por haberse encontrado un tipo de datos no esperado, o vaya uno a saber por que. " + "quiero creer que escribiste 'true' y 'false' BIEN y en minusculas."); } catch (BadTypeException& e) { return Result(Result::invalid, "caso de test: " + fileName + '\n' + "linea " + toString<int>(lineNumber) + ": " + textLine + '\n' + "problema: " + e.message()); } catch (FileFormatException& e) { return Result(Result::invalid, "caso de test: " + e.fileName() + '\n' + "problema: formato invalido - " + e.message()); } catch (UsageException& e) { throw UsageException("caso de test: " + fileName + '\n' + "linea " + toString<int>(lineNumber) + ": " + textLine + '\n' + "problema: " + e.message()); // sube como Exception // TODO para uniformar, ver si conviene que esta excepción también // suba como Result::invalid o algo así. si se encuentra una buena razón // para que no suceda, habría que documentarla. } return result; }