1 | /*************************************** 2 | $Revision: 1.5 $ 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 | extern int help_requested; 39 | extern int enforced_new; 40 | 41 | /* 42 | Classifies the given word. The word can be HELP, HOWTO or NEW 43 | up_classify_word may return UP_KEYWORD_HELP (for HELP & HOWTO), 44 | UP_KEYWORD_NEW (for NEW) or UP_KEYWORD_UNRECOG (for all others). 45 | Comparisons are case insensitive. 46 | */ 47 | int up_classify_word(const char * word){ 48 | 49 | if(word == NULL){ 50 | return UP_KEYWORD_UNRECOG; 51 | } 52 | 53 | if( strcasecmp(word, "HOWTO") == 0 || strcasecmp(word, "HELP") == 0){ 54 | 55 | return UP_KEYWORD_HELP; 56 | 57 | }else if( strcasecmp(word, "NEW") == 0){ 58 | 59 | return UP_KEYWORD_NEW; 60 | 61 | }else{ 62 | 63 | return UP_KEYWORD_UNRECOG; 64 | 65 | } 66 | 67 | } 68 | 69 | 70 | 71 | 72 | /* UP_subject_process function gets the "Subject:" line of a 73 | update message and processes it. It tries to see if the 74 | words in the subject line are keywords that are recognised ones. 75 | The recognised ones are: HELP, HOWTO and NEW. The possible 76 | return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED, 77 | UP_SUBJ_UNRECOG and UP_SUBJ_ALL_UNRECOG. 78 | 79 | UP_SUBJ_HELP_REQ means only HELP keyword is existent in the subject line 80 | UP_SUBJ_NEW_ENFORCED means only NEW keyword is existent in the subject line 81 | UP_SUBJ_UNRECOG means some unrecognised words found in subj line as well as 82 | at least one recognised one. 83 | UP_SUBJ_ALL_UNRECOG means all words were unrecognised ones (or subject 84 | line was empty or non-existent) 85 | UP_SUBJ_INVALID_COMB means an invalid combination in given in the subject line. 86 | */ 87 | up_subject_struct UP_subject_process(const char *arg){ 88 | 89 | up_subject_struct return_struct; 90 | char ** temp; 91 | int i; 92 | char * list_of_nonkeywords = NULL; 93 | char * subject_line = NULL; 94 | 95 | subject_line = strdup(arg); 96 | 97 | 98 | /* initialize the struct */ 99 | return_struct.result = UP_SUBJ_INIT; 100 | 101 | list_of_nonkeywords = strdup(""); 102 | 103 | /* convert \t, \r, \n chars to white spaces */ 104 | for(i=0; i < (strlen(subject_line)) ; i++){ 105 | 106 | if( subject_line[i] == '\t' || subject_line[i] == '\n' 107 | || subject_line[i] == '\r' ){ 108 | subject_line[i] = ' '; 109 | } 110 | } 111 | 112 | /* split the string into lines */ 113 | temp = g_strsplit (subject_line, " ", 0); 114 | 115 | for(i=0; temp[i] != NULL; i++){ 116 | if(strlen(temp[i]) > 0){ 117 | 118 | switch(up_classify_word(temp[i])){ 119 | case UP_KEYWORD_HELP: 120 | switch(return_struct.result){ 121 | 122 | case UP_SUBJ_INIT: 123 | return_struct.result = UP_SUBJ_HELP_REQ; break; 124 | case UP_SUBJ_HELP_REQ: break; 125 | case UP_SUBJ_NEW_ENFORCED: 126 | return_struct.result = UP_SUBJ_INVALID_COMB; break; 127 | case UP_SUBJ_UNRECOG: break; 128 | case UP_SUBJ_ALL_UNRECOG: 129 | return_struct.result = UP_SUBJ_UNRECOG; break; 130 | case UP_SUBJ_INVALID_COMB: break; 131 | default: ; 132 | }; break; 133 | 134 | 135 | case UP_KEYWORD_NEW: 136 | switch(return_struct.result){ 137 | 138 | case UP_SUBJ_INIT: 139 | return_struct.result = UP_SUBJ_NEW_ENFORCED; break; 140 | case UP_SUBJ_HELP_REQ: 141 | return_struct.result = UP_SUBJ_INVALID_COMB; break; 142 | case UP_SUBJ_NEW_ENFORCED: break; 143 | case UP_SUBJ_UNRECOG: break; 144 | case UP_SUBJ_ALL_UNRECOG: 145 | return_struct.result = UP_SUBJ_UNRECOG; break; 146 | case UP_SUBJ_INVALID_COMB: break; 147 | default: ; 148 | }; break; 149 | 150 | case UP_KEYWORD_UNRECOG: 151 | 152 | if(strlen(list_of_nonkeywords) == 0){ 153 | list_of_nonkeywords = (char *)realloc(list_of_nonkeywords, 154 | strlen(temp[i]) + 1); 155 | list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]); 156 | }else{ 157 | list_of_nonkeywords = (char *)realloc(list_of_nonkeywords, 158 | strlen(list_of_nonkeywords) + strlen(temp[i]) + 2); 159 | list_of_nonkeywords = strcat(list_of_nonkeywords, " "); 160 | list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]); 161 | }; 162 | 163 | switch(return_struct.result){ 164 | 165 | case UP_SUBJ_INIT: 166 | return_struct.result = UP_SUBJ_ALL_UNRECOG; break; 167 | case UP_SUBJ_HELP_REQ: 168 | return_struct.result = UP_SUBJ_UNRECOG; break; 169 | case UP_SUBJ_NEW_ENFORCED: 170 | return_struct.result = UP_SUBJ_UNRECOG; break; 171 | case UP_SUBJ_UNRECOG: break; 172 | case UP_SUBJ_ALL_UNRECOG: break; 173 | case UP_SUBJ_INVALID_COMB: 174 | return_struct.result = UP_SUBJ_UNRECOG; break; 175 | default: ; 176 | 177 | }; break; 178 | default: ; 179 | } 180 | } 181 | } 182 | 183 | if(return_struct.result == UP_SUBJ_INIT){/* There were no words in the subject */ 184 | return_struct.result = UP_SUBJ_ALL_UNRECOG; 185 | } 186 | 187 | return_struct.word_list = list_of_nonkeywords; 188 | 189 | free(subject_line); 190 | 191 | return return_struct; 192 | } 193 | 194 | 195 | 196 | /* UP_subject_flags function gets the "Subject" type flags 197 | and processes them. 198 | The flags are to represent: HELP and NEW. The possible 199 | return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED, 200 | UP_SUBJ_ALL_UNRECOG, UP_SUBJ_INVALID_COMB.. 201 | 202 | UP_SUBJ_HELP_REQ means only HELP flag is set. 203 | UP_SUBJ_NEW_ENFORCED means only NEW flag is set. 204 | UP_SUBJ_ALL_UNRECOG means no flags set. 205 | UP_SUBJ_INVALID_COMB means an invalid combination of flags set. 206 | */ 207 | up_subject_struct UP_subject_flags(){ 208 | 209 | up_subject_struct return_struct; 210 | char * list_of_nonkeywords = NULL; 211 | 212 | /* initialize the struct */ 213 | return_struct.result = UP_SUBJ_INIT; 214 | 215 | list_of_nonkeywords = strdup(""); 216 | 217 | if ( help_requested && enforced_new ) 218 | return_struct.result = UP_SUBJ_INVALID_COMB; 219 | else if ( help_requested ) 220 | return_struct.result = UP_SUBJ_HELP_REQ; 221 | else if ( enforced_new ) 222 | return_struct.result = UP_SUBJ_NEW_ENFORCED; 223 | 224 | if ( return_struct.result == UP_SUBJ_INIT ){ 225 | /* There were no flags set */ 226 | return_struct.result = UP_SUBJ_ALL_UNRECOG; 227 | } 228 | 229 | return_struct.word_list = list_of_nonkeywords; 230 | 231 | return return_struct; 232 | }