1477
1477
TSD#'TerminationStateDescriptor'{propertyParms = lists:reverse(PP)}.
1480
-ifdef(megaco_nscanner_props).
1480
1482
-ifdef(megaco_parser_inline).
1481
1483
-compile({inline,[{ensure_prop_groups,1}]}).
1483
1485
ensure_prop_groups(Token) ->
1484
1486
{_TokenTag, _Line, Text} = Token,
1487
parse_prop_name(Text, Group, Groups).
1488
parse_prop_name(Text, Group).
1489
parse_prop_name([Char | Rest] = All, Group, Groups) ->
1490
parse_prop_name([Char | Rest] = All, Group) ->
1491
1492
?white_space(Char) ->
1492
parse_prop_name(Rest, Group, Groups);
1493
parse_prop_name(Rest, Group);
1493
1494
?end_of_line(Char) ->
1494
parse_prop_name(Rest, Group, Groups);
1495
parse_prop_name(Rest, Group);
1497
do_parse_prop_name(All, Name, Group, Groups)
1498
do_parse_prop_name(All, Name, Group)
1499
parse_prop_name([] = All, Group, Groups) ->
1500
parse_prop_name([] = All, Group) ->
1501
do_parse_prop_name(All, Name, Group, Groups).
1502
do_parse_prop_name(All, Name, Group).
1503
do_parse_prop_name([Char | Rest], Name, Group, Groups)
1504
do_parse_prop_name([Char | Rest], Name, Group)
1504
1505
when (Char =:= $=) andalso (Name =/= []) ->
1505
1506
%% Now we have a complete name
1507
1508
(Name =:= "v") andalso (Group =/= []) ->
1508
1509
%% v= is a property group delimiter,
1509
1510
%% lets create yet another property group.
1510
Groups2 = [lists:reverse(Group) | Groups],
1512
parse_prop_value(Rest, Name, Group2, Groups2);
1512
[lists:reverse(Group) | parse_prop_value(Rest, Name, NewGroup)];
1514
1514
%% Use current property group
1515
parse_prop_value(Rest, Name, Group, Groups)
1515
parse_prop_value(Rest, Name, Group)
1517
do_parse_prop_name([Char | Rest], Name, Group, Groups) ->
1517
do_parse_prop_name([Char | Rest], Name, Group) ->
1518
1518
case ?classify_char4(Char) of
1519
1519
safe_char_upper ->
1520
do_parse_prop_name(Rest, [Char | Name], Group, Groups);
1520
do_parse_prop_name(Rest, [Char | Name], Group);
1522
do_parse_prop_name(Rest, [Char | Name], Group, Groups);
1522
do_parse_prop_name(Rest, [Char | Name], Group);
1524
1524
return_error(0, {bad_prop_name, lists:reverse(Name), Char})
1526
do_parse_prop_name([], [], [], Groups) ->
1527
lists:reverse(Groups);
1528
do_parse_prop_name([], [], Group, Groups) ->
1529
Group2 = lists:reverse(Group),
1530
lists:reverse([Group2 | Groups]);
1531
do_parse_prop_name([], Name, Group, Groups) when Name =/= [] ->
1526
do_parse_prop_name([], [], []) ->
1528
do_parse_prop_name([], [], Group) ->
1529
[lists:reverse(Group)];
1530
do_parse_prop_name([], Name, Group) when Name =/= [] ->
1532
1531
%% Assume end of line
1534
PP = make_prop_parm(Name, Value),
1533
PP = make_prop_parm(Name, Value),
1535
1534
Group2 = lists:reverse([PP | Group]),
1536
lists:reverse([Group2 | Groups]).
1538
1537
-ifdef(megaco_parser_inline).
1539
-compile({inline,[{parse_prop_value,4}]}).
1538
-compile({inline,[{parse_prop_value,3}]}).
1541
parse_prop_value(Chars, Name, Group, Groups) ->
1540
parse_prop_value(Chars, Name, Group) ->
1543
do_parse_prop_value(Chars, Name, Value, Group, Groups).
1542
do_parse_prop_value(Chars, Name, Value, Group).
1545
do_parse_prop_value([Char | Rest], Name, Value, Group, Groups) ->
1544
do_parse_prop_value([Char | Rest], Name, Value, Group) ->
1547
1546
?end_of_line(Char) ->
1548
1547
%% Now we have a complete "name=value" pair
1549
1548
PP = make_prop_parm(Name, Value),
1550
parse_prop_name(Rest, [PP | Group], Groups);
1549
parse_prop_name(Rest, [PP | Group]);
1552
do_parse_prop_value(Rest, Name, [Char | Value], Group, Groups)
1551
do_parse_prop_value(Rest, Name, [Char | Value], Group)
1554
do_parse_prop_value([], Name, Value, Group, Groups) ->
1553
do_parse_prop_value([], Name, Value, Group) ->
1555
1554
%% Assume end of line
1556
PP = make_prop_parm(Name, Value),
1555
PP = make_prop_parm(Name, Value),
1557
1556
Group2 = lists:reverse([PP | Group]),
1558
lists:reverse([Group2 | Groups]).
1560
1559
-ifdef(megaco_parser_inline).
1561
1560
-compile({inline,[{make_prop_parm,2}]}).
1564
1563
#'PropertyParm'{name = lists:reverse(Name),
1565
1564
value = [lists:reverse(Value)]}.
1566
-else. % -ifdef(megaco_nscanner_props).
1568
-ifdef(megaco_parser_inline).
1569
-compile({inline,[{ensure_prop_groups,1}]}).
1571
ensure_prop_groups(Token) ->
1572
{_TokenTag, _Line, Groups} = Token,
1575
%% do_ensure_prop_groups(Groups) when is_list(Groups) ->
1576
%% [ensure_prop_group(Group) || Group <- Groups];
1577
%% do_ensure_prop_groups(BadGroups) ->
1578
%% throw({error, {?MODULE, {bad_property_groups, BadGroups}}}).
1580
%% -ifdef(megaco_parser_inline).
1581
%% -compile({inline,[{ensure_prop_group,1}]}).
1583
%% ensure_prop_group(Group) when is_list(Group) ->
1584
%% [ensure_prop_parm(PropParm) || PropParm <- Group];
1585
%% ensure_prop_group(BadGroup) ->
1586
%% throw({error, {?MODULE, {bad_property_group, BadGroup}}}).
1588
%% -ifdef(megaco_parser_inline).
1589
%% -compile({inline,[{ensure_prop_parm,1}]}).
1591
%% ensure_prop_parm(#property_parm{name = Name,
1592
%% value = Value}) ->
1593
%% #'PropertyParm'{name = Name,
1595
%% ensure_prop_parm(PP) when is_record(PP, 'PropertyParm') ->
1597
%% ensure_prop_parm(BadPropParm) ->
1598
%% throw({error, {?MODULE, {bad_property_parm, BadPropParm}}}).
1600
-endif. % -ifdef(megaco_nscanner_props).
1567
1602
-ifdef(megaco_parser_inline).
1568
1603
-compile({inline,[{ensure_uint,3}]}).