From 7a334295a3e9e857ed5a3dee491d8c0776b7e62b Mon Sep 17 00:00:00 2001 From: "Gun.io Whitespace Robot" Date: Mon, 19 Dec 2011 00:20:34 -0500 Subject: [PATCH] Remove whitespace [Gun.io WhitespaceBot] --- .gitignore | 50 +++++++++++++++++++ IA5.rb | 30 ++++++------ README | 6 +-- SMS.rb | 14 +++--- http_client.rb | 6 +-- install.sh | 4 +- log.rb | 14 +++--- misc.rb | 4 +- modem_web_server.rb | 30 ++++++------ modemcom.rb | 22 ++++----- modemserver.init | 8 ++-- moxa_simulator.rb | 18 +++---- pdu.rb | 114 ++++++++++++++++++++++---------------------- server.rb | 14 +++--- test.rb | 14 +++--- trie.rb | 26 +++++----- utils.rb | 4 +- 17 files changed, 214 insertions(+), 164 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c091839 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so +*.pyc + +# Numerous always-ignore extensions +################### +*.diff +*.err +*.orig +*.log +*.rej +*.swo +*.swp +*.vi +*~ + +*.sass-cache +# Folders to ignore +################### +.hg +.svn +.CVS +# OS or Editor folders +################### +.DS_Store +Icon? +Thumbs.db +ehthumbs.db +nbproject +.cache +.project +.settings +.tmproj +*.esproj +*.sublime-project +*.sublime-workspace +# Dreamweaver added files +################### +_notes +dwsync.xml +# Komodo +################### +*.komodoproject +.komodotools diff --git a/IA5.rb b/IA5.rb index 55ec3ad..282b56c 100755 --- a/IA5.rb +++ b/IA5.rb @@ -2,36 +2,36 @@ class IA5 @@map_syms = [ - [ '@', '£', '$', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', '\n', 'Ø', 'ø', '\r', 'Å', 'å' ], - [ 'Δ', '_', 'Φ', 'Γ', 'Λ', 'Ω', 'Π', 'Ψ', 'Σ', 'Θ', 'Ξ', '\e', 'Æ', 'æ', 'ß', 'É' ], + [ '@', '£', '$', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', '\n', 'Ø', 'ø', '\r', 'Å', 'å' ], + [ 'Δ', '_', 'Φ', 'Γ', 'Λ', 'Ω', 'Π', 'Ψ', 'Σ', 'Θ', 'Ξ', '\e', 'Æ', 'æ', 'ß', 'É' ], [ " ", '!', '"', "#", '¤', "'", '%', '&', '(', ')', '*', '+', ',', '-', '.', '/' ], - [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?' ], + [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?' ], [ '¡', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' ], [ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ä', 'Ö', 'Ñ', 'Ü', '§' ], [ '¿', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o' ], [ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ä', 'ö', 'ñ', 'ü', 'à' ] ].flatten - + @@map = {} @@map_syms.each_with_index { |symbol,index| @@map[symbol] = index } @@inv_map = @@map.invert - + @@ext_map = { "|" => 0x40, "^" => 0x14, "€" => 0x65, "{" => 0x28, "}" => 0x29, "[" => 0x3C, "~" => 0x3D, "]" => 0x3E, "\\" => 0x2F } @@inv_ext_map = @@ext_map.invert @@ext_syms = [] @@ext_map.each_key { |key| @@ext_syms << key } - - @@trie_parser = TrieParser.new [@@map_syms, @@ext_syms].flatten - + + @@trie_parser = TrieParser.new [@@map_syms, @@ext_syms].flatten + def IA5.is_extended? symbol (nil != @@ext_map[symbol]) end - + def IA5.encode(text) ia5 = [] - + symbols = @@trie_parser.parse(text) - + symbols.each do |sym| if IA5.is_extended? sym ia5 << 0x1B << @@ext_map[sym] @@ -39,14 +39,14 @@ def IA5.encode(text) ia5 << @@map[sym] end end - + ia5 end - + # expects a byte per ia5 character (do 7bit -> 8bit conversion first) def IA5.decode(ia5) text, i = "", 0 - + while i < ia5.length do chr = ia5.slice(i) if chr == 0x1B then @@ -60,7 +60,7 @@ def IA5.decode(ia5) end i = i + 1 end - + text end end diff --git a/README b/README index c30d160..0d636c1 100644 --- a/README +++ b/README @@ -7,11 +7,11 @@ It has been tested with Siemens TC35 modems. The development of this project was sponsored by MimerGroup/MimerMobile, -http://mimergroup.com. +http://mimergroup.com. -Mimergroup delivers a range of services, software and hardware +Mimergroup delivers a range of services, software and hardware related to SMS messaging. You can enquire about these services -and product by contacting . +and product by contacting . This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or diff --git a/SMS.rb b/SMS.rb index 006a354..67ea71c 100755 --- a/SMS.rb +++ b/SMS.rb @@ -1,11 +1,11 @@ class SMS attr_accessor :message, :udh, :from, :to, :pdu - + def initialize(message = "", from = "", to = "") @message, @from, @to = message, from, to @udh = "" end - + def SMS.create_from_pdu(pdu, modemname = "") sms = SMS.new sms.message = IA5.decode(pdu.message) @@ -23,21 +23,21 @@ def SMS.create_from_pdu(pdu, modemname = "") else sms.to = pdu.destination end - + return sms end - + def to_pdu pdu = PDU.new pdu.originator = @from pdu.destination = @to pdu.message = IA5.encode @message - + return pdu end - + def xml - "" + + "" + "" + @to.nil? + "" + "" + @from + "" + "" + @message + "" + diff --git a/http_client.rb b/http_client.rb index c5477e5..de1b85e 100755 --- a/http_client.rb +++ b/http_client.rb @@ -6,15 +6,15 @@ class HTTPClient def initialize(baseurl, logger) @baseurl, @logger = baseurl, logger end - + def send_http_request(sms) @logger.info "Forwarding message to #{@baseurl}" response = Net::HTTP.post_form(URI.parse(@baseurl), { "message" => sms.message, "pdu" => sms.pdu, "from" => sms.from, "to" => sms.to, "parts" => sms.pdu.parts.to_s, "partnumber" => sms.pdu.partnumber.to_s }) @logger.info "Response: " + response.body end - + def construct_url(sms) - url = @baseurl + url = @baseurl url << "?message=" + CGI.escape(sms.message) url << "&pdu=" + CGI.escape(sms.pdu) url << "&from=" + CGI.escape(sms.from) diff --git a/install.sh b/install.sh index 71e91c0..f4f7521 100755 --- a/install.sh +++ b/install.sh @@ -8,11 +8,11 @@ if [ ! `whoami` == "root" ]; then fi if [ ! -d $INSTDIR ]; then - mkdir $INSTDIR + mkdir $INSTDIR fi # copy files -echo "Installing files to $INSTDIR" +echo "Installing files to $INSTDIR" cp * $INSTDIR echo "Installing init script (/etc/init.d/modemserver)" diff --git a/log.rb b/log.rb index 4741fd0..db622fe 100755 --- a/log.rb +++ b/log.rb @@ -4,29 +4,29 @@ class ModemServerLogger < Monitor def initialize(logfile) @filename = logfile - open + open @logger.info "Log #{@filename} startet" @logger.level = Logger::INFO end - - def open + + def open #@file = File.open(@filename, File::WRONLY | File::APPEND | File::CREAT) #@logger = Logger.new(@file, 'daily') @logger = Logger.new(@filename, 'daily') @logger.level = Logger::INFO end - + def close - @logger.close + @logger.close end - + def shutdown close end # catch method call, synchronize and send to the logger object def method_missing(m, *args) - @logger.send(m, *args) + @logger.send(m, *args) puts *args #@file.flush end diff --git a/misc.rb b/misc.rb index d07f9e9..0ba24b5 100755 --- a/misc.rb +++ b/misc.rb @@ -3,13 +3,13 @@ def ia5(str) len = ((str.length/2) * (8.0/7.0)).round - + pos = 0 ia5 = [] rest = 0 0.upto(len-1) do |ia5pos| - shift = ia5pos%8 + shift = ia5pos%8 if shift == 7 then ia5 << rest rest = 0 diff --git a/modem_web_server.rb b/modem_web_server.rb index 1e11b16..2882d61 100755 --- a/modem_web_server.rb +++ b/modem_web_server.rb @@ -4,7 +4,7 @@ # The modem servlet responds to request to send a message: -# It adds the message to the modem communicator threads +# It adds the message to the modem communicator threads # queue. class ModemServlet < HTTPServlet::AbstractServlet attr_accessor :mountpoint @@ -14,24 +14,24 @@ def initialize(server, modem_communicator) super(server) @modem_communicator, @mountpoint = modem_communicator, @modem_communicator.name end - - + + def do_GET(req, res) errors, res.body = [], "" @logger.info "http query params: " + req.query.inspect + "\n" unless req.query['debug'].nil? - + sms = SMS.new(req.query['message'].to_s, @modem_communicator.name, req.query['to'].to_s) - + if (sms.message.nil? or sms.message.empty?) errors << "empty message" end - + if (sms.to.nil? or sms.to.empty?) errors << "empty to field" end - + # Attempt to add to queue: - begin + begin @modem_communicator.send_sms(sms) if errors.empty? rescue Exception => e @logger.error e.to_s @@ -43,16 +43,16 @@ def do_GET(req, res) else status = "FAILED\n" end - + error_string = "" errors.each { |e| error_string << "#{e}\n" } res.body = "\n" + status + error_string + "\n" - + res['Content-Type'] = "text/html" - + raise HTTPStatus::OK end - + alias :do_POST :do_GET # let's accept POST request too. end @@ -61,18 +61,18 @@ def initialize(config, logger) @config, @logger = config, logger @s = HTTPServer.new(:Port => @config['http-port'].to_s, :Logger => @logger) end - + def connect(modem_communicator) mountpoint = "/" + modem_communicator.name @logger.info "mounting servlet at " + mountpoint @s.mount mountpoint, ModemServlet, modem_communicator end - + def start @logger.info "Starting Modem Web Server" @s.start end - + def shutdown @s.shutdown end diff --git a/modemcom.rb b/modemcom.rb index 1b5d2e9..466ed76 100755 --- a/modemcom.rb +++ b/modemcom.rb @@ -30,7 +30,7 @@ def initialize(cfg, logger) @shutdown = false @to_delete = [] - if @address.nil? or @address.empty? + if @address.nil? or @address.empty? @logger.error @name + " No address specified!" end @@ -71,15 +71,15 @@ def run error_count = 0 loop do - + if @shutdown == true @logger.info @name + " shutting down..." break end - + sleep 1 - begin + begin @logger.info "Trying to connect to #{@address} : #{@port}" connect @logger.info @name + " - connected" @@ -94,7 +94,7 @@ def run delete_messages - # We only send one message per iteration. We don't the sending + # We only send one message per iteration. We don't the sending # of messages to block recieving messages sms = nil @outgoing_queue.synchronize { sms = @outgoing_queue.shift } @@ -129,7 +129,7 @@ def send_pdu(pdu) @logger.debug "!!! SENDING PDU !!!" cmd "AT+CMGF=0" expect_ok or raise "send_pdu (#{@name}): could not set PDU mode" - # Check if modem supports SMS commands + # Check if modem supports SMS commands cmd "AT+CSMS=0" expect_ok or raise "send_pdu (#{@name}): Modem doesn't support sending PDU's :-(" # Send the PDU @@ -145,7 +145,7 @@ def send_pdu(pdu) expect_ok end - + def incoming_messages @to_delete = [] @logger.info @name + " reading incoming messages" @@ -163,13 +163,13 @@ def incoming_messages if line =~ /^\+CMGL:.*$/ arr = (line.split(':'))[1].split(',') - index, stat, none, bytes = *arr + index, stat, none, bytes = *arr @to_delete << index # next line contains actual messages line = readline_block(@socket) @logger.debug("pdu line:" + line) - begin + begin pdus << PDU.new(line) unless line.nil? rescue Exception => pdu_exp @logger.error pdu_exp.inspect @@ -190,7 +190,7 @@ def incoming_messages def delete_messages @logger.info @name + " deleting messages left on modem" - @logger.info @name + " no message to delete." if @to_delete.empty? + @logger.info @name + " no message to delete." if @to_delete.empty? while not @to_delete.empty? do index = @to_delete.shift cmd "AT+CMGD="+index @@ -201,7 +201,7 @@ def delete_messages end end end - + def write_pdu(pdu) sleep 0.1 @logger.debug "writing pdu: " + pdu.encode diff --git a/modemserver.init b/modemserver.init index d53d136..cc9cad3 100755 --- a/modemserver.init +++ b/modemserver.init @@ -4,12 +4,12 @@ INSTDIR=/opt/modemserver CONFIG=/etc/modemserver.conf -case x$1 in +case x$1 in xstart) echo "Starting ModemServer..." - test -x $INSTDIR/modemserver || echo "No modemserver executable!" + test -x $INSTDIR/modemserver || echo "No modemserver executable!" cd $INSTDIR - ./modemserver $CONFIG &> /dev/null & + ./modemserver $CONFIG &> /dev/null & cd - &> /dev/null & ;; @@ -21,7 +21,7 @@ case x$1 in $0 stop sleep 2 $0 start - ;; + ;; *) echo "use: [start|stop|restart]" ;; diff --git a/moxa_simulator.rb b/moxa_simulator.rb index 4683efd..9d2036a 100755 --- a/moxa_simulator.rb +++ b/moxa_simulator.rb @@ -1,5 +1,5 @@ -# The MoxaSimulator is a TCP server that simulates a moxa box with -# a number of modems connected to it +# The MoxaSimulator is a TCP server that simulates a moxa box with +# a number of modems connected to it require 'socket' require 'utils.rb' @@ -8,10 +8,10 @@ class SimulatedModem def initialize(port) @port = port end - + def run puts "Simlated modem running on port #{@port}. Waiting for connections" - + serv = TCPServer.new(@port) begin sock, client_addr = serv.accept @@ -19,9 +19,9 @@ def run IO.select([serv]) retry end - + puts "Client connected from #{client_addr.to_s}. Waiting for commands." - + loop do begin puts "waiting for commands:" @@ -36,7 +36,7 @@ def run end end end - + def process_request(req) if req =~ /AT\+CPIN=\d\d\d\d/ "OK" @@ -57,7 +57,7 @@ def initialize(num_modems = 2, start_port = 4001) @number_of_modems = num_modems @start_port = start_port end - + def run puts "MoxaSimulator.run" threads = [] @@ -67,7 +67,7 @@ def run modem = SimulatedModem.new(m+@start_port) threads << Thread.new { modem.run } end - + threads.each { |t| t.join } end end diff --git a/pdu.rb b/pdu.rb index 045d050..30aa6bc 100755 --- a/pdu.rb +++ b/pdu.rb @@ -9,21 +9,21 @@ class PDU :smscnumber, :typeofaddress, :udh_present, - :replypath, + :replypath, :originator, :coding, :flash, :messageclass, :timestamp, :message, - :udh, + :udh, :destination, :parts, :partnumber - + alias :flash? :flash alias :udh_present? :udh_present - + def initialize(raw = nil) # Set some default values @udh_present = false @@ -33,65 +33,65 @@ def initialize(raw = nil) @typeofaddress = "91" @parts = 1 @partnumber = 1 - - decode(raw) unless raw == nil + + decode(raw) unless raw == nil end - + # Decode a received GSM PDU def decode(raw) @raw = raw (PDUParser.new(self)).parse end - # Encode a GSM PDU for sending via an modem + # Encode a GSM PDU for sending via an modem def encode (PDUEncoder.new(self)).encode end - + def length (self.encode.length/2) end end # PDUEncoder -# Converts a PDU object to a raw GSM pdu string -class PDUEncoder +# Converts a PDU object to a raw GSM pdu string +class PDUEncoder def initialize(pdu) @pdu = pdu end - + def encode length_of_smscinfo + sms_submit_octet1 + message_reference + - address_length + + address_length + type_of_address + - phone_number + - protocol_identifier + - data_coding_scheme + + phone_number + + protocol_identifier + + data_coding_scheme + validity_period + user_data_length + message - end - + end + def length_of_smscinfo "00" end - + def sms_submit_octet1 octet = 0x11 # We always use the same validity period format (the relative one) octet = octet | 0x40 if @pdu.udh_present? return octet.to_s(16) end - + def message_reference "00" # 00 = Let the phone set the reference number end - + def address_length @pdu.destination.length.to_hex end - + def type_of_address "91" # International end @@ -102,7 +102,7 @@ def phone_number else num = @pdu.destination end - + reversed = "" 0.upto((num.length/2)-1) do |i| reversed << num.slice((i*2)+1).chr @@ -110,12 +110,12 @@ def phone_number end reversed end - + # See, http://www.dreamfabric.com/sms/pid.html def protocol_identifier "00" end - + def data_coding_scheme if (@pdu.coding == 7) then "00" @@ -123,21 +123,21 @@ def data_coding_scheme "04" end end - + def validity_period "AA" # 4 days end - + def user_data_length @pdu.message.length.to_hex end - + def message # "E8329BFD4697D9EC37" # return @message unless @message == nil encode_7bit(@pdu.message) end - + def encode_7bit(septets) s = septets bytes = "" @@ -150,12 +150,12 @@ def encode_7bit(septets) end end -# Class for parsing a raw PDU string +# Class for parsing a raw PDU string class PDUParser def initialize(pdu) @pdu = pdu @pos = 0 - @raw = pdu.raw + @raw = pdu.raw end def parse @@ -190,15 +190,15 @@ def parse_originator #puts "parse_originator: addrlen=" + addrlen.to_s + " type of addr:" + type_of_addr.to_s #puts "pos before " + @pos.to_s - - addrlen = addrlen + 1 if addrlen%2==1 + + addrlen = addrlen + 1 if addrlen%2==1 sender_number_reversed = @raw.slice(@pos+2..@pos+addrlen+1) #puts "sender_number_reversed: " + sender_number_reversed @pos = @pos + addrlen - parse_reversed_number(sender_number_reversed) + parse_reversed_number(sender_number_reversed) end - + def parse_protocol_identifier protocol_identifier = next_byte #puts "protocol_identifier: " + protocol_identifier.to_s @@ -206,48 +206,48 @@ def parse_protocol_identifier def parse_data_coding_scheme dcs = next_byte - + # puts "dcs: " + dcs.to_s - + if ((dcs&0x0C)==4) then coding = 8 elsif ((dcs&0x0C)==8) coding = 16 else coding = 7 - end - + end + [ coding, ((dcs&0x03)==0), dcs&0x03 ] end def parse_timestamp field_names = [ :year, :month, :day, :hour, :minute, :second, :timezone ] - fields = Hash.new + fields = Hash.new field_names.each do |symbol| fields[symbol] = swap_nibble(next_byte_str).to_i end - + # will work untill 2070 if fields[:year].to_i > 70 fields[:year] = 1900 + fields[:year] else fields[:year] = 20 + fields[:year] end - + # convert timezone to fractions of a day timezone = (24*60)/(fields[:timezone].to_i*15) - timezone = -timezone if ((fields[:timezone].to_i & 0x80) == 0x80) + timezone = -timezone if ((fields[:timezone].to_i & 0x80) == 0x80) DateTime.new(fields[:year], fields[:month], fields[:day], fields[:hour], fields[:minute],fields[:second], timezone) end - - + + def parse_message message_length = next_byte - + message_starts_at = 0 - + if @pdu.udh_present == true then #@pdu.udh_present.freeze pos = @pos @@ -256,7 +256,7 @@ def parse_message parse_udh(udh_len) @pos = pos end - + if @pdu.coding == 16 then parse_message_16bit(message_length) elsif @pdu.coding == 8 then @@ -274,13 +274,13 @@ def parse_udh(udh_len) @pdu.parts = next_byte @pdu.partnumber = next_byte end - + def parse_message_7bit(len) ia5 = [] rest = 0 0.upto(len-1) do |ia5pos| - shift = ia5pos%8 + shift = ia5pos%8 if shift == 7 then ia5 << rest rest = 0 @@ -299,11 +299,11 @@ def parse_message_7bit(len) ia5.each { |code| message << code.chr } return message end - + def parse_message_8bit(message_length) raise "Not implemented" end - + def parse_message_16bit raise "Not implemented" end @@ -311,20 +311,20 @@ def parse_message_16bit def parse_byte @raw.slice(@pos..(@pos+1)).hex end - + def skip_bytes(count) count.times { next_byte } end def next_byte_str @pos = @pos + 2 - @raw.slice(@pos..(@pos+1)) + @raw.slice(@pos..(@pos+1)) end - + def next_byte (next_byte_str()).hex end - + def parse_reversed_number(str) number = "" 0.upto((str.length/2)-1) do |i| @@ -335,7 +335,7 @@ def parse_reversed_number(str) end number end - + def swap_nibble(n) n.slice!(1).chr + n.slice(0).chr end diff --git a/server.rb b/server.rb index 62a655b..09d764c 100755 --- a/server.rb +++ b/server.rb @@ -11,7 +11,7 @@ class ModemServer def initialize(config_file) - @config = XmlSimple.xml_in config_file + @config = XmlSimple.xml_in config_file @config.freeze @modems = @config['modem'] @threads = [] @@ -27,7 +27,7 @@ def initialize(config_file) if @config['http-port'].nil? @logger.warn "No http-port specified in configuration file. No starting http interface." end - + @logger.debug @config.inspect end @@ -35,25 +35,25 @@ def run @modem_web_server = ModemWebServer.new(@config, @logger) @modems.each do |modemconfig| - mc = ModemCommunicator.new(modemconfig, @logger) + mc = ModemCommunicator.new(modemconfig, @logger) @modem_communicators << mc @threads << Thread.new { mc.run } @modem_web_server.connect mc end - + # start web server if not @config['http-port'].nil? @threads << @modem_web_server_thread = Thread.new { @modem_web_server.run } end - + @logger.info "#{@threads.length+1} threads running..." - + trap("INT") do @modem_communicators.each { |mc| mc.shutdown } @modem_web_server.shutdown @threads.join end - + @modem_web_server.start end end diff --git a/test.rb b/test.rb index dfee5b9..728050f 100755 --- a/test.rb +++ b/test.rb @@ -6,9 +6,9 @@ class PDUParserTest < Test::Unit::TestCase def setup - # taken from: http://www.dreamfabric.com/sms/ + # taken from: http://www.dreamfabric.com/sms/ @raw1 = "07917283010010F5040BC87238880900F10000993092516195800AE8329BFD4697D9EC37" - @pdu1 = PDU.new(@raw1) # implicit invoke parser + @pdu1 = PDU.new(@raw1) # implicit invoke parser @raw2 = "06915404939099440A915403322524000080207201406440A00500038E0201A8E5391D442FCFE9207A794E07D1CB733A885E9ED341F4F29C0EA297E77410BD3CA783E8E5391D442FCFE9207A794E07D1CB733A885E9ED341F4F29C0EA297E77410BD3CA783E8E5391D442FCFE9207A794E07D1CB733A885E9ED341F4F29C0EA297E77410BD3CA783E8E5391D442FCFE9207A794E07D1CB733A885E9ED341F4F29C0EA297E7" @pdu2 = PDU.new(@raw2) @raw3 = "06915404939099640A915403322524000080207201407440120500038E0202E8207A794E07D1CB733A" @@ -18,9 +18,9 @@ def setup puts @pdu4.inspect puts PDU.new("06915404939099440A9154120659130000809061513404803F05000304020218E2F21C647ECB41EBBA1B248381D67217089406CDD16F38BCEC0695D9ECB21C940689DFE4B2DC5D76818E6F32681D6EC301").inspect - + end - + def test_inspect #puts @pdu2.inspect assert(true) @@ -60,12 +60,12 @@ def test_timestamp assert(@pdu1.timestamp.min == 16) assert(@pdu1.timestamp.sec == 59) end - + def test_udh_parsing assert(@pdu1.udh_present? == false) assert(@pdu2.udh_present) assert(@pdu3.udh_present) - + assert(@pdu2.udh == "0500038E0201") assert(@pdu3.udh == "0500038E0202") @@ -114,7 +114,7 @@ def test_raw class TrieParserTest < Test::Unit::TestCase def test_trie_parser_simple tp = TrieParser.new(["a", "b", "ab"]) - assert([] == tp.parse("")) + assert([] == tp.parse("")) assert(["ab", "ab"] == tp.parse("abab")) assert(["b", "ab"] == tp.parse("bab")) assert(["ab", "a"] == tp.parse("aba")) diff --git a/trie.rb b/trie.rb index 5b8aa9a..8a91737 100755 --- a/trie.rb +++ b/trie.rb @@ -1,10 +1,10 @@ class TrieNode < Hash attr_accessor :match - + def match_symbol(symbol) self[symbol] end - + def is_leaf? size == 0 end @@ -23,39 +23,39 @@ def initialize(symbols) rest = rest.slice 1..-1 curnode[first] = TrieNode.new if curnode[first].nil? - - if rest.empty? then + + if rest.empty? then curnode[first].match = symbol - break + break end - + curnode = curnode[first] end end end - + # Searches a string for the shortest symbol sequence using the trie.´ - # Example: Build trie from 1:"a", 2:"b", 3:"ab", search using string "ababba" -> following sequence of symbols: 3,3,2,1 + # Example: Build trie from 1:"a", 2:"b", 3:"ab", search using string "ababba" -> following sequence of symbols: 3,3,2,1 def parse(str) symbols = [] trie = @root last_match = nil last_match_pos = 0 pos = 0 - + while pos < str.length char = str.slice(pos) prev_trie = trie trie = trie[char] # transition - + raise "Cannot match sequence #{char} #{prev_trie.inspect}" if trie.nil? - + if trie.is_leaf? if not trie.match.nil? last_match = trie last_match_pos = pos end - + raise "Cannot match sequence" if last_match.nil? symbols << last_match.match @@ -72,7 +72,7 @@ def parse(str) end end end - + pos = pos + 1 end return symbols diff --git a/utils.rb b/utils.rb index dc8e5f1..1591b81 100755 --- a/utils.rb +++ b/utils.rb @@ -22,7 +22,7 @@ def readline(socket) def readprompt(socket) data = "" while not data =~ /> / - data << socket.read(1) + data << socket.read(1) end end @@ -35,7 +35,7 @@ def readline_block(socket) line end -def die(str) +def die(str) puts str exit -1 end