|
@@ -91,5 +91,85 @@ int duplicate_rr(rr_t** _new, rr_t* _r);
|
|
|
*/
|
|
|
int shm_duplicate_rr(rr_t** _new, rr_t* _r);
|
|
|
|
|
|
+/*
|
|
|
+ * Find out if a URI contains r2 parameter which indicates
|
|
|
+ * that we put 2 record routes
|
|
|
+ */
|
|
|
+static inline int is_2rr(str* _params)
|
|
|
+{
|
|
|
+ str s;
|
|
|
+ int i, state = 0;
|
|
|
+
|
|
|
+ if (_params->len == 0) return 0;
|
|
|
+ s = *_params;
|
|
|
+
|
|
|
+ for(i = 0; i < s.len; i++) {
|
|
|
+ switch(state) {
|
|
|
+ case 0:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case ' ':
|
|
|
+ case '\r':
|
|
|
+ case '\n':
|
|
|
+ case '\t': break;
|
|
|
+ case 'r':
|
|
|
+ case 'R': state = 1; break;
|
|
|
+ default: state = 4; break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 1:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case '2': state = 2; break;
|
|
|
+ default: state = 4; break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case ';': return 1;
|
|
|
+ case '=': return 1;
|
|
|
+ case ' ':
|
|
|
+ case '\r':
|
|
|
+ case '\n':
|
|
|
+ case '\t': state = 3; break;
|
|
|
+ default: state = 4; break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 3:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case ';': return 1;
|
|
|
+ case '=': return 1;
|
|
|
+ case ' ':
|
|
|
+ case '\r':
|
|
|
+ case '\n':
|
|
|
+ case '\t': break;
|
|
|
+ default: state = 4; break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 4:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case '\"': state = 5; break;
|
|
|
+ case ';': state = 0; break;
|
|
|
+ default: break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 5:
|
|
|
+ switch(s.s[i]) {
|
|
|
+ case '\\': state = 6; break;
|
|
|
+ case '\"': state = 4; break;
|
|
|
+ default: break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 6: state = 5; break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((state == 2) || (state == 3)) return 1;
|
|
|
+ else return 0;
|
|
|
+}
|
|
|
|
|
|
#endif /* PARSE_RR_H */
|