trenni 3.8.0 → 3.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+
2
+ #pragma once
3
+
4
+ #include "trenni.h"
5
+
6
+ VALUE Trenni_Native_parse_query(VALUE self, VALUE string, VALUE delegate);
@@ -0,0 +1,82 @@
1
+
2
+ #include "query.h"
3
+
4
+ %%{
5
+ machine Trenni_query_parser;
6
+
7
+ action string_begin {
8
+ string_token.begin = p;
9
+ }
10
+
11
+ action string_end {
12
+ string_token.end = p;
13
+
14
+ rb_funcall(delegate, id_string, 2, Trenni_Token_string(string_token, encoding), encoded ? Qtrue : Qfalse);
15
+
16
+ encoded = 0;
17
+ }
18
+
19
+ action integer_begin {
20
+ integer_token.begin = p;
21
+ }
22
+
23
+ action integer_end {
24
+ integer_token.end = p;
25
+
26
+ rb_funcall(delegate, id_integer, 1, Trenni_Token_string(integer_token, encoding));
27
+ }
28
+
29
+ action append {
30
+ rb_funcall(delegate, id_append, 0);
31
+ }
32
+
33
+ action value_begin {
34
+ value_token.begin = p;
35
+ }
36
+
37
+ action value_end {
38
+ value_token.end = p;
39
+
40
+ rb_funcall(delegate, id_assign, 2, Trenni_Token_string(value_token, encoding), encoded ? Qtrue : Qfalse);
41
+
42
+ encoded = 0;
43
+ }
44
+
45
+ action pair {
46
+ rb_funcall(delegate, id_pair, 0);
47
+ }
48
+
49
+ action encoded {
50
+ encoded = 1;
51
+ }
52
+
53
+ include query "trenni/query.rl";
54
+
55
+ write data;
56
+ }%%
57
+
58
+ VALUE Trenni_Native_parse_query(VALUE self, VALUE buffer, VALUE delegate) {
59
+ VALUE string = rb_funcall(buffer, id_read, 0);
60
+
61
+ rb_encoding *encoding = rb_enc_get(string);
62
+
63
+ const char *s, *p, *pe, *eof;
64
+ unsigned long cs;
65
+
66
+ Trenni_Token string_token = {0}, integer_token = {0}, value_token = {0};
67
+ unsigned encoded = 0;
68
+
69
+ s = p = RSTRING_PTR(string);
70
+ eof = pe = p + RSTRING_LEN(string);
71
+
72
+ %%{
73
+ write init;
74
+ write exec;
75
+ }%%
76
+
77
+ if (p != eof) {
78
+ Trenni_raise_error("could not parse all input", buffer, p-s);
79
+ }
80
+
81
+ return Qnil;
82
+ }
@@ -73,13 +73,15 @@ static void Trenni_Tag_append_tag_attribute(VALUE buffer, VALUE key, VALUE value
73
73
  }
74
74
  }
75
75
 
76
- struct TagAttributeForeachArg {
76
+ typedef struct {
77
77
  VALUE buffer;
78
78
  VALUE prefix;
79
- };
79
+ } Trenni_Tag_Accumulation;
80
80
 
