21 Commits

Author SHA1 Message Date
1ff158c650 Bump version to v1.2.0 2025-10-02 13:56:48 +02:00
9548c2c167 Fix buffer reading. 2025-10-02 13:52:01 +02:00
a123afd052 Simplify formatting. 2025-10-02 12:57:00 +02:00
4dce39e96b Only newline with comma if last_ch == ] or } 2025-10-02 09:59:37 +02:00
5565f1340a Add license to worker.rs file. 2025-09-29 15:16:31 +02:00
b90c5f5f54 Bump version to v1.1.0 2025-09-29 11:43:21 +02:00
2ede3db3b8 Better error messages. 2025-09-29 11:42:34 +02:00
54e4c065ca Limit iteration of args to after program name. 2025-09-29 10:52:26 +02:00
2a1adb048e Remove left-over ch = ch. 2025-09-29 10:48:40 +02:00
ec5a6b770d Bump version to v1.0.0 2025-09-29 10:02:17 +02:00
a9427bf6d7 Add command-line arguments. 2025-09-29 10:01:29 +02:00
c69870e3fa Add metadata to Cargo.toml 2025-09-29 08:27:11 +02:00
7694cc305c README: Set out-file as optional. 2025-09-29 08:04:29 +02:00
a694d35da0 Allow use of stdin (piping) for input file. 2025-09-29 08:01:21 +02:00
1c769a232f Enable writing to stdout. 2025-09-29 07:55:37 +02:00
3b0e68abe4 Delete output from test. 2025-09-28 20:09:11 +02:00
395567c99a Add year to license copyright statement. 2025-09-28 20:07:24 +02:00
0b62595446 Update the README. 2025-09-28 20:06:25 +02:00
eafc6fd18e Add test file. 2025-09-28 20:01:34 +02:00
33547c8965 Switch to Rust. 2025-09-28 20:01:26 +02:00
f64b10e779 Delete C stuff. 2025-09-28 15:34:48 +02:00
10 changed files with 222 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.2.0"

14
Cargo.toml Normal file
View File

@@ -0,0 +1,14 @@
[package]
name = "dbus-prettifier"
version = "1.2.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;
}

90
src/main.rs Normal file
View File

@@ -0,0 +1,90 @@
/*
* 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::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() {
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[1..args.len()] {
if i == "-h" {
print_help();
return;
} else if i == "-v" {
print_version();
return;
} 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());
}
let res = work(in_path, out_path);
if let Err(err) = res {
eprintln!("{}", err);
process::exit(1);
}
}

102
src/worker.rs Normal file
View File

@@ -0,0 +1,102 @@
/*
* 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::io;
use std::fs;
use std::io::Read;
use std::boxed::Box;
pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> Result<(), String> {
let in_reader:Box<dyn io::Read> = match in_path {
Some(path) => {
let in_file = fs::File::open(path);
if let Err(e) = in_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufReader::new(in_file.unwrap()))
},
None => {
Box::new(io::stdin())
},
};
let mut out_writer:Box<dyn io::Write> = match out_path {
Some(path) => {
let out_file = fs::File::create(path);
if let Err(e) = out_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufWriter::new(out_file.unwrap()))
},
None => {
Box::new(io::stdout())
},
};
let mut last_ch = '\0';
let mut tab_num = 0;
for i in in_reader.bytes() {
let ch = i.unwrap() as char;
match ch {
'[' | '{' => {
tab_num += 1;
out_writer.write(format!("{ch}\n").as_bytes()).unwrap();
for _ in 0..tab_num {
out_writer.write(b" ").unwrap();
}
last_ch = ' ';
},
']' | '}' => {
tab_num -= 1;
out_writer.write(b"\n").unwrap();
for _ in 0..tab_num {
out_writer.write(b" ").unwrap();
}
out_writer.write(format!("{ch}").as_bytes()).unwrap();
last_ch = ch;
},
',' => {
out_writer.write(format!("{ch}").as_bytes()).unwrap();
if last_ch == '}' || last_ch == ']' {
out_writer.write(b"\n").unwrap();
for _ in 0..tab_num {
out_writer.write(b" ").unwrap();
}
last_ch = ' ';
} else {
last_ch = ch;
}
},
_ => {
if ch != ' ' || last_ch != ' ' {
out_writer.write(format!("{ch}").as_bytes()).unwrap();
last_ch = ch;
}
},
}
}
Ok(())
}

1
test.txt Normal file
View File

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