/** * stringAux.cpp * * @author Derzu Omaia * @date 27/10/2009 * */ #include "stringAux.h" #include #include #include "dprintf.h" #include "parseRomanNumbers.h" namespace Util { // UTF-8 eh formado por 2 bytes const unsigned char StringAux::specialUTF_8Base = 195; const unsigned char StringAux::specialUTF_8[] = { 160, 161, 162, 163, 164, 168, 169, 170, 171, 172, 173, 174, 175, 178, 179, 180, 181, 182, 185, 186, 187, 188, 167, 128, 129, 130, 131, 132, 136, 137, 138, 139, 140, 141, 142, 143, 146, 147, 148, 149, 150, 153, 154, 155, 156, 135 }; const unsigned char StringAux::specialISO8859_1[] = { 224, 225, 226, 227, 228, 232, 233, 234, 235, 236, 237, 238, 239, 242, 243, 244, 245, 246, 249, 250, 251, 252, 231, 192, 193, 194, 195, 196, 200, 201, 202, 203, 204, 205, 206, 207, 210, 211, 212, 213, 214, 217, 218, 219, 220, 199 }; const unsigned char StringAux::special[] = {'�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�'}; const unsigned char StringAux::normal[] = { 'A', 'A', 'A', 'A', 'A', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'C', 'A', 'A', 'A', 'A', 'A', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'C'}; const int StringAux::sizeSpecials = 46; /** * Converte os caracteres acentuados de iso8859 para utf8 * * @param texto um vetor de char * @return o texto da entrada convertido, e realocado. **/ char * StringAux::ISO8859_1ToUTF_8(const unsigned char * text) { int i, j, k=0; bool achou; int len = strlen((char*)text) + 1; // +1 do \n char * output = (char *) malloc(len); // Percorre os caracteres de entrada for (i=0 ; i' ' && input[i]!='[' && input[i]!=']') { // esse for percorre os special ate a metade, ou seja apenas os minusculos for (int j=0 ; j< sizeSpecials/2 ; j++) { if ((input[i])==specialISO8859_1[j]) { //if (mostrar) // DDPRINTF("trocando %c(j=%d) por %c(%d), i = %d\n", // input[i], j, specialISO8859_1[j+sizeSpecials/2], j+(sizeSpecials/2), i); // Se for igual substitui pelo maiusculo // printf("substituindo %d(%c), por %d(%c)\n", specialISO8859_1[j], specialISO8859_1[j], specialISO8859_1[j+sizeSpecials/2], specialISO8859_1[j+sizeSpecials/2]); input[i] = specialISO8859_1[j+sizeSpecials/2]; achou = true; //if(mostrar) DDPRINTF("palavra depois de deixar acento maiusculo = %s,tam=%d\n", input,strlen((char*)input)); } } // if (!achou) // printf("nao achei %d(%c)\n", input[i], input[i]); } } } // if(mostrar) DDPRINTF("Aqui em toUpper, palavraFinal = %s\n", input); } /** * Verifica se um vetor de char possui acento ou nao. * * @param input um vetor de char * @return true se input possuir acento, e falso se nao possuir. * **/ bool StringAux::hasAcento(char * input) { int size; if (input) size = strlen(input); else size = 0; for (int i=0 ; i%x<\n", input[i], input[i], special[j]); if (input[i]==specialISO8859_1[j]) { //DDPRINTF("Trocando caractere especial %c por %c\n", input[i], (char)normal[j]); //input[i] = normal[j]; input[i] = (char)normal[j]; } } return input; } void StringAux::normaliza(char * input) { toUpper((unsigned char *)input); } /** * Verifica se um vetor de char esta representando um numero romano. * * @param token um vetor de char * @return true se token estiver representando um numero romano, e falso se nao * for uma representacao de numeros romanos. * @see isArabicNumber **/ bool StringAux::isRomanNumber(char * token) { bool achou; const char * romans = "IVXLCDM"; for (int i=0 ; ; i++) { if (token[i]=='\0') break; achou = false; for (int j=0 ; ; j++) { if (romans[j]=='\0') break; if (token[i]==romans[j]) { achou = true; break; } } if (!achou) return false; } return true; } /** * Verifica se um vetor de char esta representando um numero arabico. * * @param token um vetor de char * @return true se token estiver representando um numero arabico, e falso se nao * for uma representacao de numeros arabicos. * @see isRomanNumber **/ bool StringAux::isArabicNumber(char * token) { bool number = true; for (int i=0 ; ; i++) { if (token[i]=='\0') break; if (!(isdigit(token[i]) || token[i]==',' || token[i]=='.')) return false; } return number; } /** * Verifica se um vetor de char possui um determinado caractere. * * @param palavra um vetor de char * @param caractere o caractere que deseja-se encontrar * @return true se palavra possuir caractere, e falso se nao possuir. **/ bool StringAux::hasCaracter(const char * palavra, char caractere) { for (int i=0 ; ; i++) { if (palavra[i]=='\0') break; if (palavra[i]==caractere) return true; } return false; } /** * Verifica a quantidade de vezes que determinado caractere ocorre na string * * @param palavra um vetor de char * @param caractere o caractere que deseja-se procurar * @return quantidade de vezes que o caractere ocorreu. **/ int StringAux::getQuantCaracter(const char * palavra, char caractere) { int cont = 0; for (int i=0 ; ; i++) { if (palavra[i]=='\0') break; if (palavra[i]==caractere) cont++; } return cont; } /** * Substitui todos os caracteres 'origem' de um vetor pelo caractere 'destino'. * * @param palavra um vetor de char * @param origem o caractere que deseja-se substituir * @param destino o caractere pelo qual origem sera substituida. **/ void StringAux::replaceAll(char * palavra, char origem, char destino) { for (int i=0 ; ; i++) { if (palavra[i]=='\0') break; if (palavra[i]==origem) palavra[i]=destino; } } char * StringAux::clone(const char * input) { char * output = NULL; if (input) { int length = strlen(input); output = (char*) malloc(length + 1); memcpy(output, input, length + 1); } return output; } char * StringAux::cloneRemovingFinalSpace(const char * input) { char * output = NULL; int length; if (input) { length = strlen(input); output = (char*) malloc(length + 1); memcpy(output, input, length + 1); // remove o espaco do inicio while (output[0]==' ') { shiftEsquerda(output, 1); length--; } // remove o espaco em branco que por acaso tenha no final do string for (int i=length-1; i>0 ; i--) if (output[i]==' ') output[i]='\0'; else break; } return output; } void StringAux::shiftEsquerda(char * input, int offset) { int len = strlen(input); //DDPRINTF("antes _%s_\n", input); for (int i=0; i=0 ; i--) { if (frase[i]==caractere) return i; } return -1; } }