81
- static int Trenni_Tag_append_tag_attribute_foreach(VALUE key, VALUE value, struct TagAttributeForeachArg * arg) {
82
- Trenni_Tag_append_tag_attribute(arg->buffer, key, value, arg->prefix);
81
+ static int Trenni_Tag_append_tag_attribute_foreach(VALUE key, VALUE value, VALUE _argument) {
82
+ Trenni_Tag_Accumulation * argument = (Trenni_Tag_Accumulation *)_argument;
83
+
84
+ Trenni_Tag_append_tag_attribute(argument->buffer, key, value, argument->prefix);
83
85
 
84
86
  return ST_CONTINUE;
85
87
  }
@@ -88,8 +90,8 @@ VALUE Trenni_Tag_append_attributes(VALUE self, VALUE buffer, VALUE attributes, V
88
90
  int type = rb_type(attributes);
89
91
 
90
92
  if (type == T_HASH) {
91
- struct TagAttributeForeachArg arg = {buffer, prefix};
92
- rb_hash_foreach(attributes, &Trenni_Tag_append_tag_attribute_foreach, (VALUE)&arg);
93
+ Trenni_Tag_Accumulation argument = {buffer, prefix};
94
+ rb_hash_foreach(attributes, &Trenni_Tag_append_tag_attribute_foreach, (VALUE)&argument);
93
95
  } else if (type == T_ARRAY) {
94
96
  long i;
95
97
 
@@ -27,7 +27,7 @@ VALUE Trenni_Native_parse_template(VALUE self, VALUE buffer, VALUE delegate) {
27
27
  const char *s, *p, *pe, *eof, *ts, *te;
28
28
  unsigned long cs, act, top = 0, stack[32] = {0};
29
29
 
30
- Token expression = {0}, instruction = {0};
30
+ Trenni_Token expression = {0}, instruction = {0};
31
31
 
32
32
  s = p = RSTRING_PTR(string);
33
33
  eof = pe = p + RSTRING_LEN(string);
@@ -142,7 +142,7 @@ tr14:
142
142
  { switch( act ) {
143
143
  case 3:
144
144
  {{p = ((te))-1;}
145
- rb_funcall(delegate, id_instruction, 1, Trenni_token(instruction, encoding));
145
+ rb_funcall(delegate, id_instruction, 1, Trenni_Token_string(instruction, encoding));
146
146
  }
147
147
  break;
148
148
  case 6:
@@ -156,7 +156,7 @@ tr14:
156
156
  tr15:
157
157
  #line 19 "template.rl"
158
158
  {te = p+1;{
159
- rb_funcall(delegate, id_instruction, 2, Trenni_token(instruction, encoding), newline);
159
+ rb_funcall(delegate, id_instruction, 2, Trenni_Token_string(instruction, encoding), newline);
160
160
  }}
161
161
  goto st43;
162
162
  tr23:
@@ -183,13 +183,13 @@ tr82:
183
183
  {
184
184
  expression.begin = p;
185
185
  }
186
- #line 53 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
186
+ #line 53 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
187
187
  {te = p;p--;{cs = 32;}}
188
188
  goto _again;
189
189
  tr83:
190
190
  #line 15 "template.rl"
191
191
  {te = p;p--;{
192
- rb_funcall(delegate, id_instruction, 1, Trenni_token(instruction, encoding));
192
+ rb_funcall(delegate, id_instruction, 1, Trenni_Token_string(instruction, encoding));
193
193
  }}
194
194
  goto st43;
195
195
  st43:
@@ -525,8 +525,8 @@ case 48:
525
525
  goto st11;
526
526
  goto tr83;
527
527
  tr31:
528
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
529
- {{stack[top++] = 21; goto st21;}}
528
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
529
+ {{stack[top++] = 21;goto st21;}}
530
530
  goto st21;
531
531
  st21:
532
532
  #line 1 "NONE"
@@ -543,8 +543,8 @@ case 21:
543
543
  }
544
544
  goto st21;
545
545
  tr47:
546
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
547
- {{stack[top++] = 22; goto st21;}}
546
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
547
+ {{stack[top++] = 22;goto st21;}}
548
548
  goto st22;
549
549
  st22:
550
550
  #line 1 "NONE"
@@ -559,14 +559,14 @@ case 22:
559
559
  }
560
560
  goto st22;
561
561
  tr37:
562
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
563
- {{stack[top++] = 23; goto st21;}}
562
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
563
+ {{stack[top++] = 23;goto st21;}}
564
564
  goto st23;
565
565
  tr39:
566
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
567
- {{stack[top++] = 23; goto st21;}}
568
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
569
- {{stack[top++] = 23; goto st21;}}
566
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
567
+ {{stack[top++] = 23;goto st21;}}
568
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
569
+ {{stack[top++] = 23;goto st21;}}
570
570
  goto st23;
571
571
  st23:
572
572
  #line 1 "NONE"
@@ -594,8 +594,8 @@ case 24:
594
594
  }
595
595
  goto st23;
596
596
  tr46:
597
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
598
- {{stack[top++] = 25; goto st21;}}
597
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
598
+ {{stack[top++] = 25;goto st21;}}
599
599
  goto st25;
600
600
  st25:
601
601
  #line 1 "NONE"
@@ -611,14 +611,14 @@ case 25:
611
611
  }
612
612
  goto st25;
613
613
  tr43:
614
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
615
- {{stack[top++] = 26; goto st21;}}
614
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
615
+ {{stack[top++] = 26;goto st21;}}
616
616
  goto st26;
617
617
  tr45:
618
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
619
- {{stack[top++] = 26; goto st21;}}
620
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
621
- {{stack[top++] = 26; goto st21;}}
618
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
619
+ {{stack[top++] = 26;goto st21;}}
620
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
621
+ {{stack[top++] = 26;goto st21;}}
622
622
  goto st26;
623
623
  st26:
624
624
  #line 1 "NONE"
@@ -644,7 +644,7 @@ case 27:
644
644
  }
645
645
  goto st26;
646
646
  tr44:
647
- #line 20 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
647
+ #line 20 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
648
648
  {{cs = stack[--top];goto _again;}}
649
649
  goto st49;
650
650
  st49:
@@ -670,7 +670,7 @@ case 28:
670
670
  }
671
671
  goto st25;
672
672
  tr38:
673
- #line 20 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
673
+ #line 20 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
674
674
  {{cs = stack[--top];goto _again;}}
675
675
  goto st50;
676
676
  st50:
@@ -701,8 +701,8 @@ case 30:
701
701
  goto st31;
702
702
  goto st30;
703
703
  tr49:
704
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
705
- {{stack[top++] = 31; goto st21;}}
704
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
705
+ {{stack[top++] = 31;goto st21;}}
706
706
  goto st31;
707
707
  st31:
708
708
  #line 1 "NONE"
@@ -718,7 +718,7 @@ case 31:
718
718
  }
719
719
  goto st31;
720
720
  tr50:
721
- #line 20 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
721
+ #line 20 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
722
722
  {{cs = stack[--top];goto _again;}}
723
723
  goto st51;
724
724
  st51:
@@ -730,7 +730,7 @@ case 51:
730
730
  goto st31;
731
731
  goto st30;
732
732
  tr32:
733
- #line 20 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
733
+ #line 20 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
734
734
  {{cs = stack[--top];goto _again;}}
735
735
  goto st52;
736
736
  st52:
@@ -740,8 +740,8 @@ case 52:
740
740
  #line 741 "template.c"
741
741
  goto st0;
742
742
  tr54:
743
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
744
- {{stack[top++] = 32; goto st21;}}
743
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
744
+ {{stack[top++] = 32;goto st21;}}
745
745
  goto st32;
746
746
  st32:
747
747
  #line 1 "NONE"
@@ -758,8 +758,8 @@ case 32:
758
758
  }
759
759
  goto st32;
760
760
  tr70:
761
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
762
- {{stack[top++] = 33; goto st21;}}
761
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
762
+ {{stack[top++] = 33;goto st21;}}
763
763
  goto st33;
764
764
  st33:
765
765
  #line 1 "NONE"
@@ -774,14 +774,14 @@ case 33:
774
774
  }
775
775
  goto st33;
776
776
  tr60:
777
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
778
- {{stack[top++] = 34; goto st21;}}
777
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
778
+ {{stack[top++] = 34;goto st21;}}
779
779
  goto st34;
780
780
  tr62:
781
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
782
- {{stack[top++] = 34; goto st21;}}
783
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
784
- {{stack[top++] = 34; goto st21;}}
781
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
782
+ {{stack[top++] = 34;goto st21;}}
783
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
784
+ {{stack[top++] = 34;goto st21;}}
785
785
  goto st34;
