migratecpp.pl 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. # from msg files
  2. my $arglessGetters = "fec addr destAddr destAddress nextHopAddr
  3. receiverAddress senderAddress srcAddr srcAddress recordRoute
  4. sourceRoutingOption timestampOption destAddr destAddress
  5. destinationAddress prefix srcAddr srcAddress targetAddress
  6. destAddr localAddr remoteAddr sourcePort destinationPort
  7. srcAddr sourceLinkLayerAddress targetLinkLayerAddress abit
  8. ackBit autoAddressConfFlag serverClose dbit dontFragment finBit
  9. fin_ack_rcvd fork isRequest isWithdraw managedAddrConfFlag
  10. moreFragments onlinkFlag otherStatefulConfFlag overrideFlag pshBit
  11. rbit routerFlag rstBit solicitedFlag synBit tbit urgBit msg
  12. diffServCodePoint routingType segmentsLeft bitrate holdTime
  13. keepAliveTime replyDelay MTU ackNo channelNumber code connId
  14. curHopLimit destPort endSequenceNo errorCode expectedReplyLength flag
  15. flowLabel fragmentOffset identification identifier interfaceId irs
  16. iss label lsaLength localPort optionCode payloadLength preferredLifetime
  17. prefixLength protocol pvLim rcv_nxt rcv_up rcv_wnd reachableTime
  18. remotePort retransTimer seqNumber sequenceNo snd_max snd_mss snd_nxt
  19. snd_una snd_up snd_wl1 snd_wl2 snd_wnd sockId srcPort state status
  20. trafficClass transportProtocol type userId validLifetime originatorId
  21. seqNo urgentPointer window destPort fragmentOffset headerLength
  22. hopLimit lastAddressPtr nextAddressPtr overflow protocol
  23. routerLifetime srcPort timeToLive version
  24. family messageText receiveQueueClass receiverLDPIdentifier
  25. sendQueueClass stateName tcpAlgorithmClass
  26. controlCode controlType id ipHops dst initiator src target isRequest
  27. isTopPeer last listenPort messageId msg myIP noPeers nslpId packetNumber
  28. replyLength replyPerRequest sigHops timeToRespond";
  29. # from C++ files
  30. $arglessGetters .= "blackboard connState port inetAddress
  31. netmask routerId extensionType localAddress remoteAddress
  32. currentTransmission frameReceivedBeforeSIFS firstLoopbackInterface
  33. interfaceEntry packetType src scope senderReport socket
  34. hostModule stateVariables advManagedFlag advOtherConfigFlag
  35. advSendAdvertisements receptionReports
  36. message protocol3 protocol4 myPosition multicastGroups
  37. destPrefix linkLocalAddress nextHop preferredAddress interfaceToken
  38. macAddress playgroundSizeX playgroundSizeY advLinkMTU
  39. advReachableTime advRetransTimer connectionId contentionWindow
  40. delaySinceLastSR fixedHeaderLength interfaceID metric multicastScope
  41. netmaskLength networkLayerGateIndex nodeInputGateId nodeOutputGateId
  42. numAddresses numAdvPrefixes numInterfaces numQueues numRoutes
  43. numRoutingEntries peerNamId socketId topLabel queueLength
  44. advCurHopLimit advDefaultLifetime expiryTime maxRtrAdvInterval
  45. minRtrAdvInterval baseReachableTime linkMTU bufferEndSeq
  46. totalLength";
  47. # IPv6
  48. my $underscoreArglessGetters =
  49. "maxRandomFactor minRandomFactor maxFinalRtrAdvertisements
  50. maxInitialRtrAdvertisements maxMulticastSolicit maxNeighbourAdvertisement
  51. maxRtrSolicitations maxUnicastSolicit delayFirstProbeTime
  52. maxAnycastDelayTime maxInitialRtrAdvertInterval maxRADelayTime
  53. maxRtrSolicitationDelay minDelayBetweenRAs reachableTime retransTimer
  54. rtrSolicitationInterval";
  55. # array fields in msg files
  56. my $gettersWithArg = "payload recordAddress address extensionHeader
  57. prefixInformation recordTimestamp addresses data";
  58. foreach $i (split(/\s/, $gettersWithArg)) {$arglessGetters .= " ${i}ArraySize";}
  59. # from C++ files
  60. $gettersWithArg .= "gatewayForDestAddr interfaceAddrByPeerAddress
  61. peerByLocalAddress route interfaceByAddress interfaceByAddress
  62. interfaceByName interfaceByNetworkLayerGateIndex interfaceByNodeInputGateId
  63. interfaceByNodeOutputGateId interfaceForDestAddr sourceInterfaceFrom
  64. multicastRoutesFor routingEntry payloadOwner advPrefix
  65. numMatchingPrefixBits outputGateForProtocol bytesAvailable";
  66. $arglessGetters =~ s/\s+/|/g;
  67. $underscoreArglessGetters =~ s/\s+/|/g;
  68. $gettersWithArg =~ s/\s+/|/g;
  69. %renamedParamsAndGates = (
  70. # gates
  71. "from_ip" => "ipIn",
  72. "from_ipv6" => "ipv6In",
  73. "from_udp" => "udpIn",
  74. "from_app" => "appIn",
  75. "from_mpls_switch" => "mplsSwitchIn",
  76. "to_ip" => "ipOut",
  77. "to_ipv6" => "ipv6Out",
  78. "to_udp" => "udpOut",
  79. "to_app" => "appOut",
  80. "to_appl" => "appOut",
  81. "TCPIn" => "tcpIn",
  82. "UDPIn" => "udpIn",
  83. "RSVPIn" => "rsvpIn",
  84. "OSPFIn" => "ospfIn",
  85. "UDPOut" => "udpOut",
  86. "RSVPOut" => "rsvpOut",
  87. "OSPFOut" => "ospfOut",
  88. "fromIPv6" => "ipv6In",
  89. "toIPv6" => "ipv6Out",
  90. # from RTP -- TBD only when RTP code has been patched!
  91. # "fromApp" => "appIn",
  92. # "fromProfile" => "profileIn",
  93. # "fromRTP" => "rtpIn",
  94. # "fromRTCP" => "rtcpIn",
  95. # "fromSocketLayer" => "socketLayerIn",
  96. # "fromSocketLayerRTP" => "socketLayerRTPIn",
  97. # "fromSocketLayerRTCP" =>"socketLayerRTCPIn",
  98. # "toApp" => "appOut",
  99. # "toProfile" => "profileOut",
  100. # "toRTCP" => "rtcpOut",
  101. # "toRTP" => "rtpOut",
  102. # "toSocketLayer" => "socketLayerOut",
  103. # "toSocketLayerRTP" => "socketLayerRTPOut",
  104. # "toSocketLayerRTCP" => "socketLayerRTCPOut",
  105. # parameters
  106. "local_port" => "localPort",
  107. "dest_port" => "destPort",
  108. "message_length" => "messageLength",
  109. "message_freq" => "messageFreq",
  110. "dest_addresses" => "destAddresses",
  111. );
  112. $listfname = $ARGV[0];
  113. open(LISTFILE, $listfname) || die "cannot open $listfname";
  114. while (<LISTFILE>)
  115. {
  116. chomp;
  117. s/\r$//; # cygwin/mingw perl does not do CR/LF translation
  118. $fname = $_;
  119. if ($fname =~ /_m\./) {
  120. print "skipping $fname...\n";
  121. next;
  122. }
  123. print "processing $fname... ";
  124. open(INFILE, $fname) || die "cannot open $fname";
  125. read(INFILE, $txt, 1000000) || die "cannot read $fname";
  126. close INFILE;
  127. my $origtxt = $txt;
  128. # process $txt:
  129. # remove omitGetVerb from .msg files
  130. $txt =~ s/\n *\@omitGetVerb\(true\); *\n/\n/gs;
  131. # rename getters
  132. $txt =~ s/\b($arglessGetters)\( *\)/"get".ucfirst($1)."()"/mge;
  133. $txt =~ s/\b_($underscoreArglessGetters)\( *\)/"_get".ucfirst($1)."()"/mge;
  134. $txt =~ s/\b($gettersWithArg)\(/"get".ucfirst($1)."("/mge;
  135. # custom renamings
  136. $txt =~ s/\bmtu\(\)/getMTU()/mg;
  137. # 802.11
  138. $txt =~ s/\bDIFSPeriod\(\)/getDIFS()/mg;
  139. $txt =~ s/\bEIFSPeriod\(\)/getEIFS()/mg;
  140. $txt =~ s/\bPIFSPeriod\(\)/getPIFS()/mg;
  141. $txt =~ s/\bSIFSPeriod\(\)/getSIFS()/mg;
  142. $txt =~ s/\bSlotPeriod\(\)/getSlotTime()/mg;
  143. $txt =~ s/\bbackoff\(/computeBackoff(/mg;
  144. $txt =~ s/\bcontentionWindow\(/computeContentionWindow(/mg;
  145. $txt =~ s/\bframeDuration\(/computeFrameDuration(/mg;
  146. $txt =~ s/\bpacketDuration\(/computePacketDuration(/mg;
  147. $txt =~ s/\bBackoffPeriod\(/computeBackoffPeriod(/mg;
  148. $txt =~ s/\btimeOut\(/computeTimeout(/mg;
  149. # RTP
  150. $txt =~ s/\bvalid\(\)/isValid()/mg;
  151. $txt =~ s/\bactive\(\)/isActive()/mg;
  152. $txt =~ s/\brtcpPort\(\)/getRTCPPort()/mg;
  153. $txt =~ s/\brtpPort\(\)/getRTPPort()/mg;
  154. $txt =~ s/\bsdesChunk\(\)/getSDESChunk()/mg;
  155. $txt =~ s/\bsdesChunks\(\)/getSDESChunks()/mg;
  156. $txt =~ s/\brtcpPackets\(\)/getRTCPPackets()/mg;
  157. $txt =~ s/\breceptionReport\(\)/createReceptionReport()/mg;
  158. $txt =~ s/\bsenderReport\(\)/createSender()/mg;
  159. # UDPSocket
  160. $txt =~ s/\bsetMulticastInterface\(/setMulticastInterfaceId(/mg;
  161. $txt =~ s/\bmulticastInterface\(/getMulticastInterfaceId(/mg;
  162. # other
  163. $txt =~ s/\bpacketOk\(/isPacketOK(/mg;
  164. $txt =~ s/\bnodepos\(/find(/mg;
  165. $txt =~ s/\binterfaceAt\(/getInterface(/mg;
  166. $txt =~ s/\bbitErrorRate\(/calculateBER(/mg;
  167. $txt =~ s/\binitialSeqNum\(/chooseInitialSeqNum(/mg;
  168. $txt =~ s/\bgetInetAddress\(\)/getIPAddress()/mg;
  169. $txt =~ s/\bsetInetAddress\(/setIPAddress(/mg;
  170. $txt =~ s/\bipForward\(\)/isIPForwardingEnabled()/mg;
  171. $txt =~ s/\blocalDeliver\(/isLocalAddress(/mg;
  172. $txt =~ s/\bmulticastLocalDeliver\(/isLocalMulticastAddress(/mg;
  173. #$txt =~ s/\bgetInterfaceForDestAddr\(/findInterfaceForDestAddr(/mg;
  174. #$txt =~ s/\bgetGatewayForDestAddr\(/findGatewayForDestAddr(/mg;
  175. # do parameter and gate renamings
  176. foreach my $from (keys(%renamedParamsAndGates)) {
  177. my $to = $renamedParamsAndGates{$from};
  178. $txt =~ s/\b$from\b/$to/sg;
  179. }
  180. # RoutingTable methods
  181. $txt =~ s/\bgetNumRoutingEntries\(\)/getNumRoutes()/mg;
  182. $txt =~ s/\bgetRoutingEntry\(/getRoute(/mg;
  183. $txt =~ s/\bfindRoutingEntry\(/findRoute(/mg;
  184. $txt =~ s/\baddRoutingEntry\(/addRoute(/mg;
  185. $txt =~ s/\bdeleteRoutingEntry\(/deleteRoute(/mg;
  186. $txt =~ s/\bRoutingEntry\b/IPRoute/mg; # the class
  187. # NotificationBoard
  188. # add "const" to 'detail' argument in receiveChangeNotification()
  189. $txt =~ s/(\breceiveChangeNotification *\( *int +[a-zA-Z]+ *), *(cPolymorphic|cObject) *\*/$1, const $2 */mg;
  190. # InterfaceEntry
  191. $txt =~ s/\bipv4\(\)/ipv4Data()/mg;
  192. $txt =~ s/\bipv6\(\)/ipv6Data()/mg;
  193. # IInterfaceTable, IRoutingTable
  194. $txt =~ s/\bInterfaceTable\b/IInterfaceTable/mg;
  195. $txt =~ s/\bRoutingTable\b/IRoutingTable/mg;
  196. # print warnings
  197. $lineno = 0;
  198. foreach $linewithcomment (split ("\n", $txt)) {
  199. $lineno++;
  200. my $line = $linewithcomment;
  201. $line =~ s|//.*||; # avoid warning for stuff in comments
  202. # getInterfaceById()
  203. if ($line =~ /\bgetInterface\([^)]/) {
  204. print "*** warning at $fname:$lineno: maybe you need getInterfaceById(int interfaceId) here instead of getInterface(int index). As a rule of thumb, inside a 0..getNumInterfaces() 'for' loop it should be getInterface(i), all other occurrences are likely supposed to be getInterfaceById(interfaceId).\n";
  205. print "$linewithcomment\n";
  206. }
  207. }
  208. if ($txt eq $origtxt) {
  209. print "unchanged\n";
  210. } else {
  211. open(OUTFILE, ">$fname") || die "cannot open $fname for write";
  212. print OUTFILE $txt || die "cannot write $fname";
  213. close OUTFILE;
  214. print "DONE\n";
  215. }
  216. }
  217. # BEWARE OF BOGUS REPLACEMENTS INSIDE COMMENTS!!
  218. # getAddress(), getData(), getPayload() !!!!
  219. print "\nConversion done. You may safely re-run this script as many times as you want.\n";