Class: Prism::Pack::Directive

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/pack.rb,
ext/prism/api_pack.c

Overview

A directive in the pack template language.

Constant Summary collapse

ENDIAN_DESCRIPTIONS =

The descriptions of the various types of endianness.

{
  AGNOSTIC_ENDIAN: "agnostic",
  LITTLE_ENDIAN: "little-endian (VAX)",
  BIG_ENDIAN: "big-endian (network)",
  NATIVE_ENDIAN: "native-endian",
  ENDIAN_NA: "n/a"
}
SIGNED_DESCRIPTIONS =

The descriptions of the various types of signedness.

{
  UNSIGNED: "unsigned",
  SIGNED: "signed",
  SIGNED_NA: "n/a"
}
SIZE_DESCRIPTIONS =

The descriptions of the various types of sizes.

{
  SIZE_SHORT: "short",
  SIZE_INT: "int-width",
  SIZE_LONG: "long",
  SIZE_LONG_LONG: "long long",
  SIZE_8: "8-bit",
  SIZE_16: "16-bit",
  SIZE_32: "32-bit",
  SIZE_64: "64-bit",
  SIZE_P: "pointer-width"
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version, variant, source, type, signed, endian, size, length_type, length) ⇒ Directive

Initialize a new directive with the given values.



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/prism/pack.rb', line 89

def initialize(version, variant, source, type, signed, endian, size, length_type, length)
  @version = version
  @variant = variant
  @source = source
  @type = type
  @signed = signed
  @endian = endian
  @size = size
  @length_type = length_type
  @length = length
end

Instance Attribute Details

#endianObject (readonly)

The type of endianness of the directive.



77
78
79
# File 'lib/prism/pack.rb', line 77

def endian
  @endian
end

#lengthObject (readonly)

The length of this directive (used for integers).



86
87
88
# File 'lib/prism/pack.rb', line 86

def length
  @length
end

#length_typeObject (readonly)

The length type of this directive (used for integers).



83
84
85
# File 'lib/prism/pack.rb', line 83

def length_type
  @length_type
end

#signedObject (readonly)

The type of signedness of the directive.



74
75
76
# File 'lib/prism/pack.rb', line 74

def signed
  @signed
end

#sizeObject (readonly)

The size of the directive.



80
81
82
# File 'lib/prism/pack.rb', line 80

def size
  @size
end

#sourceObject (readonly)

A byteslice of the source string that this directive represents.



68
69
70
# File 'lib/prism/pack.rb', line 68

def source
  @source
end

#typeObject (readonly)

The type of the directive.



71
72
73
# File 'lib/prism/pack.rb', line 71

def type
  @type
end

#variantObject (readonly)

A symbol representing whether or not we are packing or unpacking.



65
66
67
# File 'lib/prism/pack.rb', line 65

def variant
  @variant
end

#versionObject (readonly)

A symbol representing the version of Ruby.



62
63
64
# File 'lib/prism/pack.rb', line 62

def version
  @version
end

Instance Method Details

#describeObject

Provide a human-readable description of the directive.



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/prism/pack.rb', line 131

def describe
  case type
  when SPACE
    "whitespace"
  when COMMENT
    "comment"
  when INTEGER
    if size == SIZE_8
      base = "#{SIGNED_DESCRIPTIONS[signed]} #{SIZE_DESCRIPTIONS[size]} integer"
    else
      base = "#{SIGNED_DESCRIPTIONS[signed]} #{SIZE_DESCRIPTIONS[size]} #{ENDIAN_DESCRIPTIONS[endian]} integer"
    end
    case length_type
    when LENGTH_FIXED
      if length > 1
        base + ", x#{length}"
      else
        base
      end
    when LENGTH_MAX
      base + ", as many as possible"
    else
      raise
    end
  when UTF8
    "UTF-8 character"
  when BER
    "BER-compressed integer"
  when FLOAT
    "#{SIZE_DESCRIPTIONS[size]} #{ENDIAN_DESCRIPTIONS[endian]} float"
  when STRING_SPACE_PADDED
    "arbitrary binary string (space padded)"
  when STRING_NULL_PADDED
    "arbitrary binary string (null padded, count is width)"
  when STRING_NULL_TERMINATED
    "arbitrary binary string (null padded, count is width), except that null is added with *"
  when STRING_MSB
    "bit string (MSB first)"
  when STRING_LSB
    "bit string (LSB first)"
  when STRING_HEX_HIGH
    "hex string (high nibble first)"
  when STRING_HEX_LOW
    "hex string (low nibble first)"
  when STRING_UU
    "UU-encoded string"
  when STRING_MIME
    "quoted printable, MIME encoding"
  when STRING_BASE64
    "base64 encoded string"
  when STRING_FIXED
    "pointer to a structure (fixed-length string)"
  when STRING_POINTER
    "pointer to a null-terminated string"
  when MOVE
    "move to absolute position"
  when BACK
    "back up a byte"
  when NULL
    "null byte"
  else
    raise
  end
end