/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following functions.
- up_classify_word
- UP_subject_process
- UP_subject_flags
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){
/* [<][>][^][v][top][bottom][index][help] */
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){
/* [<][>][^][v][top][bottom][index][help] */
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(){
/* [<][>][^][v][top][bottom][index][help] */
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 }