forked from openrs2/openrs2
These are useful for manipulating the files used by the loader, some of which are compressed with DEFLATE or headerless gzip. Signed-off-by: Graham <gpe@openrs2.dev>
parent
892d21df10
commit
c849c5ad46
@ -0,0 +1,24 @@ |
||||
plugins { |
||||
`maven-publish` |
||||
kotlin("jvm") |
||||
} |
||||
|
||||
dependencies { |
||||
api("com.github.ajalt:clikt:${Versions.clikt}") |
||||
} |
||||
|
||||
publishing { |
||||
publications.create<MavenPublication>("maven") { |
||||
from(components["java"]) |
||||
|
||||
pom { |
||||
packaging = "jar" |
||||
name.set("OpenRS2 CLI") |
||||
description.set( |
||||
""" |
||||
Clikt extensions. |
||||
""".trimIndent() |
||||
) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,40 @@ |
||||
package dev.openrs2.cli |
||||
|
||||
import com.github.ajalt.clikt.parameters.options.NullableOption |
||||
import com.github.ajalt.clikt.parameters.options.OptionWithValues |
||||
import com.github.ajalt.clikt.parameters.options.RawOption |
||||
import com.github.ajalt.clikt.parameters.options.convert |
||||
import com.github.ajalt.clikt.parameters.options.default |
||||
import java.io.InputStream |
||||
import java.io.OutputStream |
||||
import java.nio.file.Files |
||||
|
||||
fun RawOption.inputStream(): NullableOption<InputStream, InputStream> { |
||||
return convert("FILE") { |
||||
return@convert if (it == "-") { |
||||
System.`in` |
||||
} else { |
||||
Files.newInputStream(java.nio.file.Paths.get(it)) |
||||
} |
||||
} |
||||
} |
||||
|
||||
fun NullableOption<InputStream, InputStream>.defaultStdin(): OptionWithValues<InputStream, InputStream, InputStream> { |
||||
return default(System.`in`, "-") |
||||
} |
||||
|
||||
fun RawOption.outputStream(): NullableOption<OutputStream, OutputStream> { |
||||
return convert("FILE") { |
||||
return@convert if (it == "-") { |
||||
System.out |
||||
} else { |
||||
Files.newOutputStream(java.nio.file.Paths.get(it)) |
||||
} |
||||
} |
||||
} |
||||
|
||||
fun NullableOption<OutputStream, OutputStream>.defaultStdout(): OptionWithValues<OutputStream, OutputStream, |
||||
OutputStream> { |
||||
|
||||
return default(System.out, "-") |
||||
} |
@ -0,0 +1,32 @@ |
||||
plugins { |
||||
`maven-publish` |
||||
application |
||||
kotlin("jvm") |
||||
} |
||||
|
||||
application { |
||||
mainClassName = "dev.openrs2.compress.cli.CompressCommandKt" |
||||
} |
||||
|
||||
dependencies { |
||||
api(project(":cli")) |
||||
|
||||
implementation(project(":compress")) |
||||
} |
||||
|
||||
publishing { |
||||
publications.create<MavenPublication>("maven") { |
||||
from(components["java"]) |
||||
|
||||
pom { |
||||
packaging = "jar" |
||||
name.set("OpenRS2 Compression CLI") |
||||
description.set( |
||||
""" |
||||
Tools for compressing and uncompressing headerless bzip2, |
||||
DEFLATE and gzip files. |
||||
""".trimIndent() |
||||
) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
package dev.openrs2.compress.cli |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.core.subcommands |
||||
import dev.openrs2.compress.cli.bzip2.Bunzip2Command |
||||
import dev.openrs2.compress.cli.bzip2.Bzip2Command |
||||
import dev.openrs2.compress.cli.deflate.DeflateCommand |
||||
import dev.openrs2.compress.cli.deflate.InflateCommand |
||||
import dev.openrs2.compress.cli.gzip.GunzipCommand |
||||
import dev.openrs2.compress.cli.gzip.GzipCommand |
||||
|
||||
fun main(args: Array<String>) = CompressCommand().main(args) |
||||
|
||||
class CompressCommand : CliktCommand(name = "compress") { |
||||
init { |
||||
subcommands( |
||||
Bzip2Command(), |
||||
Bunzip2Command(), |
||||
DeflateCommand(), |
||||
InflateCommand(), |
||||
GzipCommand(), |
||||
GunzipCommand() |
||||
) |
||||
} |
||||
|
||||
override fun run() { |
||||
// empty |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
package dev.openrs2.compress.cli.bzip2 |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import dev.openrs2.compress.bzip2.Bzip2 |
||||
|
||||
class Bunzip2Command : CliktCommand(name = "bunzip2") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
|
||||
override fun run() { |
||||
Bzip2.createHeaderlessInputStream(input).use { input -> |
||||
output.use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
package dev.openrs2.compress.cli.bzip2 |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import dev.openrs2.compress.bzip2.Bzip2 |
||||
|
||||
class Bzip2Command : CliktCommand(name = "bzip2") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
|
||||
override fun run() { |
||||
input.use { input -> |
||||
Bzip2.createHeaderlessOutputStream(output).use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,31 @@ |
||||
package dev.openrs2.compress.cli.deflate |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.default |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import com.github.ajalt.clikt.parameters.options.validate |
||||
import com.github.ajalt.clikt.parameters.types.int |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import java.util.zip.Deflater |
||||
import java.util.zip.DeflaterOutputStream |
||||
|
||||
class DeflateCommand : CliktCommand(name = "deflate") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
private val level by option().int().default(Deflater.BEST_COMPRESSION).validate { |
||||
require(it >= Deflater.NO_COMPRESSION && it <= Deflater.BEST_COMPRESSION) { |
||||
"--level must be between ${Deflater.NO_COMPRESSION} and ${Deflater.BEST_COMPRESSION} inclusive" |
||||
} |
||||
} |
||||
|
||||
override fun run() { |
||||
input.use { input -> |
||||
DeflaterOutputStream(output, Deflater(level, true)).use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
package dev.openrs2.compress.cli.deflate |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import java.util.zip.Inflater |
||||
import java.util.zip.InflaterInputStream |
||||
|
||||
class InflateCommand : CliktCommand(name = "inflate") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
|
||||
override fun run() { |
||||
InflaterInputStream(input, Inflater(true)).use { input -> |
||||
output.use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
package dev.openrs2.compress.cli.gzip |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import dev.openrs2.compress.gzip.Gzip |
||||
|
||||
class GunzipCommand : CliktCommand(name = "gunzip") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
|
||||
override fun run() { |
||||
Gzip.createHeaderlessInputStream(input).use { input -> |
||||
output.use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,31 @@ |
||||
package dev.openrs2.compress.cli.gzip |
||||
|
||||
import com.github.ajalt.clikt.core.CliktCommand |
||||
import com.github.ajalt.clikt.parameters.options.default |
||||
import com.github.ajalt.clikt.parameters.options.option |
||||
import com.github.ajalt.clikt.parameters.options.validate |
||||
import com.github.ajalt.clikt.parameters.types.int |
||||
import dev.openrs2.cli.defaultStdin |
||||
import dev.openrs2.cli.defaultStdout |
||||
import dev.openrs2.cli.inputStream |
||||
import dev.openrs2.cli.outputStream |
||||
import dev.openrs2.compress.gzip.Gzip |
||||
import java.util.zip.Deflater |
||||
|
||||
class GzipCommand : CliktCommand(name = "gzip") { |
||||
private val input by option().inputStream().defaultStdin() |
||||
private val output by option().outputStream().defaultStdout() |
||||
private val level by option().int().default(Deflater.BEST_COMPRESSION).validate { |
||||
require(it >= Deflater.NO_COMPRESSION && it <= Deflater.BEST_COMPRESSION) { |
||||
"--level must be between ${Deflater.NO_COMPRESSION} and ${Deflater.BEST_COMPRESSION} inclusive" |
||||
} |
||||
} |
||||
|
||||
override fun run() { |
||||
input.use { input -> |
||||
Gzip.createHeaderlessOutputStream(output, level).use { output -> |
||||
input.copyTo(output) |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue