12 Commits

10 changed files with 194 additions and 173 deletions

3
.gitignore vendored
View File

@@ -1,2 +1 @@
/dbus-prettifier /target
*.o

7
Cargo.lock generated Normal file
View File

@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "dbus-prettifier"
version = "1.0.0"

14
Cargo.toml Normal file
View File

@@ -0,0 +1,14 @@
[package]
name = "dbus-prettifier"
version = "1.0.0"
edition = "2024"
authors = [ "Nicolás A. Ortega Froysa <nicolas@ortegas.org>" ]
description = "A tool to prettify the output of qdbus."
readme = "./README.md"
homepage = "https://code.ortegas.org/nortega/dbus-prettifier"
repository = "https://code.ortegas.org/nortega/dbus-prettifier"
license = "Zlib"
keywords = [ "dbus", "qdbus", "prettifier" ]
categories = [ "command-line-utilities" ]
[dependencies]

View File

@@ -1,4 +1,4 @@
Copyright (C) [year] Nicolás A. Ortega Froysa <nicolas@ortegas.org> Copyright (C) 2025 Nicolás A. Ortega Froysa <nicolas@ortegas.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View File

@@ -1,57 +0,0 @@
# Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
# Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
#
# This software is provided 'as-is', without any express or implied
# warranty. In no event will the authors be held liable for any damages
# arising from the use of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it
# freely, subject to the following restrictions:
#
# 1. The origin of this software must not be misrepresented; you must not
# claim that you wrote the original software. If you use this software
# in a product, an acknowledgment in the product documentation would be
# appreciated but is not required.
#
# 2. Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
#
# 3. This notice may not be removed or altered from any source
# distribution.
DEBUG=0
INCFLAGS=
LDFLAGS=
DEFS=
CFLAGS=$(INCFLAGS) -std=gnu99 -Wall -Wextra -Wfatal-errors -Werror
HDRS=
OBJS=src/main.o
VERSION=1.0
ifeq ($(PREFIX),)
PREFIX := /usr/local
endif
ifeq ($(DEBUG),1)
CFLAGS+=-g -O0
else
CFLAGS+=-O2 -DNDEBUG
endif
%.o:%.cpp $(HDRS)
$(CC) -c -o $@ $< $(CFLAGS) -DVERSION=\"$(VERSION)\"
dbus-prettifier: $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
.PHONY: clean distclean install
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) dbus-prettifier
install: dbus-prettifier
install -Dm755 dbus-prettifier $(PREFIX)/bin/

View File

@@ -9,29 +9,19 @@ file with the output so that it is much more readable.
To run the program, simply run it as follows: To run the program, simply run it as follows:
```console ```console
$ qdbus-prettifier <in-file> <out-file> qdbus-prettifier <in-file> [out-file]
``` ```
## Building ## Building
Requirements: To compile the program, install the Rust suite, namely the compiler and Cargo.
Once installed you can run `cargo build --release` to generate a release build
of the project which will be found at `target/release/dbus-prettifier`.
- C compiler that supports GNU99 (GCC recommended). To install you can use the `install` command as follows:
- (GNU) Make
Build with `make`:
```console ```console
$ make install -Dm755 target/release/dbus-prettifier /usr/local/bin
cc -std=gnu99 -Wall -Wextra -Wfatal-errors -Werror -O2 -DNDEBUG -c -o src/main.o src/main.c
cc -o dbus-prettifier src/main.o
```
Install with `make install`:
```console
$ sudo make install
install -Dm755 dbus-prettifier /usr/local/bin/
``` ```
## License ## License

View File

@@ -1,97 +0,0 @@
/*
* Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
* Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
const char *in_file_path = argv[1], *out_file_path = argv[2];
FILE *in_file = NULL, *out_file = NULL;
int ret = EXIT_SUCCESS;
int tab_num = 0;
char ch, last_ch = 0;
if(argc != 3) {
printf("Usage: %s <in-file> <out-file>\n", argv[0]);
return EXIT_FAILURE;
}
in_file = fopen(in_file_path, "r");
if(!in_file) {
fprintf(stderr, "Failed to open file '%s'.", in_file_path);
ret = EXIT_FAILURE;
goto exit_err;
}
out_file = fopen(out_file_path, "w");
if(!out_file) {
fprintf(stderr, "Failed to open file '%s'.", out_file_path);
ret = EXIT_FAILURE;
goto exit_err;
}
ch = fgetc(in_file);
while(ch != EOF) {
switch(ch) {
case '[':
case '{':
tab_num++;
fprintf(out_file, "%c\n", ch);
for(int i = 0; i < tab_num; ++i)
fprintf(out_file, " ");
last_ch = ' ';
break;
case ']':
case '}':
tab_num--;
fputc('\n', out_file);
for(int i = 0; i < tab_num; ++i)
fprintf(out_file, " ");
fputc(ch, out_file);
break;
case ',':
fprintf(out_file, "%c\n", ch);
for(int i = 0; i < tab_num; ++i)
fprintf(out_file, " ");
last_ch = ' ';
break;
default:
if(ch != ' ' || last_ch != ' ') {
fputc(ch, out_file);
last_ch = ch;
}
break;
}
ch = fgetc(in_file);
}
exit_err:
if(in_file)
fclose(in_file);
if(out_file)
fclose(out_file);
return ret;
}

87
src/main.rs Normal file
View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
* Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
use std::env;
use std::io;
use std::process;
use crate::worker::work;
mod worker;
fn print_version() {
println!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
}
fn print_usage() {
println!("Usage: {} <in-file> [out-file]", env!("CARGO_PKG_NAME"));
}
fn print_help() {
print_version();
println!("Usage: \n\
\t{} <in-file> [out-file]\n\
\t{} -h | -v\n\
\n\
OPTIONS:\n\
\tin-file Input file ('-' for stdin)\n\
\tout-file Output file\n\
\t-h Show this help information\n\
\t-v Show version information",
env!("CARGO_PKG_NAME"), env!("CARGO_PKG_NAME"));
}
fn main() -> io::Result<()> {
let args:Vec<String> = env::args().collect();
let mut in_path:Option<&str> = None;
let mut out_path:Option<&str> = None;
if args.len() < 2 || args.len() > 3 {
eprintln!("Invalid number of arguments. Use -h for more information.");
print_usage();
process::exit(1);
}
for i in &args {
if i == "-h" {
print_help();
return Ok(());
} else if i == "-v" {
print_version();
return Ok(());
} else if i.starts_with("-") && i != "-" {
eprintln!("Invalid argument '{}'. Use -h for help information.", i);
process::exit(1);
}
}
if args[1] != "-" {
in_path = Some(args[1].as_str());
}
if args.len() == 3 {
out_path = Some(args[2].as_str());
}
work(in_path, out_path)
}

77
src/worker.rs Normal file
View File

@@ -0,0 +1,77 @@
use std::io;
use std::fs;
use std::io::Read;
use std::boxed::Box;
// Read 1KiB of the file at a time.
static BLOCK_SIZE:usize = 1024;
pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> {
let mut in_reader:Box<dyn io::Read> = match in_path {
Some(x) => {
let in_file = fs::File::open(x)?;
Box::new(io::BufReader::new(in_file))
},
None => {
Box::new(io::stdin())
},
};
let mut out_writer:Box<dyn io::Write> = match out_path {
Some(x) => {
let out_file = fs::File::create(x)?;
Box::new(io::BufWriter::new(out_file))
},
None => {
Box::new(io::stdout())
},
};
let mut read_buf:[u8; BLOCK_SIZE] = [0; BLOCK_SIZE];
let mut last_ch:char = '\0';
let mut tab_num = 0;
while in_reader.read(&mut read_buf)? > 0 {
for i in read_buf {
let ch = i as char;
match ch {
'[' | '{' => {
tab_num += 1;
out_writer.write(format!("{}\n", ch).as_bytes())?;
for _ in 0..tab_num {
out_writer.write(b" ")?;
}
last_ch = ' ';
},
']' | '}' => {
tab_num -= 1;
out_writer.write(b"\n")?;
for _ in 0..tab_num {
out_writer.write(b" ")?;
}
out_writer.write(format!("{}", ch).as_bytes())?;
last_ch = ch;
},
',' => {
out_writer.write(format!("{}\n", ch).as_bytes())?;
for _ in 0..tab_num {
out_writer.write(b" ")?;
}
last_ch = ' ';
},
_ => {
let ch = ch;
if ch != ' ' || last_ch != ' ' {
out_writer.write(format!("{}", ch).as_bytes())?;
last_ch = ch;
}
},
}
}
}
out_writer.flush()?;
Ok(())
}

1
test.txt Normal file
View File

@@ -0,0 +1 @@
[Variant(QByteArray): {47, 100, 101, 118, 47, 115, 100, 98, 49, 0}]