Skip to content

Commit

Permalink
Kebabify. (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
floitsch committed Mar 20, 2024
1 parent 8a3a9f8 commit d265946
Show file tree
Hide file tree
Showing 2 changed files with 205 additions and 205 deletions.
268 changes: 134 additions & 134 deletions src/ar.toit
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,34 @@ import bytes
import writer show Writer
import reader show Reader BufferedReader

AR_HEADER_ ::= "!<arch>\x0A"

FILE_NAME_OFFSET_ ::= 0
FILE_TIMESTAMP_OFFSET_ ::= 16
FILE_OWNER_ID_OFFSET_ ::= 28
FILE_GROUP_ID_OFFSET_ ::= 34
FILE_MODE_OFFSET_ ::= 40
FILE_BYTE_SIZE_OFFSET_ ::= 48
FILE_ENDING_CHARS_OFFSET_ ::= 58
FILE_HEADER_SIZE_ ::= 60

FILE_ENDING_CHARS_ ::= "\x60\x0A"

FILE_NAME_SIZE_ ::= FILE_TIMESTAMP_OFFSET_ - FILE_NAME_OFFSET_
FILE_TIMESTAMP_SIZE_ ::= FILE_OWNER_ID_OFFSET_ - FILE_TIMESTAMP_OFFSET_
FILE_OWNER_ID_SIZE_ ::= FILE_GROUP_ID_OFFSET_ - FILE_OWNER_ID_OFFSET_
FILE_GROUP_ID_SIZE_ ::= FILE_MODE_OFFSET_ - FILE_GROUP_ID_OFFSET_
FILE_MODE_SIZE_ ::= FILE_BYTE_SIZE_OFFSET_ - FILE_MODE_OFFSET_
FILE_BYTE_SIZE_SIZE_ ::= FILE_ENDING_CHARS_OFFSET_ - FILE_BYTE_SIZE_OFFSET_
FILE_ENDING_CHARS_SIZE_ ::= FILE_HEADER_SIZE_ - FILE_ENDING_CHARS_OFFSET_

PADDING_STRING_ ::= "\x0A"
PADDING_CHAR_ ::= '\x0A'

DETERMINISTIC_TIMESTAMP_ ::= 0
DETERMINISTIC_OWNER_ID_ ::= 0
DETERMINISTIC_GROUP_ID_ ::= 0
DETERMINISTIC_MODE_ ::= 0b110_100_100 // Octal 644.
AR-HEADER_ ::= "!<arch>\x0A"

FILE-NAME-OFFSET_ ::= 0
FILE-TIMESTAMP-OFFSET_ ::= 16
FILE-OWNER-ID-OFFSET_ ::= 28
FILE-GROUP-ID-OFFSET_ ::= 34
FILE-MODE-OFFSET_ ::= 40
FILE-BYTE-SIZE-OFFSET_ ::= 48
FILE-ENDING-CHARS-OFFSET_ ::= 58
FILE-HEADER-SIZE_ ::= 60

FILE-ENDING-CHARS_ ::= "\x60\x0A"

FILE-NAME-SIZE_ ::= FILE-TIMESTAMP-OFFSET_ - FILE-NAME-OFFSET_
FILE-TIMESTAMP-SIZE_ ::= FILE-OWNER-ID-OFFSET_ - FILE-TIMESTAMP-OFFSET_
FILE-OWNER-ID-SIZE_ ::= FILE-GROUP-ID-OFFSET_ - FILE-OWNER-ID-OFFSET_
FILE-GROUP-ID-SIZE_ ::= FILE-MODE-OFFSET_ - FILE-GROUP-ID-OFFSET_
FILE-MODE-SIZE_ ::= FILE-BYTE-SIZE-OFFSET_ - FILE-MODE-OFFSET_
FILE-BYTE-SIZE-SIZE_ ::= FILE-ENDING-CHARS-OFFSET_ - FILE-BYTE-SIZE-OFFSET_
FILE-ENDING-CHARS-SIZE_ ::= FILE-HEADER-SIZE_ - FILE-ENDING-CHARS-OFFSET_

PADDING-STRING_ ::= "\x0A"
PADDING-CHAR_ ::= '\x0A'

DETERMINISTIC-TIMESTAMP_ ::= 0
DETERMINISTIC-OWNER-ID_ ::= 0
DETERMINISTIC-GROUP-ID_ ::= 0
DETERMINISTIC-MODE_ ::= 0b110_100_100 // Octal 644.
/**
An 'ar' archiver.
Expand All @@ -45,7 +45,7 @@ class ArWriter:

constructor writer:
writer_ = Writer writer
write_ar_header_
write-ar-header_

/**
Adds a new "file" to the ar-archive.
Expand All @@ -55,30 +55,30 @@ class ArWriter:
modification date is set to 0 (epoch time).
*/
add name/string content -> none:
if name.size > FILE_NAME_SIZE_: throw "Filename too long"
write_ar_file_header_ name content.size
if name.size > FILE-NAME-SIZE_: throw "Filename too long"
write-ar-file-header_ name content.size
writer_.write content
if needs_padding_ content.size:
writer_.write PADDING_STRING_
if needs-padding_ content.size:
writer_.write PADDING-STRING_

/**
Variant of $(add name content).
Adds a new $ar_file to the ar-archive.
Adds a new $ar-file to the ar-archive.
*/
add ar_file/ArFile -> none:
add ar_file.name ar_file.content
add ar-file/ArFile -> none:
add ar-file.name ar-file.content

write_ar_header_:
writer_.write AR_HEADER_
write-ar-header_:
writer_.write AR-HEADER_

write_string_ str/string header/ByteArray offset/int size/int:
write-string_ str/string header/ByteArray offset/int size/int:
for i := 0; i < size; i++:
if i < str.size:
header[offset + i] = str.at --raw i
else:
header[offset + i] = ' '

write_number_ --base/int n/int header/ByteArray offset/int size/int:
write-number_ --base/int n/int header/ByteArray offset/int size/int:
// For simplicity we write the number right to left and then shift
// the computed values.
i := size - 1
Expand All @@ -88,53 +88,53 @@ class ArWriter:
if n == 0: break
if n != 0: throw "OUT_OF_RANGE"
// 'i' is the last entry where we wrote a significant digit.
nb_digits := size - i
number_offset := i
header.replace offset header (offset + number_offset) (offset + size)
nb-digits := size - i
number-offset := i
header.replace offset header (offset + number-offset) (offset + size)
// Pad the rest with spaces.
for j := nb_digits; j < size; j++:
for j := nb-digits; j < size; j++:
header[offset + j] = ' '

write_decimal_ n/int header/ByteArray offset/int size/int:
write_number_ --base=10 n header offset size
write-decimal_ n/int header/ByteArray offset/int size/int:
write-number_ --base=10 n header offset size

write_octal_ n/int header/ByteArray offset/int size/int:
write_number_ --base=8 n header offset size
write-octal_ n/int header/ByteArray offset/int size/int:
write-number_ --base=8 n header offset size

write_ar_file_header_ name/string content_size/int:
header := ByteArray FILE_HEADER_SIZE_
write_string_ name
write-ar-file-header_ name/string content-size/int:
header := ByteArray FILE-HEADER-SIZE_
write-string_ name
header
FILE_NAME_OFFSET_
FILE_NAME_SIZE_
write_decimal_ DETERMINISTIC_TIMESTAMP_
FILE-NAME-OFFSET_
FILE-NAME-SIZE_
write-decimal_ DETERMINISTIC-TIMESTAMP_
header
FILE_TIMESTAMP_OFFSET_
FILE_TIMESTAMP_SIZE_
write_decimal_ DETERMINISTIC_OWNER_ID_
FILE-TIMESTAMP-OFFSET_
FILE-TIMESTAMP-SIZE_
write-decimal_ DETERMINISTIC-OWNER-ID_
header
FILE_OWNER_ID_OFFSET_
FILE_OWNER_ID_SIZE_
write_decimal_ DETERMINISTIC_GROUP_ID_
FILE-OWNER-ID-OFFSET_
FILE-OWNER-ID-SIZE_
write-decimal_ DETERMINISTIC-GROUP-ID_
header
FILE_GROUP_ID_OFFSET_
FILE_GROUP_ID_SIZE_
write_octal_ DETERMINISTIC_MODE_
FILE-GROUP-ID-OFFSET_
FILE-GROUP-ID-SIZE_
write-octal_ DETERMINISTIC-MODE_
header
FILE_MODE_OFFSET_
FILE_MODE_SIZE_
write_decimal_ content_size
FILE-MODE-OFFSET_
FILE-MODE-SIZE_
write-decimal_ content-size
header
FILE_BYTE_SIZE_OFFSET_
FILE_BYTE_SIZE_SIZE_
write_string_ FILE_ENDING_CHARS_
FILE-BYTE-SIZE-OFFSET_
FILE-BYTE-SIZE-SIZE_
write-string_ FILE-ENDING-CHARS_
header
FILE_ENDING_CHARS_OFFSET_
FILE_ENDING_CHARS_SIZE_
FILE-ENDING-CHARS-OFFSET_
FILE-ENDING-CHARS-SIZE_

writer_.write header

needs_padding_ size/int -> bool:
needs-padding_ size/int -> bool:
return size & 1 == 1

class ArFile:
Expand All @@ -156,31 +156,31 @@ class ArReader:

constructor reader/Reader:
reader_ = BufferedReader reader
skip_header_
skip-header_

constructor.from_bytes buffer/ByteArray:
constructor.from-bytes buffer/ByteArray:
return ArReader (bytes.Reader buffer)

/// Returns the next file in the archive.
/// Returns null if none is left.
next -> ArFile?:
name := read_name_
name := read-name_
if not name: return null
byte_size := read_byte_size_skip_ignored_header_
content := read_content_ byte_size
byte-size := read-byte-size-skip-ignored-header_
content := read-content_ byte-size
return ArFile name content

/**
Returns the next $ArFileOffsets, or `null` if no file is left.
*/
next --offsets/bool -> ArFileOffsets?:
if not offsets: throw "INVALID_ARGUMENT"
name := read_name_
name := read-name_
if not name: return null
byte_size := read_byte_size_skip_ignored_header_
content_offset := offset_
skip_content_ byte_size
return ArFileOffsets name content_offset (content_offset + byte_size)
byte-size := read-byte-size-skip-ignored-header_
content-offset := offset_
skip-content_ byte-size
return ArFileOffsets name content-offset (content-offset + byte-size)

/// Invokes the given $block on each $ArFile of the archive.
do [block]:
Expand All @@ -190,8 +190,8 @@ class ArReader:
/// Invokes the given $block on each $ArFileOffsets of the archive.
do --offsets/bool [block]:
if not offsets: throw "INVALID_ARGUMENT"
while file_offsets := next --offsets:
block.call file_offsets
while file-offsets := next --offsets:
block.call file-offsets

/**
Finds the given $name file in the archive.
Expand All @@ -202,13 +202,13 @@ class ArReader:
*/
find name/string -> ArFile?:
while true:
file_name := read_name_
if not file_name: return null
byte_size := read_byte_size_skip_ignored_header_
if file_name == name:
content := read_content_ byte_size
file-name := read-name_
if not file-name: return null
byte-size := read-byte-size-skip-ignored-header_
if file-name == name:
content := read-content_ byte-size
return ArFile name content
skip_content_ byte_size
skip-content_ byte-size

/**
Finds the given $name file in the archive.
Expand All @@ -220,21 +220,21 @@ class ArReader:
find --offsets/bool name/string -> ArFileOffsets?:
if not offsets: throw "INVALID_ARGUMENT"
while true:
file_name := read_name_
if not file_name: return null
byte_size := read_byte_size_skip_ignored_header_
if file_name == name:
file_offset := offset_
skip_content_ byte_size
return ArFileOffsets name file_offset (file_offset + byte_size)
skip_content_ byte_size

skip_header_:
header := reader_read_string_ AR_HEADER_.size
if header != AR_HEADER_: throw "Invalid Ar File"

read_decimal_ size/int -> int:
str := reader_read_string_ size
file-name := read-name_
if not file-name: return null
byte-size := read-byte-size-skip-ignored-header_
if file-name == name:
file-offset := offset_
skip-content_ byte-size
return ArFileOffsets name file-offset (file-offset + byte-size)
skip-content_ byte-size

skip-header_:
header := reader-read-string_ AR-HEADER_.size
if header != AR-HEADER_: throw "Invalid Ar File"

read-decimal_ size/int -> int:
str := reader-read-string_ size
result := 0
for i := 0; i < str.size; i++:
c := str[i]
Expand All @@ -243,52 +243,52 @@ class ArReader:
else: throw "INVALID_AR_FORMAT"
return result

is_padded_ size/int: return size & 1 == 1
is-padded_ size/int: return size & 1 == 1

read_name_ -> string?:
if not reader_.can_ensure 1: return null
name / string := reader_read_string_ FILE_NAME_SIZE_
read-name_ -> string?:
if not reader_.can-ensure 1: return null
name / string := reader-read-string_ FILE-NAME-SIZE_
name = name.trim --right
if name.ends_with "/": name = name.trim --right "/"
if name.ends-with "/": name = name.trim --right "/"
return name

read_byte_size_skip_ignored_header_ -> int:
skip_count := FILE_TIMESTAMP_SIZE_
+ FILE_OWNER_ID_SIZE_
+ FILE_GROUP_ID_SIZE_
+ FILE_MODE_SIZE_
reader_skip_ skip_count
byte_size := read_decimal_ FILE_BYTE_SIZE_SIZE_
ending_char1 := reader_read_byte_
ending_char2 := reader_read_byte_
if ending_char1 != FILE_ENDING_CHARS_[0] or ending_char2 != FILE_ENDING_CHARS_[1]:
read-byte-size-skip-ignored-header_ -> int:
skip-count := FILE-TIMESTAMP-SIZE_
+ FILE-OWNER-ID-SIZE_
+ FILE-GROUP-ID-SIZE_
+ FILE-MODE-SIZE_
reader-skip_ skip-count
byte-size := read-decimal_ FILE-BYTE-SIZE-SIZE_
ending-char1 := reader-read-byte_
ending-char2 := reader-read-byte_
if ending-char1 != FILE-ENDING-CHARS_[0] or ending-char2 != FILE-ENDING-CHARS_[1]:
throw "INVALID_AR_FORMAT"
return byte_size
return byte-size

read_content_ byte_size/int -> ByteArray:
content := reader_read_bytes_ byte_size
if is_padded_ byte_size: reader_skip_ 1
read-content_ byte-size/int -> ByteArray:
content := reader-read-bytes_ byte-size
if is-padded_ byte-size: reader-skip_ 1
return content

skip_content_ byte_size/int -> none:
reader_skip_ byte_size
if is_padded_ byte_size: reader_skip_ 1
skip-content_ byte-size/int -> none:
reader-skip_ byte-size
if is-padded_ byte-size: reader-skip_ 1

reader_read_string_ size/int -> string:
result := reader_.read_string size
reader-read-string_ size/int -> string:
result := reader_.read-string size
offset_ += size
return result

reader_skip_ size/int -> none:
reader-skip_ size/int -> none:
reader_.skip size
offset_ += size

reader_read_byte_ -> int:
result := reader_.read_byte
reader-read-byte_ -> int:
result := reader_.read-byte
offset_++
return result

reader_read_bytes_ size/int -> ByteArray:
result := reader_.read_bytes size
reader-read-bytes_ size/int -> ByteArray:
result := reader_.read-bytes size
offset_ += size
return result

0 comments on commit d265946

Please sign in to comment.