Selaa lähdekoodia

is_2rr moved into rr parser to allow its usage from other modules

Vaclav Kubart 18 vuotta sitten
vanhempi
commit
4efa8778ce
1 muutettua tiedostoa jossa 80 lisäystä ja 0 poistoa
  1. 80 0
      parser/parse_rr.h

+ 80 - 0
parser/parse_rr.h

@@ -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 */