aboutsummaryrefslogtreecommitdiff
path: root/src/main.odin
diff options
context:
space:
mode:
authorSan Jacobs2025-12-11 01:23:46 +0100
committerSan Jacobs2025-12-11 01:23:46 +0100
commitd9bf52320afe653b84872e091a9d0b450e2e3b14 (patch)
tree5765b1d205b936ddffba936887599e4866a6d6d4 /src/main.odin
parentaca38ce5236e8997831cc37ba12f1ffa8e29aec2 (diff)
downloadbetter-report-d9bf52320afe653b84872e091a9d0b450e2e3b14.tar.gz
better-report-d9bf52320afe653b84872e091a9d0b450e2e3b14.tar.bz2
better-report-d9bf52320afe653b84872e091a9d0b450e2e3b14.zip
Beginning wav file folder parse, need to replace file_list with job_list
buf:[]u8 is completely temporary when parsing wav files now. When no file is specified, it spits out a header info template "info.txt"
Diffstat (limited to 'src/main.odin')
-rw-r--r--src/main.odin109
1 files changed, 82 insertions, 27 deletions
diff --git a/src/main.odin b/src/main.odin
index 71ae6ed..37c17c1 100644
--- a/src/main.odin
+++ b/src/main.odin
@@ -6,6 +6,7 @@ import "core:os/os2"
import "core:path/filepath"
import "core:sys/windows"
import "core:strings"
+import "wav"
/*
TODO: Simplify pre-allocation. Just allocate a bunch. It's probably fine.
@@ -20,6 +21,10 @@ PART_ONE :: #load("parts/start.html", string)
PART_TWO :: #load("parts/start2.html", string)
PART_END :: #load("parts/end.html", string)
+HEADER_TEMPLATE :: #load("header_template.txt", string)
+HEADER_FIELDS_PATH :: "info.txt"
+header_fields_file : string
+
Device :: enum {
UNSET,
ZOOM,
@@ -50,6 +55,12 @@ Report :: struct {
tc_column_index : int,
}
+CSV :: string
+Directory :: [dynamic]string
+Job :: union {CSV, Directory}
+job_list :: [dynamic]Job
+// TODO: Changing file_list to job_list, so the Directory jobs can contain a list of all the relevant .wav files before being sent to parse_folder()
+
main :: proc() {
when ODIN_OS == .Windows {
windows.SetConsoleOutputCP(windows.CODEPAGE.UTF8)
@@ -57,13 +68,20 @@ main :: proc() {
input_file_name : string
if len(os.args) < 2 {
- fmt.println("ERROR: No file submitted.")
+ fmt.println("No paths submitted.")
+ if os.is_file(HEADER_FIELDS_PATH) {
+ fmt.printfln("\"%v\" already exists.", HEADER_FIELDS_PATH)
+ } else {
+ os.write_entire_file(HEADER_FIELDS_PATH, transmute([]u8)HEADER_TEMPLATE)
+ fmt.printfln("Created \"%v\".", HEADER_FIELDS_PATH)
+ }
return
- } else {
- fmt.printf("Input path: {}\n", os.args[1])
- input_file_name = os.args[1]
}
+ fmt.printf("Input path: {}\n", os.args[1])
+ input_file_name = os.args[1]
+
+
path_info, error := os.stat(input_file_name)
@@ -71,22 +89,21 @@ main :: proc() {
files_done := 0
if error == os.ERROR_NONE {
- file_list : [dynamic]string
if(path_info.is_dir) {
fmt.printf("Directory submitted! Walking directory...\n\n")
fmt.printf("šŸ“ {}\n", path_info.name)
- try_os2 := walk_directory(path_info.fullpath, &file_count, &file_list, 1)
- if len(file_list) == 0 && try_os2 {
+ try_os2 := walk_directory(path_info.fullpath, &file_count, &job_list, 1)
+ if len(job_list) == 0 && try_os2 {
fmt.printf("\nNot_Dir error encountered. Trying os2 version...\n\n")
fmt.printf("šŸ“ {}\n", path_info.name)
- walk_directory_os2(path_info.fullpath, &file_count, &file_list, 1)
+ walk_directory_os2(path_info.fullpath, &file_count, &job_list, 1)
}
} else {
fmt.println("File submitted! Processing file...")
- append(&file_list, strings.clone(path_info.fullpath))
+ append(&job_list, strings.clone(path_info.fullpath))
}
- for file, f in file_list {
+ for file, f in job_list {
file_info, _ := os.stat(file)
fmt.printf("\nšŸ“„ File {}: {}\n", f+1, file_info.name)
@@ -99,8 +116,9 @@ main :: proc() {
render(parsed, output_name)
free_all(context.temp_allocator)
files_done += 1
+
}
- fmt.printf("\nCompleted {}/{} files.\n\n", files_done, len(file_list))
+ fmt.printf("\nCompleted {}/{} files.\n\n", files_done, len(job_list))
} else {
fmt.printf("ERROR could not get path info for: {}\n", input_file_name)
}
@@ -108,9 +126,19 @@ main :: proc() {
}
+parse :: proc(path : string, device : Device = .UNSET) -> (Report, bool) {
+ if os.is_dir(path) {
+ return parse_folder(path)
+ }
+ return parse_file(path, device)
+}
+parse_folder :: proc(path : string) -> (Report, bool) {
+ output : Report = {}
+ return output, false
+}
-parse :: proc(path : string, device : Device = .UNSET) -> (Report, bool) {
+parse_file :: proc(path : string, device : Device = .UNSET) -> (Report, bool) {
device := device
output : Report = {}
data, ok := os.read_entire_file(path, context.temp_allocator)
@@ -346,8 +374,6 @@ parse :: proc(path : string, device : Device = .UNSET) -> (Report, bool) {
}
}
- fmt.printf("\n")
-
@@ -666,16 +692,13 @@ render :: proc(report : Report, path : string) {
fmt.printf("Output: {}\n", path)
}
-
-
-
indent_by :: proc(i : int) {
for x in 0..<i {
fmt.printf(" ")
}
}
-walk_directory :: proc(path : string, file_number : ^int, file_list : ^[dynamic]string, depth : int = 0) -> bool {
+walk_directory :: proc(path : string, file_number : ^int, job_list : ^[dynamic]string, depth : int = 0) -> bool {
handle, ok := os.open(path)
if ok != os.ERROR_NONE {
indent_by(depth)
@@ -692,6 +715,8 @@ walk_directory :: proc(path : string, file_number : ^int, file_list : ^[dynamic]
return true
}
+ wav_count := 0
+ has_csv := false
for file in files {
@@ -700,24 +725,38 @@ walk_directory :: proc(path : string, file_number : ^int, file_list : ^[dynamic]
if file.is_dir {
indent_by(depth)
fmt.printf("šŸ“ %s\n", file.name)
- walk_directory(full_path, file_number, file_list, depth+1) // Recurse
+ walk_directory(full_path, file_number, job_list, depth+1) // Recurse
} else { // If file is actually a file
extension := strings.to_lower(filepath.ext(file.name))
defer delete(extension)
- if(extension == ".csv"){
+ if extension == ".csv" {
indent_by(depth)
- fmt.printf("šŸ“„ %d %s\n", file_number^, file.name)
- append(file_list, strings.clone(file.fullpath))
+ fmt.printf("šŸ“„ [#%d] %s\n", file_number^, file.name)
+ append(job_list, strings.clone(file.fullpath))
file_number^ += 1
+ has_csv = true
+ }
+ if extension == ".wav" {
+ wav_count += 1
}
}
}
+ if wav_count>0 && !has_csv {
+ indent_by(depth+1)
+ if wav_count == 1 {
+ fmt.printf("šŸ’½ [#%d] 1 WAV file, without CSV.\n", file_number^)
+ } else {
+ fmt.printf("šŸ’½ [#%d] %d WAV files, without CSV.\n", file_number^, wav_count)
+ }
+ append(job_list, strings.clone(path))
+ file_number^ += 1
+ }
return false
}
-walk_directory_os2 :: proc(path : string, file_number : ^int, file_list : ^[dynamic]string, depth : int = 0) {
+walk_directory_os2 :: proc(path : string, file_number : ^int, job_list : ^[dynamic]string, depth : int = 0) {
handle, ok := os2.open(path)
if ok != os2.ERROR_NONE {
indent_by(depth)
@@ -733,6 +772,8 @@ walk_directory_os2 :: proc(path : string, file_number : ^int, file_list : ^[dyna
return
}
+ wav_count := 0
+ has_csv := false
for file in files {
@@ -741,18 +782,32 @@ walk_directory_os2 :: proc(path : string, file_number : ^int, file_list : ^[dyna
if os.is_dir(full_path) {
indent_by(depth)
fmt.printf("šŸ“ %s\n", file.name)
- walk_directory_os2(full_path, file_number, file_list, depth+1) // Recurse
+ walk_directory_os2(full_path, file_number, job_list, depth+1) // Recurse
} else { // If file is actually a file
extension := strings.to_lower(filepath.ext(file.name))
defer delete(extension)
- if(extension == ".csv"){
+ if extension == ".csv" {
indent_by(depth)
- fmt.printf("šŸ“„ %d %s\n", file_number^, file.name)
- append(file_list, strings.clone(file.fullpath))
+ fmt.printf("šŸ“„ [#%d] %s\n", file_number^, file.name)
+ append(job_list, strings.clone(file.fullpath))
file_number^ += 1
+ has_csv = true
+ }
+ if extension == ".wav" {
+ wav_count += 1
}
}
}
+ if wav_count>0 && !has_csv {
+ indent_by(depth+1)
+ if wav_count == 1 {
+ fmt.printf("šŸ’½ [#%d] A WAV file, without CSV.\n", file_number^)
+ } else {
+ fmt.printf("šŸ’½ [#%d] %d WAV files, without CSV.\n", file_number^, wav_count)
+ }
+ append(job_list, strings.clone(path))
+ file_number^ += 1
+ }
} \ No newline at end of file