From 421c0000c80be25fe831f1f3df511488ef269564 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 1 Apr 2021 22:35:37 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E6=A8=A1=E5=9D=97=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=20=E4=B8=BA=E5=90=8E=E7=BB=AD=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E8=AF=AD=E8=A8=80=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ebin/genProto.app | 9 --- include/genDef.hrl | 1 + src/genProto.erl | 59 ++++++++++++++ src/{protoCode.erl => writeErl/gErlCode.erl} | 2 +- .../gErlField.erl} | 2 +- src/{protoGen.erl => writeErl/gGenErl.erl} | 79 ++++--------------- test/genProto.bat | 2 +- test/protoMsg.erl | 2 +- 8 files changed, 79 insertions(+), 77 deletions(-) delete mode 100644 ebin/genProto.app create mode 100644 include/genDef.hrl create mode 100644 src/genProto.erl rename src/{protoCode.erl => writeErl/gErlCode.erl} (99%) rename src/{protoField.erl => writeErl/gErlField.erl} (99%) rename src/{protoGen.erl => writeErl/gGenErl.erl} (92%) diff --git a/ebin/genProto.app b/ebin/genProto.app deleted file mode 100644 index d38ca64..0000000 --- a/ebin/genProto.app +++ /dev/null @@ -1,9 +0,0 @@ -{application,genProto, - [{description,"An OTP library"}, - {vsn,"0.1.0"}, - {registered,[]}, - {applications,[kernel,stdlib]}, - {env,[]}, - {modules,[protoCode,protoField,protoGen,protoParse]}, - {licenses,["Apache 2.0"]}, - {links,[]}]}. diff --git a/include/genDef.hrl b/include/genDef.hrl new file mode 100644 index 0000000..a4185e2 --- /dev/null +++ b/include/genDef.hrl @@ -0,0 +1 @@ +-define(MsgIdSegSize, 1000). diff --git a/src/genProto.erl b/src/genProto.erl new file mode 100644 index 0000000..69b48b7 --- /dev/null +++ b/src/genProto.erl @@ -0,0 +1,59 @@ +-module(genProto). + +-include("genDef.hrl"). + +-export([ + convertFile/1 + , convert/1 + , convertDir/0 + , convertDir/1 + , convertDir/3 +]). + +convertFile(File) -> + protoParse:parseFile(File). + +convert([ProtoDir, HrlDir, ErlDir]) -> + convertDir(atom_to_list(ProtoDir), atom_to_list(HrlDir), atom_to_list(ErlDir)). + +convertDir() -> + convertDir("./", "./", "./"). +convertDir(ProtoDir) -> + convertDir(ProtoDir, "./", "./"). +convertDir(ProtoDir, HrlDir, ErlDir) -> + erlang:put(pd_errlist, []), + erlang:put(pd_handler, []), + FunRead = + fun(File, ProAcc) -> + case filename:extension(File) == ".mpdf" of + true -> + io:format("Convert proto msg file: ~s ~n", [File]), + BaseName = filename:basename(File, ".mpdf"), + [ModIndex, ModName] = re:split(BaseName, "_"), + Index = binary_to_integer(ModIndex), + erlang:put(pd_messageid, Index * ?MsgIdSegSize + 1), + erlang:put(pd_handler, [{Index, ModName} | erlang:get(pd_handler)]), + erlang:put(pd_errcodeid, Index * ?MsgIdSegSize + 1), + SProto = protoParse:parseFile(File), + ErrCode = erlang:get(pd_errlist), + Handler = erlang:get(pd_handler), + erlang:erase(), + erlang:put(pd_errlist, ErrCode), + erlang:put(pd_handler, Handler), + [SProto | ProAcc]; + _ -> + ProAcc + end + end, + + SProtoListOfList = filelib:fold_files(ProtoDir, "\\.mpdf$", true, FunRead, []), + SProtoList = lists:append(SProtoListOfList), + ErrCodeList = erlang:get(pd_errlist), + + SortedSProtoList = lists:sort(fun({_Name1, MessageId1, _FieldList1}, {_Name2, MessageId2, _FieldList2}) -> + MessageId1 > MessageId2 end, SProtoList), + + SortedErrList = lists:sort(fun({_ErrName1, ErrCodeId1, _Desc1}, {_ErrName2, ErrCodeId2, _Desc2}) -> + ErrCodeId1 > ErrCodeId2 end, ErrCodeList), + gGenErl:genErl(SortedSProtoList, SortedErrList, HrlDir, ErlDir). +%% 如果有其他语言请在这里添加入口函数 \ No newline at end of file diff --git a/src/protoCode.erl b/src/writeErl/gErlCode.erl similarity index 99% rename from src/protoCode.erl rename to src/writeErl/gErlCode.erl index c370bad..3102189 100644 --- a/src/protoCode.erl +++ b/src/writeErl/gErlCode.erl @@ -1,4 +1,4 @@ --module(protoCode). +-module(gErlCode). -compile([export_all, nowarn_unused_function, nowarn_export_all]). -export([encodeIol/1, encodeBin/1, encodeIol/2, subEncode/1, subEncode/2, decode/1, decodeBin/2]). diff --git a/src/protoField.erl b/src/writeErl/gErlField.erl similarity index 99% rename from src/protoField.erl rename to src/writeErl/gErlField.erl index 9f3b472..2a9f920 100644 --- a/src/protoField.erl +++ b/src/writeErl/gErlField.erl @@ -1,4 +1,4 @@ --module(protoField). +-module(gErlField). -compile([export_all, nowarn_export_all]). diff --git a/src/protoGen.erl b/src/writeErl/gGenErl.erl similarity index 92% rename from src/protoGen.erl rename to src/writeErl/gGenErl.erl index 0ae2ade..19ff5ba 100644 --- a/src/protoGen.erl +++ b/src/writeErl/gGenErl.erl @@ -1,25 +1,20 @@ --module(protoGen). +-module(gGenErl). +-include("genDef.hrl"). -export([ - convertFile/1 - , convert/1 - , convertDir/0 - , convertDir/1 - , convertDir/3 + genErl/4 ]). --define(MsgIdSegSize, 1000). - protoHrlHeader() -> -"-opaque int8() :: -128..127. --opaque int16() :: -32768..32767. --opaque int32() :: -2147483648..2147483647. --opaque int64() :: -9223372036854775808..9223372036854775807. --opaque uint8() :: 0..255. --opaque uint16() :: 0..65536. --opaque uint32() :: 0..4294967295. --opaque uint64() :: 0..18446744073709551615. --opaque double() :: float().\n\n". + "-opaque int8() :: -128..127. + -opaque int16() :: -32768..32767. + -opaque int32() :: -2147483648..2147483647. + -opaque int64() :: -9223372036854775808..9223372036854775807. + -opaque uint8() :: 0..255. + -opaque uint16() :: 0..65536. + -opaque uint32() :: 0..4294967295. + -opaque uint64() :: 0..18446744073709551615. + -opaque double() :: float().\n\n". protoErlHeader() -> "-module(protoMsg).\n\n @@ -189,7 +184,7 @@ genMsgHrl(FieldInfo, {Index, Len, AccList}) -> _ -> ", " end, - RecStr = TemStr ++ protoField:builtRecStr(FieldInfo) ++ (case Index == Len of true -> ""; _ -> "\t" end), + RecStr = TemStr ++ gErlField:builtRecStr(FieldInfo) ++ (case Index == Len of true -> ""; _ -> "\t" end), {Index - 1, Len, [RecStr | AccList]}. genErrCodeHrl({ErrName, ErrCodeId, ComDesc}, AccList) -> @@ -214,7 +209,7 @@ genEncodeRec({MsgName, MsgId, FieldList}, IsForBin) -> FunBody = fun({FieldType, _FieldName}, {Index, PStrAcc}) -> TemV = "V" ++ integer_to_list(Index), - PackStr = protoField:builtPackStr(FieldType) ++ TemV ++ ")", + PackStr = gErlField:builtPackStr(FieldType) ++ TemV ++ ")", case Index == 1 of true -> {Index - 1, PackStr ++ PStrAcc}; @@ -650,50 +645,8 @@ genDecodeBin({MsgName, MsgId, FieldList}, SortedSProtoList, IsForBin) -> end, HeadStr ++ LBodyStr ++ RetStr. -convertFile(File) -> - protoParse:parseFile(File). - -convert([ProtoDir, HrlDir, ErlDir]) -> - convertDir(atom_to_list(ProtoDir), atom_to_list(HrlDir), atom_to_list(ErlDir)). - -convertDir() -> - convertDir("./", "./", "./"). -convertDir(ProtoDir) -> - convertDir(ProtoDir, "./", "./"). -convertDir(ProtoDir, HrlDir, ErlDir) -> - erlang:put(pd_errlist, []), - erlang:put(pd_handler, []), - FunRead = - fun(File, ProAcc) -> - case filename:extension(File) == ".mpdf" of - true -> - io:format("Convert proto msg file: ~s ~n", [File]), - BaseName = filename:basename(File, ".mpdf"), - [ModIndex , ModName] = re:split(BaseName, "_"), - Index = binary_to_integer(ModIndex), - erlang:put(pd_messageid, Index * ?MsgIdSegSize + 1), - erlang:put(pd_handler, [{Index, ModName} | erlang:get(pd_handler)]), - erlang:put(pd_errcodeid, Index * ?MsgIdSegSize + 1), - SProto = protoParse:parseFile(File), - ErrCode = erlang:get(pd_errlist), - Handler = erlang:get(pd_handler), - erlang:erase(), - erlang:put(pd_errlist, ErrCode), - erlang:put(pd_handler, Handler), - [SProto | ProAcc]; - _ -> - ProAcc - end - end, - %% 下面文件帅选并不能准确的帅选出文件名为.mpdf结尾的文件 在FunRead函数中纠正处理一下 - SProtoListOfList = filelib:fold_files(ProtoDir, "\\.mpdf$", true, FunRead, []), - SProtoList = lists:append(SProtoListOfList), - ErrCodeList = erlang:get(pd_errlist), +genErl(SortedSProtoList, SortedErrList, HrlDir, ErlDir) -> initSubRec(), - - SortedSProtoList = lists:sort(fun({_Name1, MessageId1, _FieldList1}, {_Name2, MessageId2, _FieldList2}) -> - MessageId1 > MessageId2 end, SProtoList), - FunSpell = fun({MsgName, _MsgId, FieldList} = MsgInfo, {MsgHrlAcc, _MsgIdAcc, MsgEncodeAcc, MsgDecodeAcc}) -> %% gen hrl str @@ -715,8 +668,6 @@ convertDir(ProtoDir, HrlDir, ErlDir) -> end, {MsgHrlStr, _MsgIdStr, MsgEncodeStr, MsgDecodeStr} = lists:foldl(FunSpell, {[], ["getMsgId(_) -> 0.\n\n"], ["encodeIol(_, _) ->\n\t[].\n\n"], ["decodeBin(_, _) ->\n\t{undefinedHer, undefined, {}}.\n\n"]}, SortedSProtoList), - SortedErrList = lists:sort(fun({_ErrName1, ErrCodeId1, _Desc1}, {_ErrName2, ErrCodeId2, _Desc2}) -> - ErrCodeId1 > ErrCodeId2 end, ErrCodeList), ErrCodeStr = lists:foldl(fun genErrCodeHrl/2, [], SortedErrList) ++ "\n\n", %% gen decodeRec str diff --git a/test/genProto.bat b/test/genProto.bat index 017c66d..4c446f7 100644 --- a/test/genProto.bat +++ b/test/genProto.bat @@ -1 +1 @@ -erl -pa ../ebin -s protoGen convert ../proto ./ ./ +erl -pa ../ebin -s genProto convert ../proto ./ ./ diff --git a/test/protoMsg.erl b/test/protoMsg.erl index 6241c20..2c2942e 100644 --- a/test/protoMsg.erl +++ b/test/protoMsg.erl @@ -847,5 +847,5 @@ decodeBin(1001, LeftBin0) -> {V4, LeftBin5} = deRecordList(Len3, 2, LeftBin4, []), {errorHer, person1, {person1, V1, V2, V3, V4}}; decodeBin(_, _) -> - {undefined, {}}. + {undefinedHer, undefined, {}}.