786
786
  st34:
787
787
  #line 1 "NONE"
@@ -809,8 +809,8 @@ case 35:
809
809
  }
810
810
  goto st34;
811
811
  tr69:
812
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
813
- {{stack[top++] = 36; goto st21;}}
812
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
813
+ {{stack[top++] = 36;goto st21;}}
814
814
  goto st36;
815
815
  st36:
816
816
  #line 1 "NONE"
@@ -826,14 +826,14 @@ case 36:
826
826
  }
827
827
  goto st36;
828
828
  tr66:
829
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
830
- {{stack[top++] = 37; goto st21;}}
829
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
830
+ {{stack[top++] = 37;goto st21;}}
831
831
  goto st37;
832
832
  tr68:
833
- #line 13 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
834
- {{stack[top++] = 37; goto st21;}}
835
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
836
- {{stack[top++] = 37; goto st21;}}
833
+ #line 13 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
834
+ {{stack[top++] = 37;goto st21;}}
835
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
836
+ {{stack[top++] = 37;goto st21;}}
837
837
  goto st37;
838
838
  st37:
839
839
  #line 1 "NONE"
@@ -866,9 +866,9 @@ tr67:
866
866
  }
867
867
  #line 35 "template.rl"
868
868
  {
869
- rb_funcall(delegate, id_expression, 1, Trenni_token(expression, encoding));
869
+ rb_funcall(delegate, id_expression, 1, Trenni_Token_string(expression, encoding));
870
870
  }
871
- #line 21 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
871
+ #line 21 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
872
872
  {cs = 43;}
873
873
  goto _again;
874
874
  st53:
@@ -901,9 +901,9 @@ tr61:
901
901
  }
902
902
  #line 35 "template.rl"
903
903
  {
904
- rb_funcall(delegate, id_expression, 1, Trenni_token(expression, encoding));
904
+ rb_funcall(delegate, id_expression, 1, Trenni_Token_string(expression, encoding));
905
905
  }
906
- #line 21 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
906
+ #line 21 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
907
907
  {cs = 43;}
908
908
  goto _again;
909
909
  st54:
@@ -934,8 +934,8 @@ case 41:
934
934
  goto st42;
935
935
  goto st41;
936
936
  tr72:
937
- #line 17 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
938
- {{stack[top++] = 42; goto st21;}}
937
+ #line 17 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
938
+ {{stack[top++] = 42;goto st21;}}
939
939
  goto st42;
940
940
  st42:
941
941
  #line 1 "NONE"
@@ -958,9 +958,9 @@ tr73:
958
958
  }
959
959
  #line 35 "template.rl"
960
960
  {
961
- rb_funcall(delegate, id_expression, 1, Trenni_token(expression, encoding));
961
+ rb_funcall(delegate, id_expression, 1, Trenni_Token_string(expression, encoding));
962
962
  }
963
- #line 21 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
963
+ #line 21 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
964
964
  {cs = 43;}
965
965
  goto _again;
966
966
  st55:
@@ -979,9 +979,9 @@ tr55:
979
979
  }
980
980
  #line 35 "template.rl"
981
981
  {
982
- rb_funcall(delegate, id_expression, 1, Trenni_token(expression, encoding));
982
+ rb_funcall(delegate, id_expression, 1, Trenni_Token_string(expression, encoding));
983
983
  }
984
- #line 21 "/Users/samuel/Documents/Programming/ioquatix/trenni/parsers/trenni/template.rl"
984
+ #line 21 "/home/samuel/Documents/ioquatix/trenni/parsers/trenni/template.rl"
985
985
  {cs = 43;}
986
986
  goto _again;
987
987
  st56:
@@ -13,11 +13,11 @@
13
13
  }
14
14
 
