Skip to content

Commit 28e2b4b

Browse files
committed
signal error when there are parameters for BEGIN and END
and refactor syntactic checks to reduce manual currying
1 parent 08b35a4 commit 28e2b4b

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

glical_kernel.ml

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,33 @@ exception Syntax_error of string
5353
let syntax_error s ln cn =
5454
raise (Syntax_error (sprintf "(%d:%d): %s." ln cn s))
5555

56+
let syntax_error_ s (ln, cn) =
57+
raise (Syntax_error (sprintf "(%d:%d): %s." ln cn s))
58+
5659
let syntax_assert b s ln cn =
5760
if not b then syntax_error s ln cn
5861

62+
let syntax_assert_ b s (ln, cn) =
63+
if not b then syntax_error s ln cn
64+
5965
let syntax_warning s ln cn =
6066
eprintf "Warning (%d:%d): %s.\n" ln cn s
6167

68+
let syntax_warning_ s (ln, cn) =
69+
eprintf "Warning (%d:%d): %s.\n" ln cn s
70+
6271
let syntax_warning_if cond s ln cn =
6372
if cond then
6473
syntax_warning s ln cn
6574
else
6675
()
6776

77+
let syntax_warning_if_ cond s (ln, cn) =
78+
if cond then
79+
syntax_warning s ln cn
80+
else
81+
()
82+
6883

6984
(** http://tools.ietf.org/html/rfc5545#section-3.3.11 (TEXT) *)
7085
let text_of_raw (ln, cn) s =
@@ -389,20 +404,25 @@ let parse_ical l =
389404
| Some e -> syntax_error (sprintf "unclosed block %s" e) (-1) (-1);
390405
| None -> res, []
391406
end
392-
| {name="BEGIN"; value=e} as v::tl ->
393-
let block, tl = loop_rev [] (Some e) tl in
394-
loop ((Block(v.name_start, e, block))::res) ob tl
395-
| {name="END"; value=e} as v::tl ->
407+
| {name="BEGIN"; value} as v::tl ->
408+
syntax_assert_ (v.parameters = []) "unexpected parameters for BEGIN"
409+
v.name_start;
410+
let block, tl = loop_rev [] (Some value) tl in
411+
loop ((Block(v.name_start, value, block))::res) ob tl
412+
| {name="END"; value} as v::tl ->
413+
syntax_assert_ (v.parameters = []) "unexpected parameters for START"
414+
v.name_start;
415+
assert (v.parameters = []);
396416
begin match ob with
397-
| Some x when x = e ->
417+
| Some x when x = value ->
398418
res, tl
399419
| Some x ->
400-
syntax_error (sprintf "unexpected end of block %s, \
401-
expected end of block %s" x e)
402-
(fst v.name_start) (snd v.name_start)
420+
syntax_error_ (sprintf "unexpected end of block %s, \
421+
expected end of block %s" x value)
422+
v.name_start
403423
| None ->
404-
syntax_error (sprintf "unexpected end of block %s" e)
405-
(fst v.name_start) (snd v.name_start)
424+
syntax_error_ (sprintf "unexpected end of block %s" value)
425+
v.name_start
406426
end
407427
| {name; parameters; value} as v::tl ->
408428
let p =
@@ -420,8 +440,7 @@ let parse_ical l =
420440
| res, [] ->
421441
res
422442
| _, v::_ ->
423-
syntax_error (sprintf "unexpected data")
424-
(fst v.name_start) (snd v.name_start)
443+
syntax_error_ (sprintf "unexpected data") v.name_start
425444

426445

427446
(** [map] keeps location and section names, it applies the

0 commit comments

Comments
 (0)