char* UriGetScheme( char* str, unsigned int strLen, char** next ) { /* http://[email protected]:port/path?query=true#fragment '--' '- Retrives this part */ char* ptrEnd = str; char c; for( unsigned int i = 0; i < strLen; i++ ) { c = str[i]; // The scheme is terminated with : if( c == ':' ) { break; } // Check for disallowed characters in the scheme else if( !( CharIsAlpha( c ) || CharIsDigit( c ) || c == '+' || c == '-' || c == '.' ) ) { // We found a disallowed character, this is not a scheme. return 0; } else { ptrEnd++; } } unsigned int len = ptrEnd - str; char* out = calloc( len + 1,sizeof(char) ); if( out != NULL ) { memcpy( out, str, len ); out[len] = 0; StringToLowercase( out ); } else { ERROR("Cannot alloc memory for URI\n"); } *next = ptrEnd + 1; return out; }
//ищет подряд идущие 16 цифр, причем между цифрами могут быть любые символы, также перед первой //цифрой (предыдущая позиция) не должно быть цифры и после последней цифры не должно быть сразу цифры //Если найдено 16 цифр, то возвращает начальную их позицию, если нет, возвращает szSrc или больше, //в posEnd будет позиция последней цифры int FindCard16Digit(char* pSrc, int szSrc, int pos, char* pDst, int& posEnd ) { for(;;) { //ищем начало номера карточки while( pos < szSrc ) { if( pSrc[pos] == '4' || pSrc[pos] == '5' || pSrc[pos] == '6' ) //номер карточки всегда начинается с 4 или 5 break; pos++; } //ищем дальше цифры if( pos < szSrc ) { if( (pos > 0 && !CharIsDigit(pSrc[pos - 1])) || pos == 0 ) //если в предыдущей позиции не цифра { int i = 0; pDst[i++] = pSrc[pos]; //сохранили 1-ю цифру int pos1 = pos + 1; //ищем таким образом чтобы если между цифрами есть разрывы, то чтобы подряд было обязательно 4 цифры int together = 1; //количество подряд идущих цифр while( pos1 < szSrc && i < 16 ) //ищем следующие цифры { if( CharIsDigit( pSrc[pos1] ) ) { pDst[i++] = pSrc[pos1]; //сохранили очередную цифру posEnd = pos1; //позиция последней цифры together++; } else { if( together > 0 && together != 4 ) //если подряд не 4 цифры, то { if( together < 4 ) //если их меньше 4-х, то игнорим найденные цифры, т. е. делам возрат назад { i -= together; if( i == 0 ) //если это были начальные цифры, то прекращаем поиск break; } else { break; //если больше, то прекращаем поиск } } together = 0; } pos1++; } if( i == 16 ) //нашли 16 цифр, если не нашли, то в pos будет = szSrc, что означает - последовательности из 16 цифр нет { if( pos1 >= szSrc || !CharIsDigit(pSrc[pos1]) ) //если дошли до конца или следующий символ не цифра { pDst[i] = 0; //нашли нужное, завершающий нуль break; } } else { if( pos1 >= szSrc )//дошли до конца строки значит заканчиваем поиск, все равно ничего уже не найдем { pos = szSrc; break; } } } pos++; //переходим на следующую позицию в строке } else break; } return pos; }
FBOOL CharIsAlphanumeric( char c ) { return CharIsAlpha( c ) || CharIsDigit( c ); }