1.textsearch.h /* Super fast linear text search algorithms: searchi = search ignore case search = search case sensitive searchiw = search ignore case words only (e.g. words delimited by whitespace only, not words within words) searchw() = search case sensitive words only All functions return the number of matches for keyword in buffer, or -1 on error. by James Buchanan No license ristrictions on this code. Email: jamesb@northnet.com.au */ #ifndef __TEXTSEARCH_H #define __TEXTSEARCH_H #include <stdio.h> #include <stdlib.h> int searchi(const char *buffer, const char *keyword); int search(const char *buffer, const char *keyword); int searchiw(const char *buffer, const char *keyword); int searchw(const char *buffer, const char *keyword); #endif 2.textsearch.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "textsearch.h" int searchi(const char *buffer, const char *keyword) { int k_len, b_len, ch_matches, found, i, j; b_len = strlen(buffer); k_len = strlen(keyword); if (!b_len || !k_len) return -1; ch_matches = found = 0; for (i=0; i<b_len-k_len; i++) { ch_matches = 0; for (j=0; j<k_len; j++) { if (tolower(buffer[i+j]) == tolower(keyword[j])) { ch_matches++; if (ch_matches == k_len) { found++; i += k_len; } } } } return found; } int search(const char *buffer, const char *keyword) { int k_len, b_len, ch_matches, found, i, j; b_len = strlen(buffer); k_len = strlen(keyword); if (!b_len || !k_len) return -1; ch_matches = found = 0; for (i=0; i<b_len-k_len; i++) { ch_matches = 0; for (j=0; j<k_len; j++) { if (buffer[i+j] == keyword[j]) { ch_matches++; if (ch_matches == k_len) { found++; i += k_len; } } } } return found; } int searchiw(const char *buffer, const char *keyword) { int k_len, b_len, ch_matches, found, i, j; char *temp_keyword; b_len = strlen(buffer); k_len = strlen(keyword); if (b_len < 2 || k_len < 2) /* Useless, for words only */ return -1; if (keyword[0] != ' ' && keyword[k_len-1] != ' ') { temp_keyword = (char *)calloc(k_len+3, sizeof(char)); if (!temp_keyword) return -1; temp_keyword[0] = ' '; strcat(temp_keyword, keyword); strcat(temp_keyword, " "); } else if (keyword[0] == ' ' && keyword[k_len-1] != ' ') { temp_keyword = (char *)calloc(k_len+2, sizeof(char)); if (!temp_keyword) return -1; strcat(temp_keyword, keyword); strcat(temp_keyword, " "); } else if (keyword[0] != ' ' && keyword[k_len-1] == ' ') { temp_keyword = (char *)calloc(k_len+2, sizeof(char)); if (!temp_keyword) return -1; temp_keyword[0] = ' '; strcat(temp_keyword, keyword); } else { /* If we get to here and no if statement has executed, keyword already has whitespaces surrounding it */ temp_keyword = (char *)calloc(k_len+1, sizeof(char)); if (!temp_keyword) return -1; strcpy(temp_keyword, keyword); } ch_matches = found = 0; k_len = strlen(temp_keyword); /* Calculate new string length */ for (i=0; i<b_len-k_len; i++) { ch_matches = 0; for (j=0; j<k_len; j++) { if (buffer[i+j] == temp_keyword[j]) { ch_matches++; if (ch_matches == k_len) { found++; i += k_len; } } } } if (temp_keyword != NULL) free(temp_keyword); return found; } int searchw(const char *buffer, const char *keyword) { int k_len, b_len, ch_matches, found, i, j; char *temp_keyword; b_len = strlen(buffer); k_len = strlen(keyword); if (b_len < 2 || k_len < 2) /* Useless, for words only */ return -1; if (keyword[0] != ' ' && keyword[k_len-1] != ' ') { temp_keyword = (char *)calloc(k_len+3, sizeof(char)); if (!temp_keyword) return -1; temp_keyword[0] = ' '; strcat(temp_keyword, keyword); strcat(temp_keyword, " "); } else if (keyword[0] == ' ' && keyword[k_len-1] != ' ') { temp_keyword = (char *)calloc(k_len+2, sizeof(char)); if (!temp_keyword) return -1; strcat(temp_keyword, keyword); strcat(temp_keyword, " "); } else if (keyword[0] != ' ' && keyword[k_len-1] == ' ') { temp_keyword = (char *)calloc(k_len+2, sizeof(char)); if (!temp_keyword) return -1; temp_keyword[0] = ' '; strcat(temp_keyword, keyword); } else { /* If we get to here and no if statement has executed, keyword already has whitespaces surrounding it */ temp_keyword = (char *)calloc(k_len+1, sizeof(char)); if (!temp_keyword) return -1; strcpy(temp_keyword, keyword); } ch_matches = found = 0; k_len = strlen(temp_keyword); /* Calculate new string length */ for (i=0; i<b_len-k_len; i++) { ch_matches = 0; for (j=0; j<k_len; j++) { if (buffer[i+j] == temp_keyword[j]) { ch_matches++; if (ch_matches == k_len) { found++; i += k_len; } } } } if (temp_keyword != NULL) free(temp_keyword); return found; } 3.main #include <stdio.h> #include <string.h> #include <stdlib.h> #include "textsearch.h" int main(void) { char buff[1024], key[56]; printf("Enter the buffer's contents (<ENTER> to quit) ==>"); gets(buff); printf("Enter the keyword (<ENTER> to quit) ==>"); gets(key); printf("/n/nTesting all 4 functions in textsearch.../n"); printf("Result for search() is %d./n", search(buff,key)); printf("Result for searchi() is %d./n", searchi(buff,key)); printf("Result for searchw() is %d./n", searchw(buff,key)); printf("Result for searchiw() is %d./n", searchiw(buff,key)); return 0; }