📄 megaco_text_scanner.erl
字号:
{Rest5, Line5, #'DigitMapDescriptor'{digitMapName = DigitMapName}} end, case Rest6 of [?LbrktToken | Rest7] -> {token, {'OctetString', _, OctetString}, Rest8, Line8} = octet_string(Rest7, Line6), case Rest8 of [?RbrktToken | Rest10] -> %% 'DigitMapToken' 'EQUAL' 'LBRKT' OctetString 'RBRKT' %% 'DigitMapToken' 'EQUAL' Name 'LBRKT' OctetString 'RBRKT' {Rest11, Line11} = skip_sep_chars(Rest10, Line8), DMV = digit_map_value(OctetString), DMD2 = DMD#'DigitMapDescriptor'{digitMapValue = DMV}, {token, {'DigitMapDescriptorToken', Line, DMD2}, Rest11, Line11}; _ when DMD#'DigitMapDescriptor'.digitMapName /= asn1_NOVALUE -> %% 'DigitMapToken' 'EQUAL' Name {token, {'DigitMapDescriptorToken', Line, DMD}, Rest4, Line3}; _ -> %% 'DigitMapToken' {token, {'DigitMapToken', Line, SafeChars}, All, Line} end; _ when DMD#'DigitMapDescriptor'.digitMapName /= asn1_NOVALUE -> %% 'DigitMapToken' 'EQUAL' Name {token, {'DigitMapDescriptorToken', Line, DMD}, Rest4, Line3}; _ -> %% 'DigitMapToken' {token, {'DigitMapToken', Line, SafeChars}, All, Line} end; _ when TokenTag == 'DigitMapToken' -> %% 'DigitMapToken' {token, {'DigitMapToken', Line, SafeChars}, All, Line}; _ -> %% 'DigitMapToken' {token, {'SafeChars', Line, SafeChars}, All, Line} end.octet_string(Chars, Line) -> {Chars2, Line2} = skip_sep_chars(Chars, Line), Acc = [], {Rest, RevChars, RestLine} = octet_string(Chars2, Acc, Line2), {RevChars2, _} = skip_sep_chars(RevChars, RestLine), OctetString = lists:reverse(RevChars2), {token, {'OctetString', Line, OctetString}, Rest, RestLine}. octet_string([Char | Rest] = All, Acc, Line) -> if Char == ?CrToken -> octet_string(Rest, [Char | Acc], Line + 1); Char == ?LfToken -> octet_string(Rest, [Char | Acc], Line + 1); Char >= 8#1, Char =< 8#174 -> octet_string(Rest, [Char | Acc], Line); Char >= 8#176, Char =< 8#377 -> octet_string(Rest, [Char | Acc], Line); Char == ?BackslashToken -> case Rest of [?RbrktToken | _Rest2] -> %% OTP-4357 octet_string(Rest, [?RbrktToken, ?BackslashToken | Acc], Line); _ -> octet_string(Rest, [Char | Acc], Line) end; true -> {All, Acc, Line} end;octet_string([] = All, Acc, Line) -> {All, Acc, Line}. %% digitMapValue = ["T" COLON Timer COMMA]%% ["S" COLON Timer COMMA] %% ["L" COLON Timer COMMA] %% ["Z" COLON Timer COMMA] digitMap digit_map_value(Chars) -> digit_map_value(Chars, #'DigitMapValue'{}).%% NOTE: The swap of the digitMapBody and the durationTimer is%% intentional. The reason is a problem with the flex scanner.%% Hopefully this is temporary...%% The values are swapped back later by the parser...digit_map_value([Char, ?ColonToken | Rest] = All, DMV) -> case ?LOWER1(Char) of $t -> digit_map_timer(All, Rest, #'DigitMapValue'.startTimer, DMV); $s -> digit_map_timer(All, Rest, #'DigitMapValue'.shortTimer, DMV); $l -> digit_map_timer(All, Rest, #'DigitMapValue'.longTimer, DMV);% $z -> digit_map_timer(All, Rest, #'DigitMapValue'.durationTimer, DMV);% _ -> DMV#'DigitMapValue'{digitMapBody = All} $z -> digit_map_timer(All, Rest, #'DigitMapValue'.digitMapBody, DMV); _ -> DMV#'DigitMapValue'{durationTimer = All} end;digit_map_value(Chars, DMV) -> DMV#'DigitMapValue'{durationTimer = Chars}.digit_map_timer(All, Chars, TimerPos, DMV) -> {Rest, Digits} = collect_safe_chars(Chars, []), {Rest2, _} = skip_sep_chars(Rest, 0), case {Rest2, catch list_to_integer(Digits)} of {[?CommaToken | Rest3], Int} when integer(Int), Int >= 0, element(TimerPos, DMV) == asn1_NOVALUE -> {Rest4, _} = skip_sep_chars(Rest3, 0), DMV2 = setelement(TimerPos, DMV, Int), digit_map_value(Rest4, DMV2); _ -> DMV#'DigitMapValue'{digitMapBody = All} end.select_token([$o, $- | LowerText]) -> select_token(LowerText);select_token([$w, $- | LowerText]) -> select_token(LowerText);select_token(LowerText) -> case LowerText of "add" -> 'AddToken'; "a" -> 'AddToken'; "andlgc" -> 'AndAUDITSelectToken'; % v3 "audit" -> 'AuditToken'; "at" -> 'AuditToken'; "auditcapability" -> 'AuditCapToken'; "ac" -> 'AuditCapToken'; "auditvalue" -> 'AuditValueToken'; "av" -> 'AuditValueToken'; "authentication" -> 'AuthToken'; "au" -> 'AuthToken'; "both" -> 'BothToken'; % v3 "b" -> 'BothToken'; % v3 "bothway" -> 'BothwayToken'; "bw" -> 'BothwayToken'; "brief" -> 'BriefToken'; "br" -> 'BriefToken'; "buffer" -> 'BufferToken'; "bf" -> 'BufferToken'; "context" -> 'CtxToken'; "c" -> 'CtxToken'; "contextattr" -> 'ContextAttrToken'; % v3 "ct" -> 'ContextAttrToken'; % v3 "contextlist" -> 'ContextListToken'; % v3 "clt" -> 'ContextListToken'; % v3 "contextaudit" -> 'ContextAuditToken'; "ca" -> 'ContextAuditToken'; "digitmap" -> 'DigitMapToken'; "dm" -> 'DigitMapToken'; "spadirection" -> 'DirectionToken'; % v3 "direction" -> 'DirectionToken'; % v3 (pre-v3a/v3b) "spadi" -> 'DirectionToken'; % v3 "di" -> 'DirectionToken'; % v3 (pre-v3a/v3b) "discard" -> 'DiscardToken'; "ds" -> 'DiscardToken'; "disconnected" -> 'DisconnectedToken'; "dc" -> 'DisconnectedToken'; "delay" -> 'DelayToken'; "dl" -> 'DelayToken'; "delete" -> 'DeleteToken'; "de" -> 'DeleteToken'; "duration" -> 'DurationToken'; "dr" -> 'DurationToken'; "embed" -> 'EmbedToken'; "em" -> 'EmbedToken'; "emergency" -> 'EmergencyToken'; "eg" -> 'EmergencyToken'; "emergencyofftoken" -> 'EmergencyOffToken'; "emergencyoff" -> 'EmergencyOffToken'; % v3 (as of prev3c) "ego" -> 'EmergencyOffToken'; "emergencyvalue" -> 'EmergencyValueToken'; % v3 "egv" -> 'EmergencyValueToken'; % v3 "error" -> 'ErrorToken'; "er" -> 'ErrorToken'; "eventbuffer" -> 'EventBufferToken'; "eb" -> 'EventBufferToken'; "events" -> 'EventsToken'; "e" -> 'EventsToken'; "external" -> 'ExternalToken'; % v3 "ex" -> 'ExternalToken'; % v3 "failover" -> 'FailoverToken'; "fl" -> 'FailoverToken'; "forced" -> 'ForcedToken'; "fo" -> 'ForcedToken'; "graceful" -> 'GracefulToken'; "gr" -> 'GracefulToken'; "h221" -> 'H221Token'; "h223" -> 'H223Token'; "h226" -> 'H226Token'; "handoff" -> 'HandOffToken'; "ho" -> 'HandOffToken'; "iepscall" -> 'IEPSToken'; % v3 "ieps" -> 'IEPSToken'; % v3 "inactive" -> 'InactiveToken'; "in" -> 'InactiveToken'; "internal" -> 'InternalToken'; % v3 "it" -> 'InternalToken'; % v3 "immackrequired" -> 'ImmAckRequiredToken'; "ia" -> 'ImmAckRequiredToken'; "inservice" -> 'InSvcToken'; "intersignal" -> 'IntsigDelayToken'; % v3 "spais" -> 'IntsigDelayToken'; % v3 "intbyevent" -> 'InterruptByEventToken'; "ibe" -> 'InterruptByEventToken'; "intbysigdescr" -> 'InterruptByNewSignalsDescrToken'; "ibs" -> 'InterruptByNewSignalsDescrToken'; "iv" -> 'InSvcToken'; "isolate" -> 'IsolateToken'; "is" -> 'IsolateToken'; "iterationtoken" -> 'IterationToken'; % v3 "ir" -> 'IterationToken'; % v3 "keepactive" -> 'KeepActiveToken'; "ka" -> 'KeepActiveToken'; "local" -> 'LocalToken'; "l" -> 'LocalToken'; "localcontrol" -> 'LocalControlToken'; "lockstep" -> 'LockStepToken'; "sp" -> 'LockStepToken'; "o" -> 'LocalControlToken'; "loopback" -> 'LoopbackToken'; "lb" -> 'LoopbackToken'; "media" -> 'MediaToken'; "m" -> 'MediaToken'; %% "megaco" -> 'MegacopToken'; %% "!" -> 'megacoptoken'; %% "segment" -> 'MessageSegmentToken'; % v3 %% "sm" -> 'MessageSegmentToken'; % v3 "method" -> 'MethodToken'; "mt" -> 'MethodToken'; "mtp" -> 'MtpToken'; "mgcidtotry" -> 'MgcIdToken'; "mg" -> 'MgcIdToken'; "mode" -> 'ModeToken'; "mo" -> 'ModeToken'; "modify" -> 'ModifyToken'; "mf" -> 'ModifyToken'; "modem" -> 'ModemToken'; "md" -> 'ModemToken'; "move" -> 'MoveToken'; "mv" -> 'MoveToken'; "mux" -> 'MuxToken'; "mx" -> 'MuxToken'; "nevernotify" -> 'NeverNotifyToken'; % v3 "nbnn" -> 'NeverNotifyToken'; % v3 "notify" -> 'NotifyToken'; "n" -> 'NotifyToken'; "notifycompletion" -> 'NotifyCompletionToken'; "nc" -> 'NotifyCompletionToken'; "immediatenotify" -> 'NotifyImmediateToken'; % v3 "nbin" -> 'NotifyImmediateToken'; % v3 "regulatednotify" -> 'NotifyRegulatedToken'; % v3 "nbrn" -> 'NotifyRegulatedToken'; % v3 "nx64kservice" -> 'Nx64kToken'; % v2 "n64" -> 'Nx64kToken'; % v2 "observedevents" -> 'ObservedEventsToken'; "oe" -> 'ObservedEventsToken'; "oneway" -> 'OnewayToken'; "ow" -> 'OnewayToken'; "onewayboth" -> 'OnewayBothToken'; % v3 "owb" -> 'OnewayBothToken'; % v3 "onewayexternal" -> 'OnewayExternalToken'; % v3 "owe" -> 'OnewayExternalToken'; % v3 "off" -> 'OffToken'; "on" -> 'OnToken'; "onoff" -> 'OnOffToken'; "oo" -> 'OnOffToken'; "orlgc" -> 'OrAUDITselectToken'; % v3 "otherreason" -> 'OtherReasonToken'; "or" -> 'OtherReasonToken'; "outofservice" -> 'OutOfSvcToken'; "os" -> 'OutOfSvcToken'; "packages" -> 'PackagesToken'; "pg" -> 'PackagesToken'; "pending" -> 'PendingToken'; "pn" -> 'PendingToken'; "priority" -> 'PriorityToken'; "pr" -> 'PriorityToken'; "profile" -> 'ProfileToken'; "pf" -> 'ProfileToken'; "reason" -> 'ReasonToken'; "re" -> 'ReasonToken'; "receiveonly" -> 'RecvonlyToken'; "requestid" -> 'RequestIDToken'; % v3 "rq" -> 'RequestIDToken'; % v3 "rc" -> 'RecvonlyToken'; "reply" -> 'ReplyToken'; "p" -> 'ReplyToken'; "reseteventsdescriptor" -> 'ResetEventsDescriptorToken'; % v3 "rse" -> 'ResetEventsDescriptorToken'; % v3 "transactionresponseack"-> 'ResponseAckToken'; "k" -> 'ResponseAckToken'; "restart" -> 'RestartToken'; "rs" -> 'RestartToken'; "remote" -> 'RemoteToken'; "r" -> 'RemoteToken'; "sparequestid" -> 'RequestIDToken'; "sparq" -> 'RequestIDToken'; "reservedgroup" -> 'ReservedGroupToken'; "rg" -> 'ReservedGroupToken'; "reservedvalue" -> 'ReservedValueToken'; "rv" -> 'ReservedValueToken'; "end" -> 'SegmentCompleteToken'; % v3 "&" -> 'SegmentCompleteToken'; % v3 "sendonly" -> 'SendonlyToken'; "so" -> 'SendonlyToken'; "sendreceive" -> 'SendrecvToken'; "sr" -> 'SendrecvToken'; "services" -> 'ServicesToken'; "sv" -> 'ServicesToken'; "servicestates" -> 'ServiceStatesToken'; "si" -> 'ServiceStatesToken'; "servicechange" -> 'ServiceChangeToken'; "sc" -> 'ServiceChangeToken'; "servicechangeaddress" -> 'ServiceChangeAddressToken'; "ad" -> 'ServiceChangeAddressToken'; "servicechangeinc" -> 'ServiceChangeIncompleteToken'; % v3 "sic" -> 'ServiceChangeIncompleteToken'; % v3 "signallist" -> 'SignalListToken'; "sl" -> 'SignalListToken'; "signals" -> 'SignalsToken'; "sg" -> 'SignalsToken'; "signaltype" -> 'SignalTypeToken'; "sy" -> 'SignalTypeToken'; "statistics" -> 'StatsToken'; "sa" -> 'StatsToken'; "stream" -> 'StreamToken'; "st" -> 'StreamToken'; "subtract" -> 'SubtractToken'; "s" -> 'SubtractToken'; "synchisdn" -> 'SynchISDNToken'; "sn" -> 'SynchISDNToken'; "terminationstate" -> 'TerminationStateToken'; "ts" -> 'TerminationStateToken'; "test" -> 'TestToken'; "te" -> 'TestToken'; "timeout" -> 'TimeOutToken'; "to" -> 'TimeOutToken'; "topology" -> 'TopologyToken'; "tp" -> 'TopologyToken'; "transaction" -> 'TransToken'; "t" -> 'TransToken'; "v18" -> 'V18Token'; "v22" -> 'V22Token'; "v22b" -> 'V22bisToken'; "v32" -> 'V32Token'; "v32b" -> 'V32bisToken'; "v34" -> 'V34Token'; "v76" -> 'V76Token'; "v90" -> 'V90Token'; "v91" -> 'V91Token'; "version" -> 'VersionToken'; "v" -> 'VersionToken'; %% TimeStamp when length(TimeStamp) == 17 -> 'TimeStampToken'; [D1,D2,D3,D4,D5,D6,D7,D8,$t,T1,T2,T3,T4,T5,T6,T7,T8] when $0 =< D1; D1 =< $9; $0 =< D2; D2 =< $9; $0 =< D3; D3 =< $9; $0 =< D4; D4 =< $9; $0 =< D5; D5 =< $9; $0 =< D6; D6 =< $9; $0 =< D7; D7 =< $9; $0 =< D8; D8 =< $9; $0 =< T1; T1 =< $9; $0 =< T2; T2 =< $9; $0 =< T3; T3 =< $9; $0 =< T4; T4 =< $9; $0 =< T5; T5 =< $9; $0 =< T6; T6 =< $9; $0 =< T7; T7 =< $9; $0 =< T8; T8 =< $9 -> 'TimeStampToken'; _ -> 'SafeChars' end.%% d(F) ->%% d(F, []).%% d(F, A) ->%% d(get(dbg), F, A).%% d(true, F, A) ->%% io:format("DBG:~p:" ++ F ++ "~n", [?MODULE|A]);%% d(_, _, _) ->%% ok.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -