1 | /*************************************** 2 | $Revision: 1.3 $ 3 | 4 | UP subject line parsing 5 | 6 | Status: NOT REVIEWED, TESTED 7 | 8 | Author(s): Engin Gunduz 9 | 10 | ******************/ /****************** 11 | Modification History: 12 | engin (19/03/2001) Created. 13 | ******************/ /****************** 14 | Copyright (c) 2001,2002 RIPE NCC 15 | 16 | All Rights Reserved 17 | 18 | Permission to use, copy, modify, and distribute this software and its 19 | documentation for any purpose and without fee is hereby granted, 20 | provided that the above copyright notice appear in all copies and that 21 | both that copyright notice and this permission notice appear in 22 | supporting documentation, and that the name of the author not be 23 | used in advertising or publicity pertaining to distribution of the 24 | software without specific, written prior permission. 25 | 26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32 | ***************************************/ 33 | 34 | 35 | #include "UP_subject.h" 36 | #include "glib.h" 37 | 38 | 39 | /* 40 | Classifies the given word. The word can be HELP, HOWTO or NEW 41 | up_classify_word may return UP_KEYWORD_HELP (for HELP & HOWTO), 42 | UP_KEYWORD_NEW (for NEW) or UP_KEYWORD_UNRECOG (for all others). 43 | Comparisons are case insensitive. 44 | */ 45 | int up_classify_word(const char * word){ 46 | 47 | if(word == NULL){ 48 | return UP_KEYWORD_UNRECOG; 49 | } 50 | 51 | if( strcasecmp(word, "HOWTO") == 0 || strcasecmp(word, "HELP") == 0){ 52 | 53 | return UP_KEYWORD_HELP; 54 | 55 | }else if( strcasecmp(word, "NEW") == 0){ 56 | 57 | return UP_KEYWORD_NEW; 58 | 59 | }else{ 60 | 61 | return UP_KEYWORD_UNRECOG; 62 | 63 | } 64 | 65 | } 66 | 67 | 68 | 69 | 70 | /* UP_subject_process function gets the "Subject:" line of a 71 | update message and processes it. It tries to see if the 72 | words in the subject line are keywords that are recognised ones. 73 | The recognised ones are: HELP, HOWTO and NEW. The possible 74 | return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED, 75 | UP_SUBJ_UNRECOG and UP_SUBJ_ALL_UNRECOG. 76 | 77 | UP_SUBJ_HELP_REQ means only HELP keyword is existent in the subject line 78 | UP_SUBJ_NEW_ENFORCED means only NEW keyword is existent in the subject line 79 | UP_SUBJ_UNRECOG means some unrecognised words found in subj line as well as 80 | at least one recognised one. 81 | UP_SUBJ_ALL_UNRECOG means all words were unrecognised ones (or subject 82 | line was empty or non-existent) 83 | UP_SUBJ_INVALID_COMB means an invalid combination in given in the subject line. 84 | */ 85 | up_subject_struct UP_subject_process(const char *arg){ 86 | 87 | up_subject_struct return_struct; 88 | char ** temp; 89 | int i; 90 | char * list_of_nonkeywords = NULL; 91 | char * subject_line = NULL; 92 | 93 | subject_line = strdup(arg); 94 | 95 | 96 | /* initialize the struct */ 97 | return_struct.result = UP_SUBJ_INIT; 98 | 99 | list_of_nonkeywords = strdup(""); 100 | 101 | /* convert \t, \r, \n chars to white spaces */ 102 | for(i=0; i < (strlen(subject_line)) ; i++){ 103 | 104 | if( subject_line[i] == '\t' || subject_line[i] == '\n' 105 | || subject_line[i] == '\r' ){ 106 | subject_line[i] = ' '; 107 | } 108 | } 109 | 110 | /* split the string into lines */ 111 | temp = g_strsplit (subject_line, " ", 0); 112 | 113 | for(i=0; temp[i] != NULL; i++){ 114 | if(strlen(temp[i]) > 0){ 115 | 116 | switch(up_classify_word(temp[i])){ 117 | case UP_KEYWORD_HELP: 118 | switch(return_struct.result){ 119 | 120 | case UP_SUBJ_INIT: 121 | return_struct.result = UP_SUBJ_HELP_REQ; break; 122 | case UP_SUBJ_HELP_REQ: break; 123 | case UP_SUBJ_NEW_ENFORCED: 124 | return_struct.result = UP_SUBJ_UNRECOG; break; 125 | case UP_SUBJ_UNRECOG: break; 126 | case UP_SUBJ_ALL_UNRECOG: 127 | return_struct.result = UP_SUBJ_UNRECOG; break; 128 | case UP_SUBJ_INVALID_COMB: break; 129 | default: ; 130 | }; break; 131 | 132 | 133 | case UP_KEYWORD_NEW: 134 | switch(return_struct.result){ 135 | 136 | case UP_SUBJ_INIT: 137 | return_struct.result = UP_SUBJ_NEW_ENFORCED; break; 138 | case UP_SUBJ_HELP_REQ: 139 | return_struct.result = UP_SUBJ_INVALID_COMB; break; 140 | case UP_SUBJ_NEW_ENFORCED: break; 141 | case UP_SUBJ_UNRECOG: break; 142 | case UP_SUBJ_ALL_UNRECOG: 143 | return_struct.result = UP_SUBJ_UNRECOG; break; 144 | case UP_SUBJ_INVALID_COMB: break; 145 | default: ; 146 | }; break; 147 | 148 | case UP_KEYWORD_UNRECOG: 149 | 150 | if(strlen(list_of_nonkeywords) == 0){ 151 | list_of_nonkeywords = (char *)realloc(list_of_nonkeywords, 152 | strlen(temp[i]) + 1); 153 | list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]); 154 | }else{ 155 | list_of_nonkeywords = (char *)realloc(list_of_nonkeywords, 156 | strlen(list_of_nonkeywords) + strlen(temp[i]) + 2); 157 | list_of_nonkeywords = strcat(list_of_nonkeywords, " "); 158 | list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]); 159 | }; 160 | 161 | switch(return_struct.result){ 162 | 163 | case UP_SUBJ_INIT: 164 | return_struct.result = UP_SUBJ_ALL_UNRECOG; break; 165 | case UP_SUBJ_HELP_REQ: 166 | return_struct.result = UP_SUBJ_UNRECOG; break; 167 | case UP_SUBJ_NEW_ENFORCED: 168 | return_struct.result = UP_SUBJ_UNRECOG; break; 169 | case UP_SUBJ_UNRECOG: break; 170 | case UP_SUBJ_ALL_UNRECOG: break; 171 | case UP_SUBJ_INVALID_COMB: 172 | return_struct.result = UP_SUBJ_UNRECOG; break; 173 | default: ; 174 | 175 | }; break; 176 | default: ; 177 | } 178 | } 179 | } 180 | 181 | if(return_struct.result == UP_SUBJ_INIT){/* There were no words in the subject */ 182 | return_struct.result = UP_SUBJ_ALL_UNRECOG; 183 | } 184 | 185 | return_struct.word_list = list_of_nonkeywords; 186 | 187 | free(subject_line); 188 | 189 | return return_struct; 190 | }