aboutsummaryrefslogtreecommitdiff
path: root/core/flags
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2026-02-11 17:53:16 +0000
committerGitHub <noreply@github.com>2026-02-11 17:53:16 +0000
commit355b8a8c83badc64d23dbb34ea00bb89ac9245db (patch)
tree1103d5bde2dd10c28a81f2104d9c17fa0f4c3166 /core/flags
parentb5bf28dc47dd1c32a45ba0bbedcbcef80409b798 (diff)
parent1a37f4eb0cc792783784fca216c79e3f02a3234e (diff)
Merge pull request #6245 from odin-lang/new_os
`core:os/os2` -> `core:os` integration
Diffstat (limited to 'core/flags')
-rw-r--r--core/flags/errors.odin4
-rw-r--r--core/flags/example/example.odin6
-rw-r--r--core/flags/internal_rtti.odin80
-rw-r--r--core/flags/internal_validation.odin10
-rw-r--r--core/flags/util.odin14
5 files changed, 58 insertions, 56 deletions
diff --git a/core/flags/errors.odin b/core/flags/errors.odin
index e9b2e18c8..efe4cb6c4 100644
--- a/core/flags/errors.odin
+++ b/core/flags/errors.odin
@@ -37,8 +37,8 @@ Unified_Parse_Error_Reason :: union #shared_nil {
Open_File_Error :: struct {
filename: string,
errno: os.Error,
- mode: int,
- perms: int,
+ flags: os.File_Flags,
+ perms: os.Permissions,
}
// Raised during parsing.
diff --git a/core/flags/example/example.odin b/core/flags/example/example.odin
index a3af44790..6ace3d852 100644
--- a/core/flags/example/example.odin
+++ b/core/flags/example/example.odin
@@ -76,8 +76,8 @@ Distinct_Int :: distinct int
main :: proc() {
Options :: struct {
- file: os.Handle `args:"pos=0,required,file=r" usage:"Input file."`,
- output: os.Handle `args:"pos=1,file=cw" usage:"Output file."`,
+ file: ^os.File `args:"pos=0,required,file=r" usage:"Input file."`,
+ output: ^os.File `args:"pos=1,file=cw" usage:"Output file."`,
hub: net.Host_Or_Endpoint `usage:"Internet address to contact for updates."`,
schedule: datetime.DateTime `usage:"Launch tasks at this time."`,
@@ -126,7 +126,7 @@ main :: proc() {
fmt.printfln("%#v", opt)
- if opt.output != 0 {
+ if opt.output != nil {
os.write_string(opt.output, "Hellope!\n")
}
}
diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin
index b3880afa0..1d86f4bce 100644
--- a/core/flags/internal_rtti.odin
+++ b/core/flags/internal_rtti.odin
@@ -1,18 +1,18 @@
#+private
package flags
-import "base:intrinsics"
-import "base:runtime"
-import "core:fmt"
-import "core:mem"
-import "core:net"
-import "core:os"
-import "core:reflect"
-import "core:strconv"
-import "core:strings"
-@require import "core:time"
-@require import "core:time/datetime"
-import "core:unicode/utf8"
+import "base:intrinsics"
+import "base:runtime"
+import "core:fmt"
+import "core:mem"
+import "core:net"
+@(require) import "core:os"
+import "core:reflect"
+import "core:strconv"
+import "core:strings"
+@(require) import "core:time"
+@(require) import "core:time/datetime"
+import "core:unicode/utf8"
@(optimization_mode="favor_size")
parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: ^runtime.Type_Info) -> bool {
@@ -209,7 +209,7 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info:
parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: typeid, arg_tag: string, out_error: ^Error) {
// Core types currently supported:
//
- // - os.Handle
+ // - ^os.File
// - time.Time
// - datetime.DateTime
// - net.Host_Or_Endpoint
@@ -217,64 +217,61 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type:
GENERIC_RFC_3339_ERROR :: "Invalid RFC 3339 string. Try this format: `yyyy-mm-ddThh:mm:ssZ`, for example `2024-02-29T16:30:00Z`."
out_error^ = nil
-
- if data_type == os.Handle {
+ if data_type == ^os.File {
// NOTE: `os` is hopefully available everywhere, even if it might panic on some calls.
- wants_read := false
- wants_write := false
- mode: int
+ flags: os.File_Flags
if file, ok := get_struct_subtag(arg_tag, SUBTAG_FILE); ok {
for i in 0..<len(file) {
#no_bounds_check switch file[i] {
- case 'r': wants_read = true
- case 'w': wants_write = true
- case 'c': mode |= os.O_CREATE
- case 'a': mode |= os.O_APPEND
- case 't': mode |= os.O_TRUNC
+ case 'r': flags |= {.Read}
+ case 'w': flags |= {.Write}
+ case 'c': flags |= {.Create}
+ case 'a': flags |= {.Append}
+ case 't': flags |= {.Trunc}
}
}
}
// Sane default.
// owner/group/other: r--r--r--
- perms: int = 0o444
-
- if wants_read && wants_write {
- mode |= os.O_RDWR
- perms |= 0o200
- } else if wants_write {
- mode |= os.O_WRONLY
- perms |= 0o200
+ octal_perms: int = 0o444
+
+ if flags >= {.Read, .Write} {
+ octal_perms |= 0o200
+ } else if .Write in flags {
+ octal_perms |= 0o200
} else {
- mode |= os.O_RDONLY
+ flags |= {.Read}
}
if permstr, ok := get_struct_subtag(arg_tag, SUBTAG_PERMS); ok {
if value, parse_ok := strconv.parse_u64_of_base(permstr, 8); parse_ok {
- perms = int(value)
+ octal_perms = int(value)
}
}
- handle, errno := os.open(str, mode, perms)
- if errno != nil {
+ perms := os.perm(octal_perms)
+
+ f, error := os.open(str, flags, perms)
+ if error != nil {
// NOTE(Feoramund): os.Error is system-dependent, and there's
// currently no good way to translate them all into strings.
//
- // The upcoming `os2` package will hopefully solve this.
+ // The upcoming `core:os` package will hopefully solve this.
//
// We can at least provide the number for now, so the user can look
// it up.
out_error^ = Open_File_Error {
str,
- errno,
- mode,
+ error,
+ flags,
perms,
}
return
}
- (^os.Handle)(ptr)^ = handle
+ (^^os.File)(ptr)^ = f
return
}
@@ -475,6 +472,11 @@ parse_and_set_pointer_by_type :: proc(ptr: rawptr, str: string, type_info: ^runt
}
case:
+ if type_info.id == ^os.File {
+ parse_and_set_pointer_by_named_type(ptr, str, type_info.id, arg_tag, &error)
+ return
+ }
+
if !parse_and_set_pointer_by_base_type(ptr, str, type_info) {
return Parse_Error {
// The caller will add more details.
diff --git a/core/flags/internal_validation.odin b/core/flags/internal_validation.odin
index cd903c3e5..6f9016a21 100644
--- a/core/flags/internal_validation.odin
+++ b/core/flags/internal_validation.odin
@@ -138,20 +138,20 @@ validate_structure :: proc(model_type: $T, style: Parsing_Style, loc := #caller_
allowed_to_define_file_perms: bool = ---
#partial switch specific_type_info in field.type.variant {
case runtime.Type_Info_Map:
- allowed_to_define_file_perms = specific_type_info.value.id == os.Handle
+ allowed_to_define_file_perms = specific_type_info.value.id == ^os.File
case runtime.Type_Info_Dynamic_Array:
- allowed_to_define_file_perms = specific_type_info.elem.id == os.Handle
+ allowed_to_define_file_perms = specific_type_info.elem.id == ^os.File
case:
- allowed_to_define_file_perms = field.type.id == os.Handle
+ allowed_to_define_file_perms = field.type.id == ^os.File
}
if _, has_file := get_struct_subtag(args_tag, SUBTAG_FILE); has_file {
- fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `os.Handle` type.",
+ fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `^os.File` type.",
model_type, field.name, SUBTAG_FILE, loc = loc)
}
if _, has_perms := get_struct_subtag(args_tag, SUBTAG_PERMS); has_perms {
- fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `os.Handle` type.",
+ fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `^os.File` type.",
model_type, field.name, SUBTAG_PERMS, loc = loc)
}
diff --git a/core/flags/util.odin b/core/flags/util.odin
index ce7e2e36c..0d18fa196 100644
--- a/core/flags/util.odin
+++ b/core/flags/util.odin
@@ -1,9 +1,9 @@
package flags
-import "core:fmt"
+import "core:fmt"
@require import "core:os"
@require import "core:path/filepath"
-import "core:strings"
+import "core:strings"
/*
Parse any arguments into an annotated struct or exit if there was an error.
@@ -38,7 +38,7 @@ parse_or_exit :: proc(
error := parse(model, args, style, true, true, allocator, loc)
if error != nil {
- stderr := os.stream_from_handle(os.stderr)
+ stderr := os.to_stream(os.stderr)
if len(args) == 0 {
// No arguments entered, and there was an error; show the usage,
@@ -65,18 +65,18 @@ Inputs:
*/
@(optimization_mode="favor_size")
print_errors :: proc(data_type: typeid, error: Error, program: string, style: Parsing_Style = .Odin) {
- stderr := os.stream_from_handle(os.stderr)
- stdout := os.stream_from_handle(os.stdout)
+ stderr := os.to_stream(os.stderr)
+ stdout := os.to_stream(os.stdout)
switch specific_error in error {
case Parse_Error:
fmt.wprintfln(stderr, "[%T.%v] %s", specific_error, specific_error.reason, specific_error.message)
case Open_File_Error:
- fmt.wprintfln(stderr, "[%T#%i] Unable to open file with perms 0o%o in mode 0x%x: %s",
+ fmt.wprintfln(stderr, "[%T#%i] Unable to open file with perms 0o%o and flags %v: %s",
specific_error,
specific_error.errno,
specific_error.perms,
- specific_error.mode,
+ specific_error.flags,
specific_error.filename)
case Validation_Error:
fmt.wprintfln(stderr, "[%T] %s", specific_error, specific_error.message)