kernaux 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of kernaux might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.gitignore +44 -0
- data/.rubocop.yml +79 -0
- data/.simplecov +9 -0
- data/.yardopts +4 -0
- data/Gemfile +8 -0
- data/README.md +29 -0
- data/Rakefile +80 -0
- data/bin/console +8 -0
- data/bin/setup +7 -0
- data/ext/default/assert.c +55 -0
- data/ext/default/cmdline.c +83 -0
- data/ext/default/dynarg.c +45 -0
- data/ext/default/dynarg.h +35 -0
- data/ext/default/extconf.rb +14 -0
- data/ext/default/io.c +27 -0
- data/ext/default/main.c +38 -0
- data/ext/default/main.h +32 -0
- data/ext/default/ntoa.c +254 -0
- data/ext/default/printf.c +210 -0
- data/ext/default/version.c +59 -0
- data/kernaux.gemspec +59 -0
- data/lib/kernaux/assert.rb +58 -0
- data/lib/kernaux/cmdline.rb +20 -0
- data/lib/kernaux/errors.rb +39 -0
- data/lib/kernaux/io.rb +22 -0
- data/lib/kernaux/ntoa.rb +136 -0
- data/lib/kernaux/printf.rb +70 -0
- data/lib/kernaux/version.rb +13 -0
- data/lib/kernaux.rb +21 -0
- metadata +232 -0
data/lib/kernaux/io.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Lint/EmptyClass
|
4
|
+
|
5
|
+
if KernAux::Version.with_io?
|
6
|
+
module KernAux
|
7
|
+
##
|
8
|
+
# File simulator.
|
9
|
+
#
|
10
|
+
class File
|
11
|
+
##
|
12
|
+
# @!method initialize(out)
|
13
|
+
# Create a file.
|
14
|
+
#
|
15
|
+
# @param out [Proc] writing method
|
16
|
+
|
17
|
+
# @!parse [ruby]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# rubocop:enable Lint/EmptyClass
|
data/lib/kernaux/ntoa.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/Documentation
|
4
|
+
begin; end
|
5
|
+
|
6
|
+
module KernAux
|
7
|
+
# @!scope class
|
8
|
+
|
9
|
+
##
|
10
|
+
# @!method utoa(number, base, prefix)
|
11
|
+
# Convert `uint64_t` to a string in multiple numeral systems.
|
12
|
+
#
|
13
|
+
# Base can be a positive or negative integer between 2 and 36, or a symbol
|
14
|
+
# which is an alias to a valid integer value. Positive integers and lowercase
|
15
|
+
# symbols mean lowercase output when base is greater than 10. Negative
|
16
|
+
# integers and uppercase symbols mean uppercase output when base is greater
|
17
|
+
# than 10. Aliases are: `:b`, `:B` - 2; `:o`, `:O` - 8; `:d`, `:D` - 10; `:h`,
|
18
|
+
# `:x` - 16 (lowercase); `:H`, `:X` - -10 (uppercase).
|
19
|
+
#
|
20
|
+
# @param number [Integer] a number between 0 and `UINT64_MAX`
|
21
|
+
# @param base [Integer, Symbol] base of a numeral system
|
22
|
+
# @param prefix [nil, String] string to put before a number
|
23
|
+
# @return [String]
|
24
|
+
#
|
25
|
+
# @raise [RangeError] number is out of range
|
26
|
+
# @raise [InvalidNtoaBaseError] base is invalid
|
27
|
+
# @raise [TooLongNtoaPrefixError] prefix is too long
|
28
|
+
#
|
29
|
+
# @see .itoa Convert signed integers
|
30
|
+
##
|
31
|
+
|
32
|
+
##
|
33
|
+
# @!method itoa(number, base, prefix)
|
34
|
+
# Convert `int64_t` to a string in multiple numeral systems.
|
35
|
+
#
|
36
|
+
# Base can be a positive or negative integer between 2 and 36, or a symbol
|
37
|
+
# which is an alias to a valid integer value. Positive integers and lowercase
|
38
|
+
# symbols mean lowercase output when base is greater than 10. Negative
|
39
|
+
# integers and uppercase symbols mean uppercase output when base is greater
|
40
|
+
# than 10. Aliases are: `:b`, `:B` - 2; `:o`, `:O` - 8; `:d`, `:D` - 10; `:h`,
|
41
|
+
# `:x` - 16 (lowercase); `:H`, `:X` - -10 (uppercase).
|
42
|
+
#
|
43
|
+
# @param number [Integer] a number between `INT64_MIN` and `INT64_MAX`
|
44
|
+
# @param base [Integer, Symbol] base of a numeral system
|
45
|
+
# @param prefix [nil, String] string to put between a sign and a number
|
46
|
+
# @return [String]
|
47
|
+
#
|
48
|
+
# @raise [RangeError] number is out of range
|
49
|
+
# @raise [InvalidNtoaBaseError] base is invalid
|
50
|
+
# @raise [TooLongNtoaPrefixError] prefix is too long
|
51
|
+
#
|
52
|
+
# @see .utoa Convert unsigned integers
|
53
|
+
##
|
54
|
+
|
55
|
+
##
|
56
|
+
# @!method utoa2(number)
|
57
|
+
# Convert `uint64_t` to a binary string.
|
58
|
+
#
|
59
|
+
# @param number [Integer] a number between 0 and `UINT64_MAX`
|
60
|
+
# @return [String]
|
61
|
+
#
|
62
|
+
# @raise [RangeError] number is out of range
|
63
|
+
##
|
64
|
+
|
65
|
+
##
|
66
|
+
# @!method itoa2(number)
|
67
|
+
# Convert `int64_t` to a binary string.
|
68
|
+
#
|
69
|
+
# @param number [Integer] a number between `INT64_MIN` and `INT64_MAX`
|
70
|
+
# @return [String]
|
71
|
+
#
|
72
|
+
# @raise [RangeError] number is out of range
|
73
|
+
##
|
74
|
+
|
75
|
+
##
|
76
|
+
# @!method utoa8(number)
|
77
|
+
# Convert `uint64_t` to a octal string.
|
78
|
+
#
|
79
|
+
# @param number [Integer] a number between 0 and `UINT64_MAX`
|
80
|
+
# @return [String]
|
81
|
+
#
|
82
|
+
# @raise [RangeError] number is out of range
|
83
|
+
##
|
84
|
+
|
85
|
+
##
|
86
|
+
# @!method itoa8(number)
|
87
|
+
# Convert `int64_t` to a octal string.
|
88
|
+
#
|
89
|
+
# @param number [Integer] a number between `INT64_MIN` and `INT64_MAX`
|
90
|
+
# @return [String]
|
91
|
+
#
|
92
|
+
# @raise [RangeError] number is out of range
|
93
|
+
##
|
94
|
+
|
95
|
+
##
|
96
|
+
# @!method utoa10(number)
|
97
|
+
# Convert `uint64_t` to a decimal string.
|
98
|
+
#
|
99
|
+
# @param number [Integer] a number between 0 and `UINT64_MAX`
|
100
|
+
# @return [String]
|
101
|
+
#
|
102
|
+
# @raise [RangeError] number is out of range
|
103
|
+
##
|
104
|
+
|
105
|
+
##
|
106
|
+
# @!method itoa10(number)
|
107
|
+
# Convert `int64_t` to a decimal string.
|
108
|
+
#
|
109
|
+
# @param number [Integer] a number between `INT64_MIN` and `INT64_MAX`
|
110
|
+
# @return [String]
|
111
|
+
#
|
112
|
+
# @raise [RangeError] number is out of range
|
113
|
+
##
|
114
|
+
|
115
|
+
##
|
116
|
+
# @!method utoa16(number)
|
117
|
+
# Convert `uint64_t` to a hexadecimal string.
|
118
|
+
#
|
119
|
+
# @param number [Integer] a number between 0 and `UINT64_MAX`
|
120
|
+
# @return [String]
|
121
|
+
#
|
122
|
+
# @raise [RangeError] number is out of range
|
123
|
+
##
|
124
|
+
|
125
|
+
##
|
126
|
+
# @!method itoa16(number)
|
127
|
+
# Convert `int64_t` to a hexadecimal string.
|
128
|
+
#
|
129
|
+
# @param number [Integer] a number between `INT64_MIN` and `INT64_MAX`
|
130
|
+
# @return [String]
|
131
|
+
#
|
132
|
+
# @raise [RangeError] number is out of range
|
133
|
+
##
|
134
|
+
end
|
135
|
+
|
136
|
+
# rubocop:enable Style/Documentation
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/Documentation
|
4
|
+
begin; end
|
5
|
+
|
6
|
+
module KernAux
|
7
|
+
# Buffer size for {.sprintf1}.
|
8
|
+
# @todo Make it dynamic.
|
9
|
+
SPRINTF1_BUFFER_SIZE = 10_000
|
10
|
+
|
11
|
+
# @!scope class
|
12
|
+
|
13
|
+
# @!parse [ruby]
|
14
|
+
|
15
|
+
if Version.with_printf?
|
16
|
+
##
|
17
|
+
# Typical `printf`.
|
18
|
+
#
|
19
|
+
# @param args [Array<String,
|
20
|
+
# Array<(String, Object)>,
|
21
|
+
# Array<(String, Integer, Object)>>]
|
22
|
+
# @return [String] formatted output
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# KernAux.sprintf 'foo', ['%*s', 5, 'bar'], 'car', ['%d', 123]
|
26
|
+
# #=> "foo barcar123"
|
27
|
+
#
|
28
|
+
def self.sprintf(*args)
|
29
|
+
args.map do |arg|
|
30
|
+
if arg.is_a? Array
|
31
|
+
sprintf1(*arg)
|
32
|
+
else
|
33
|
+
arg
|
34
|
+
end
|
35
|
+
end.join.freeze
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# `printf` for single formatting parameter.
|
40
|
+
#
|
41
|
+
# @param format [String] formatting string
|
42
|
+
# @return [String] formatted output
|
43
|
+
#
|
44
|
+
# @see .sprintf Multiple formatting parameters
|
45
|
+
#
|
46
|
+
# @example
|
47
|
+
# KernAux.sprintf1 '%%' #=> "%"
|
48
|
+
# KernAux.sprintf1 '%s', 'foo' #=> "foo"
|
49
|
+
# KernAux.sprintf1 '%5s', 'foo' #=> " foo"
|
50
|
+
# KernAux.sprintf1 '%*s', 5, 'foo' #=> " foo"
|
51
|
+
#
|
52
|
+
def self.sprintf1(format, *args)
|
53
|
+
snprintf1(SPRINTF1_BUFFER_SIZE, format, *args).first
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# @!method snprintf1(buffer_size, format, ...)
|
58
|
+
# `printf` for single formatting parameter with manual buffer size.
|
59
|
+
#
|
60
|
+
# @param buffer_size [Integer] buffer size (including terminating null
|
61
|
+
# character)
|
62
|
+
# @param format [String] formatting string
|
63
|
+
# @return [Array<(String, Integer)>] formatted output and it's size
|
64
|
+
#
|
65
|
+
# @see .sprintf1 Automatic buffer size
|
66
|
+
##
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# rubocop:enable Style/Documentation
|
data/lib/kernaux.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
##
|
4
|
+
# Binding to [libkernaux](https://github.com/tailix/libkernaux) - auxiliary
|
5
|
+
# library for kernel development.
|
6
|
+
#
|
7
|
+
module KernAux
|
8
|
+
end
|
9
|
+
|
10
|
+
require_relative 'kernaux/version'
|
11
|
+
|
12
|
+
# Native extensions
|
13
|
+
require_relative 'kernaux/default'
|
14
|
+
|
15
|
+
# Non-standard directory structure
|
16
|
+
require_relative 'kernaux/assert'
|
17
|
+
require_relative 'kernaux/cmdline'
|
18
|
+
require_relative 'kernaux/errors'
|
19
|
+
require_relative 'kernaux/io'
|
20
|
+
require_relative 'kernaux/ntoa'
|
21
|
+
require_relative 'kernaux/printf'
|
metadata
ADDED
@@ -0,0 +1,232 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kernaux
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Kotov
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-06-16 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: '2.2'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.14'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.14'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '13.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake-compiler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.10'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.25'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.25'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-performance
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.13'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.13'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.6'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.6'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.7'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.7'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.21'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.21'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: yard
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.9'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.9'
|
167
|
+
description: Binding to libkernaux - auxiliary library for kernel development.
|
168
|
+
email:
|
169
|
+
- kotovalexarian@gmail.com
|
170
|
+
executables: []
|
171
|
+
extensions:
|
172
|
+
- ext/default/extconf.rb
|
173
|
+
extra_rdoc_files: []
|
174
|
+
files:
|
175
|
+
- ".gitignore"
|
176
|
+
- ".rubocop.yml"
|
177
|
+
- ".simplecov"
|
178
|
+
- ".yardopts"
|
179
|
+
- Gemfile
|
180
|
+
- README.md
|
181
|
+
- Rakefile
|
182
|
+
- bin/console
|
183
|
+
- bin/setup
|
184
|
+
- ext/default/assert.c
|
185
|
+
- ext/default/cmdline.c
|
186
|
+
- ext/default/dynarg.c
|
187
|
+
- ext/default/dynarg.h
|
188
|
+
- ext/default/extconf.rb
|
189
|
+
- ext/default/io.c
|
190
|
+
- ext/default/main.c
|
191
|
+
- ext/default/main.h
|
192
|
+
- ext/default/ntoa.c
|
193
|
+
- ext/default/printf.c
|
194
|
+
- ext/default/version.c
|
195
|
+
- kernaux.gemspec
|
196
|
+
- lib/kernaux.rb
|
197
|
+
- lib/kernaux/assert.rb
|
198
|
+
- lib/kernaux/cmdline.rb
|
199
|
+
- lib/kernaux/errors.rb
|
200
|
+
- lib/kernaux/io.rb
|
201
|
+
- lib/kernaux/ntoa.rb
|
202
|
+
- lib/kernaux/printf.rb
|
203
|
+
- lib/kernaux/version.rb
|
204
|
+
homepage: https://github.com/tailix/libkernaux/tree/master/bindings/ruby
|
205
|
+
licenses:
|
206
|
+
- MIT
|
207
|
+
metadata:
|
208
|
+
rubygems_mfa_required: 'true'
|
209
|
+
homepage_uri: https://github.com/tailix/libkernaux/tree/master/bindings/ruby
|
210
|
+
source_code_uri: https://github.com/tailix/libkernaux/tree/master/bindings/ruby
|
211
|
+
bug_tracker_uri: https://github.com/tailix/libkernaux/issues
|
212
|
+
documentation_uri: https://www.rubydoc.info/gems/kernaux/0.4.0
|
213
|
+
post_install_message:
|
214
|
+
rdoc_options: []
|
215
|
+
require_paths:
|
216
|
+
- lib
|
217
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - "~>"
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '3.0'
|
222
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
+
requirements:
|
224
|
+
- - ">="
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: '0'
|
227
|
+
requirements: []
|
228
|
+
rubygems_version: 3.2.22
|
229
|
+
signing_key:
|
230
|
+
specification_version: 4
|
231
|
+
summary: Binding to libkernaux - auxiliary library for kernel development
|
232
|
+
test_files: []
|