wexpr 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +76 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.txt +21 -0
- data/README.md +38 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/wexprTool +211 -0
- data/lib/wexpr.rb +34 -0
- data/lib/wexpr/exception.rb +66 -0
- data/lib/wexpr/expression.rb +1375 -0
- data/lib/wexpr/object_ext.rb +13 -0
- data/lib/wexpr/private_parser_state.rb +38 -0
- data/lib/wexpr/uvlq64.rb +70 -0
- data/lib/wexpr/version.rb +3 -0
- data/wexpr.gemspec +39 -0
- metadata +106 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# injections into Object
|
4
|
+
class Object
|
5
|
+
|
6
|
+
#
|
7
|
+
# to_wexpr(writeFlags = [])
|
8
|
+
# Convert an object to Wexpr. See Wexpr.dump for more information.
|
9
|
+
#
|
10
|
+
def to_wexpr(writeFlags = [])
|
11
|
+
Wexpr.dump self, writeFlags
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module Wexpr
|
3
|
+
#
|
4
|
+
# Internal class which manges the parser state when parsing
|
5
|
+
#
|
6
|
+
class PrivateParserState
|
7
|
+
attr_accessor :line
|
8
|
+
attr_accessor :column
|
9
|
+
attr_accessor :internalReferenceMap
|
10
|
+
attr_accessor :externalReferenceMap
|
11
|
+
|
12
|
+
def initialize()
|
13
|
+
# start at beginning of file
|
14
|
+
@line = 1
|
15
|
+
@column = 1
|
16
|
+
@internalReferenceMap = {}
|
17
|
+
@externalReferenceMap = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def move_forward_based_on_string(str)
|
21
|
+
str.each_char do |c|
|
22
|
+
if c == '\n' # newline
|
23
|
+
@line += 1
|
24
|
+
@column = 1
|
25
|
+
else
|
26
|
+
@column = 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# --- MEMBERS
|
32
|
+
|
33
|
+
# @line - The line number
|
34
|
+
# @column - The column
|
35
|
+
# @internalReferenceMap - The internal reference map from within the file. Takes priority.
|
36
|
+
# @externalReferenceMap - The external reference map provided by the user.
|
37
|
+
end
|
38
|
+
end
|
data/lib/wexpr/uvlq64.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
module Wexpr
|
3
|
+
#
|
4
|
+
# Helpers for managing VLQ 64bit binary
|
5
|
+
#
|
6
|
+
module UVLQ64
|
7
|
+
#
|
8
|
+
# Return the number of bytes which is needed to store a number in the UVLQ64
|
9
|
+
#
|
10
|
+
def self.byte_size(value)
|
11
|
+
# we get 7 bits per byte. 2^7 for each.
|
12
|
+
case value
|
13
|
+
when 0 ... 128 then return 1 # 2^7
|
14
|
+
when 128 ... 16384 then return 2 # 2^14
|
15
|
+
when 16384 ... 2097152 then return 3 # 2^21
|
16
|
+
when 2097152 ... 268435456 then return 4 # 2^28
|
17
|
+
when 268435456 ... 34359738368 then return 5 # 2^35
|
18
|
+
when 34359738368 ... 4398046511104 then return 6 # 2^42
|
19
|
+
when 4398046511104 ... 562949953421312 then return 7 # 2^49
|
20
|
+
when 562949953421312 ... 72057594037927936 then return 8 # 2^56
|
21
|
+
when 72057594037927936 ... 9223372036854775808 then return 9 # 2^63
|
22
|
+
else
|
23
|
+
return 10 # 2^64+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Write a UVLQ64 (big endian) to a buffer. value -> binary.
|
29
|
+
#
|
30
|
+
def self.write(value)
|
31
|
+
bytesNeeded = byte_size(value)
|
32
|
+
|
33
|
+
buf = []
|
34
|
+
|
35
|
+
i = bytesNeeded - 1
|
36
|
+
for j in 0 .. i
|
37
|
+
buf << (((value >> ((i - j) * 7)) & 127) | 128)
|
38
|
+
end
|
39
|
+
|
40
|
+
buf[i] ^= 128
|
41
|
+
|
42
|
+
return buf.pack('C*')
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Read a UVLQ64 big endian from the given buffer. binary -> value
|
47
|
+
# Returns the result along with the rest of the buffer not processed
|
48
|
+
#
|
49
|
+
def self.read(buffer)
|
50
|
+
r = 0
|
51
|
+
bufferPos = 0
|
52
|
+
bufferLen = buffer.size
|
53
|
+
|
54
|
+
loop do
|
55
|
+
if bufferPos == bufferLen
|
56
|
+
raise StandardError("Ran out of buffer processing UVLQ64")
|
57
|
+
end
|
58
|
+
|
59
|
+
c = buffer[bufferPos].unpack('C')[0]
|
60
|
+
r = (r << 7) | (c & 127)
|
61
|
+
|
62
|
+
isEnd = (c & 128) == 0
|
63
|
+
bufferPos += 1
|
64
|
+
break if isEnd
|
65
|
+
end
|
66
|
+
|
67
|
+
return r, buffer[bufferPos..-1]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/wexpr.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "wexpr/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "wexpr"
|
8
|
+
spec.version = Wexpr::VERSION
|
9
|
+
spec.authors = ["Kenneth Perry (thothonegan)"]
|
10
|
+
spec.email = ["thothonegan@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Wexpr parser and emitter for ruby}
|
13
|
+
spec.description = %q{
|
14
|
+
Wexpr is a simple configuration language, similar to lisps's S expressions or JSON. Designed to be readable, while being quick and easy to parse.
|
15
|
+
This is a ruby library to parse and emit wexpr.
|
16
|
+
}
|
17
|
+
spec.homepage = "https://github.com/thothonegan/ruby-wexpr"
|
18
|
+
spec.license = "MIT"
|
19
|
+
|
20
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
21
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
22
|
+
#if spec.respond_to?(:metadata)
|
23
|
+
# spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
24
|
+
#else
|
25
|
+
# raise "RubyGems 2.0 or newer is required to protect against " \
|
26
|
+
# "public gem pushes."
|
27
|
+
#end
|
28
|
+
|
29
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
30
|
+
f.match(%r{^(test|spec|features)/})
|
31
|
+
end
|
32
|
+
spec.bindir = "exe"
|
33
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
34
|
+
spec.require_paths = ["lib"]
|
35
|
+
|
36
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
37
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
38
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wexpr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kenneth Perry (thothonegan)
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
description: "\n\tWexpr is a simple configuration language, similar to lisps's S expressions
|
56
|
+
or JSON. Designed to be readable, while being quick and easy to parse.\n\tThis is
|
57
|
+
a ruby library to parse and emit wexpr.\n "
|
58
|
+
email:
|
59
|
+
- thothonegan@gmail.com
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- ".gitignore"
|
65
|
+
- ".travis.yml"
|
66
|
+
- Gemfile
|
67
|
+
- Gemfile.lock
|
68
|
+
- LICENSE.txt
|
69
|
+
- README.md
|
70
|
+
- Rakefile
|
71
|
+
- bin/console
|
72
|
+
- bin/setup
|
73
|
+
- bin/wexprTool
|
74
|
+
- lib/wexpr.rb
|
75
|
+
- lib/wexpr/exception.rb
|
76
|
+
- lib/wexpr/expression.rb
|
77
|
+
- lib/wexpr/object_ext.rb
|
78
|
+
- lib/wexpr/private_parser_state.rb
|
79
|
+
- lib/wexpr/uvlq64.rb
|
80
|
+
- lib/wexpr/version.rb
|
81
|
+
- wexpr.gemspec
|
82
|
+
homepage: https://github.com/thothonegan/ruby-wexpr
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.7.3
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: Wexpr parser and emitter for ruby
|
106
|
+
test_files: []
|