15
15
  action emit_instruction {
16
- rb_funcall(delegate, id_instruction, 1, Trenni_token(instruction, encoding));
16
+ rb_funcall(delegate, id_instruction, 1, Trenni_Token_string(instruction, encoding));
17
17
  }
18
18
 
19
19
  action emit_instruction_line {
20
- rb_funcall(delegate, id_instruction, 2, Trenni_token(instruction, encoding), newline);
20
+ rb_funcall(delegate, id_instruction, 2, Trenni_Token_string(instruction, encoding), newline);
21
21
  }
22
22
 
23
23
  action instruction_error {
@@ -33,7 +33,7 @@
33
33
  }
34
34
 
35
35
  action emit_expression {
36
- rb_funcall(delegate, id_expression, 1, Trenni_token(expression, encoding));
36
+ rb_funcall(delegate, id_expression, 1, Trenni_Token_string(expression, encoding));
37
37
  }
38
38
 
39
39
  action expression_error {
@@ -59,7 +59,7 @@ VALUE Trenni_Native_parse_template(VALUE self, VALUE buffer, VALUE delegate) {
59
59
  const char *s, *p, *pe, *eof, *ts, *te;
60
60
  unsigned long cs, act, top = 0, stack[32] = {0};
61
61
 
62
- Token expression = {0}, instruction = {0};
62
+ Trenni_Token expression = {0}, instruction = {0};
63
63
 
64
64
  s = p = RSTRING_PTR(string);
65
65
  eof = pe = p + RSTRING_LEN(string);
@@ -3,11 +3,12 @@
3
3
 
4
4
  #include "markup.h"
5
5
  #include "template.h"
6
+ #include "query.h"
6
7
  #include "tag.h"
7
8
  #include "escape.h"
8
9
 
9
10
  VALUE rb_Trenni = Qnil, rb_Trenni_Native = Qnil, rb_Trenni_Tag = Qnil, rb_Trenni_Markup = Qnil, rb_Trenni_MarkupString = Qnil, rb_Trenni_ParseError = Qnil;
10
- ID id_cdata, id_open_tag_begin, id_open_tag_end, id_attribute, id_close_tag, id_text, id_doctype, id_comment, id_instruction, id_read, id_expression, id_key_get, id_new, id_name, id_attributes, id_closed, id_to_s, id_is_a;
11
+ ID id_cdata, id_open_tag_begin, id_open_tag_end, id_attribute, id_close_tag, id_text, id_doctype, id_comment, id_instruction, id_read, id_expression, id_key_get, id_string, id_integer, id_append, id_assign, id_pair, id_new, id_name, id_attributes, id_closed, id_to_s, id_is_a;
11
12
 
12
13
  void Trenni_raise_error(const char * message, VALUE buffer, size_t offset) {
13
14
  VALUE exception = rb_funcall(rb_Trenni_ParseError, id_new, 3, rb_str_new_cstr(message), buffer, ULONG2NUM(offset));
@@ -37,6 +38,12 @@ void Init_trenni() {
37
38
 
38
39
  id_key_get = rb_intern("[]");
39
40
 
41
+ id_string = rb_intern("string");
42
+ id_integer = rb_intern("integer");
43
+ id_append = rb_intern("append");
44
+ id_assign = rb_intern("assign");
45
+ id_pair = rb_intern("pair");
46
+
40
47
  id_to_s = rb_intern("to_s");
41
48
  id_is_a = rb_intern("is_a?");
42
49
 
@@ -50,6 +57,7 @@ void Init_trenni() {
50
57
 
51
58
  rb_define_module_function(rb_Trenni_Native, "parse_markup", Trenni_Native_parse_markup, 3);
52
59
  rb_define_module_function(rb_Trenni_Native, "parse_template", Trenni_Native_parse_template, 2);
60
+ rb_define_module_function(rb_Trenni_Native, "parse_query", Trenni_Native_parse_query, 2);
53
61
 
54
62
  rb_Trenni_Tag = rb_const_get_at(rb_Trenni, rb_intern("Tag"));
55
63