📄 megaco_text_parser_prev3c.hrl
字号:
do_merge_action_request([H|T], CmdReqs, CtxReq, CtxAuditReq, CtxId) -> case H of {commandRequest, CmdReq} -> do_merge_action_request(T, [CmdReq|CmdReqs], CtxReq, CtxAuditReq, CtxId); {contextProp, ContextProp} -> do_merge_action_request(T, CmdReqs, merge_context_request(CtxReq, ContextProp), CtxAuditReq, CtxId); {contextAudit, ContextAuditReq} when CtxAuditReq == asn1_NOVALUE -> do_merge_action_request(T, CmdReqs, CtxReq, ContextAuditReq, CtxId) end;do_merge_action_request([], CmdReqs, CtxReq, CtxAuditReq, CtxId) -> #'ActionRequest'{contextId = CtxId, contextRequest = strip_ContextRequest(CtxReq), contextAttrAuditReq = strip_ContextAttrAuditRequest(CtxAuditReq), commandRequests = lists:reverse(CmdReqs)}.%% OTP-5085: %% In order to solve a problem in the parser, the error descriptor%% has been put last in the non-empty commandReplyList, if it is not %% asn1_NOVALUEmerge_action_reply(Items) -> do_merge_action_reply(Items, asn1_NOVALUE, asn1_NOVALUE, []).do_merge_action_reply([], Err, Ctx, Cmds) -> #'ActionReply'{errorDescriptor = Err, contextReply = strip_ContextRequest(Ctx), commandReply = lists:reverse(Cmds)};do_merge_action_reply([H|T], Err0, CR, Cmds) -> case H of {error, Err1} when Err0 == asn1_NOVALUE -> do_merge_action_reply(T, Err1, CR, Cmds); {command, Cmd} -> do_merge_action_reply(T, Err0, CR, [Cmd | Cmds]); {context, CtxProp} -> do_merge_action_reply(T, Err0, merge_context_request(CR, CtxProp), Cmds) end.merge_auditOther([TID], TAR) -> {auditResult, #'AuditResult'{terminationID = TID, terminationAuditResult = TAR}};merge_auditOther(TIDs, TAR) -> {auditResultTermList, #'TermListAuditResult'{terminationIDList = TIDs, terminationAuditResult = TAR}}.strip_ContextRequest(#'ContextRequest'{priority = asn1_NOVALUE, emergency = asn1_NOVALUE, topologyReq = asn1_NOVALUE, iepscallind = asn1_NOVALUE, contextProp = asn1_NOVALUE, contextList = asn1_NOVALUE}) -> asn1_NOVALUE;strip_ContextRequest(#'ContextRequest'{priority = asn1_NOVALUE, emergency = asn1_NOVALUE, topologyReq = asn1_NOVALUE, iepscallind = asn1_NOVALUE, contextProp = [], contextList = asn1_NOVALUE}) -> asn1_NOVALUE;%% strip_ContextRequest(asn1_NOVALUE) ->%% asn1_NOVALUE;strip_ContextRequest(R) -> R.strip_ContextAttrAuditRequest( #'ContextAttrAuditRequest'{priority = asn1_NOVALUE, emergency = asn1_NOVALUE, topology = asn1_NOVALUE, iepscallind = asn1_NOVALUE, contextPropAud = asn1_NOVALUE, selectpriority = asn1_NOVALUE, selectemergency = asn1_NOVALUE, selectiepscallind = asn1_NOVALUE, selectLogic = asn1_NOVALUE}) -> asn1_NOVALUE;strip_ContextAttrAuditRequest( #'ContextAttrAuditRequest'{priority = asn1_NOVALUE, emergency = asn1_NOVALUE, topology = asn1_NOVALUE, iepscallind = asn1_NOVALUE, contextPropAud = [], selectpriority = asn1_NOVALUE, selectemergency = asn1_NOVALUE, selectiepscallind = asn1_NOVALUE, selectLogic = asn1_NOVALUE}) -> asn1_NOVALUE;strip_ContextAttrAuditRequest(R) -> R.merge_AmmRequest_descriptors([], Acc) -> lists:reverse(Acc);merge_AmmRequest_descriptors([{_, deprecated}|Descs], Acc) -> merge_AmmRequest_descriptors(Descs, Acc);merge_AmmRequest_descriptors([Desc|Descs], Acc) -> merge_AmmRequest_descriptors(Descs, [Desc|Acc]).make_auditRequest([TID], AD) -> #'AuditRequest'{terminationID = TID, auditDescriptor = AD};make_auditRequest([TID|_] = TIDList, AD) -> #'AuditRequest'{terminationID = TID, auditDescriptor = AD, terminationIDList = TIDList}. make_commandRequest({CmdTag, {_TokenTag, _Line, Text}}, Cmd) -> Req = #'CommandRequest'{command = {CmdTag, Cmd}}, case Text of [$w, $- | _] -> Req#'CommandRequest'{wildcardReturn = 'NULL'}; [$o, $-, $w, $- | _] -> Req#'CommandRequest'{optional = 'NULL', wildcardReturn = 'NULL'}; [$o, $- | _] -> Req#'CommandRequest'{optional = 'NULL'}; _ -> Req end.merge_terminationAudit(AuditReturnParameters) -> lists:reverse(do_merge_terminationAudit(AuditReturnParameters, [], [])).do_merge_terminationAudit([H| T], ARPs, AuditItems) -> case H of {auditReturnItem, AuditItem} -> do_merge_terminationAudit(T, ARPs, [AuditItem | AuditItems]); AuditReturnParameter -> do_merge_terminationAudit(T, [AuditReturnParameter | ARPs], AuditItems) end;do_merge_terminationAudit([], AuditReturnParameters, []) -> AuditReturnParameters;do_merge_terminationAudit([], AuditReturnParameters, AuditItems) -> AuditDescriptor = #'AuditDescriptor'{auditToken = AuditItems}, AuditReturnParameter = {emptyDescriptors, AuditDescriptor}, [AuditReturnParameter | AuditReturnParameters]. merge_mediaDescriptor(MediaParms) -> do_merge_mediaDescriptor(MediaParms, asn1_NOVALUE, [], []).do_merge_mediaDescriptor([H | T], TS, One, Multi) -> case H of {streamParm, Parm} when Multi == [] -> do_merge_mediaDescriptor(T, TS, [Parm | One], Multi); {streamDescriptor, Desc} when One == [] -> do_merge_mediaDescriptor(T, TS, One, [Desc | Multi]); {termState, TS2} when TS == asn1_NOVALUE -> do_merge_mediaDescriptor(T, TS2, One, Multi); _ -> return_error(0, {bad_merge_mediaDescriptor, [H, TS, One, Multi]}) end;do_merge_mediaDescriptor([], TS, One, Multi) -> if One == [], Multi == [] -> #'MediaDescriptor'{streams = asn1_NOVALUE, termStateDescr = TS}; One /= [], Multi == [] -> #'MediaDescriptor'{streams = {oneStream, merge_streamParms(One)}, termStateDescr = TS}; One == [], Multi /= [] -> #'MediaDescriptor'{streams = {multiStream, lists:reverse(Multi)}, termStateDescr = TS} end. merge_streamParms(TaggedStreamParms) -> SP = #'StreamParms'{}, do_merge_streamParms(TaggedStreamParms, SP).do_merge_streamParms([{Tag, D} | T] = All, SP) -> case Tag of local when SP#'StreamParms'.localDescriptor == asn1_NOVALUE -> do_merge_streamParms(T, SP#'StreamParms'{localDescriptor = D}); remote when SP#'StreamParms'.remoteDescriptor == asn1_NOVALUE -> do_merge_streamParms(T, SP#'StreamParms'{remoteDescriptor = D}); control -> LCD = case SP#'StreamParms'.localControlDescriptor of asn1_NOVALUE -> #'LocalControlDescriptor'{propertyParms = []}; PrevLCD -> PrevLCD end, LCD2 = do_merge_control_streamParms(D, LCD), do_merge_streamParms(T, SP#'StreamParms'{localControlDescriptor = LCD2}); statistics when SP#'StreamParms'.statisticsDescriptor == asn1_NOVALUE -> do_merge_streamParms(T, SP#'StreamParms'{statisticsDescriptor = D}); _ -> return_error(0, {do_merge_streamParms, [All, SP]}) end;do_merge_streamParms([], SP) when record(SP#'StreamParms'.localControlDescriptor, 'LocalControlDescriptor') -> LCD = SP#'StreamParms'.localControlDescriptor, PP = LCD#'LocalControlDescriptor'.propertyParms, LCD2 = LCD#'LocalControlDescriptor'{propertyParms = lists:reverse(PP)}, SP#'StreamParms'{localControlDescriptor = LCD2};do_merge_streamParms([], SP) -> SP.do_merge_control_streamParms([{SubTag, SD} | T] = All, LCD) -> case SubTag of group when LCD#'LocalControlDescriptor'.reserveGroup == asn1_NOVALUE -> LCD2 = LCD#'LocalControlDescriptor'{reserveGroup = SD}, do_merge_control_streamParms(T, LCD2); value when LCD#'LocalControlDescriptor'.reserveValue == asn1_NOVALUE -> LCD2 = LCD#'LocalControlDescriptor'{reserveValue = SD}, do_merge_control_streamParms(T, LCD2); mode when LCD#'LocalControlDescriptor'.streamMode == asn1_NOVALUE -> LCD2 = LCD#'LocalControlDescriptor'{streamMode = SD}, do_merge_control_streamParms(T, LCD2); prop -> PP = LCD#'LocalControlDescriptor'.propertyParms, LCD2 = LCD#'LocalControlDescriptor'{propertyParms = [SD | PP]}, do_merge_control_streamParms(T, LCD2); _ -> return_error(0, {do_merge_control_streamParms, [All, LCD]}) end;do_merge_control_streamParms([], LCD) -> LCD.merge_terminationStateDescriptor(Parms) -> TSD = #'TerminationStateDescriptor'{propertyParms = []}, do_merge_terminationStateDescriptor(Parms, TSD).do_merge_terminationStateDescriptor([{Tag, Val} | T], TSD) -> case Tag of serviceState when TSD#'TerminationStateDescriptor'.serviceState == asn1_NOVALUE -> TSD2 = TSD#'TerminationStateDescriptor'{serviceState = Val}, do_merge_terminationStateDescriptor(T, TSD2); eventBufferControl when TSD#'TerminationStateDescriptor'.eventBufferControl == asn1_NOVALUE-> TSD2 = TSD#'TerminationStateDescriptor'{eventBufferControl = Val}, do_merge_terminationStateDescriptor(T, TSD2); propertyParm -> PP = TSD#'TerminationStateDescriptor'.propertyParms, TSD2 = TSD#'TerminationStateDescriptor'{propertyParms = [Val | PP]}, do_merge_terminationStateDescriptor(T, TSD2) end;do_merge_terminationStateDescriptor([], TSD) -> PP = TSD#'TerminationStateDescriptor'.propertyParms, TSD#'TerminationStateDescriptor'{propertyParms = lists:reverse(PP)}.ensure_prop_groups({_TokenTag, _Line, Text}) -> Group = [], Groups = [], parse_prop_name(Text, Group, Groups).parse_prop_name([Char | Rest] = All, Group, Groups) -> case ?classify_char(Char) of white_space -> parse_prop_name(Rest, Group, Groups); end_of_line -> parse_prop_name(Rest, Group, Groups); _ -> Name = [], do_parse_prop_name(All, Name, Group, Groups) end;parse_prop_name([] = All, Group, Groups) -> Name = [], do_parse_prop_name(All, Name, Group, Groups).do_parse_prop_name([Char | Rest], Name, Group, Groups) -> case ?classify_char(Char) of safe_char_upper -> do_parse_prop_name(Rest, [Char | Name], Group, Groups); safe_char -> do_parse_prop_name(Rest, [Char | Name], Group, Groups); rest_char when Char == $=, Name /= [] -> %% Now we have a complete name if Name == "v", Group /= [] -> %% v= is a property group delimiter, %% lets create yet another property group. Groups2 = [lists:reverse(Group) | Groups], Group2 = [], parse_prop_value(Rest, Name, Group2, Groups2); true -> %% Use current property group parse_prop_value(Rest, Name, Group, Groups) end; _ -> return_error(0, {bad_prop_name, lists:reverse(Name), Char}) end;do_parse_prop_name([], [], [], Groups) -> lists:reverse(Groups);do_parse_prop_name([], [], Group, Groups) -> Group2 = lists:reverse(Group), lists:reverse([Group2 | Groups]);do_parse_prop_name([], Name, Group, Groups) when Name /= [] -> %% Assume end of line Value = [], PP = make_prop_parm(Name, Value), Group2 = lists:reverse([PP | Group]), lists:reverse([Group2 | Groups]). parse_prop_value(Chars, Name, Group, Groups) -> Value = [], do_parse_prop_value(Chars, Name, Value, Group, Groups).do_parse_prop_value([Char | Rest], Name, Value, Group, Groups) -> case ?classify_char(Char) of end_of_line -> %% Now we have a complete "name=value" pair PP = make_prop_parm(Name, Value), parse_prop_name(Rest, [PP | Group], Groups); _ -> do_parse_prop_value(Rest, Name, [Char | Value], Group, Groups) end;do_parse_prop_value([], Name, Value, Group, Groups) -> %% Assume end of line PP = make_prop_parm(Name, Value), Group2 = lists:reverse([PP | Group]), lists:reverse([Gro
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -