diff options
| author | Paul Buetow <paul@buetow.org> | 2025-04-06 23:03:54 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-04-06 23:03:54 +0300 |
| commit | 138c0f9b6255ed61eee8390674c026daa23eddc5 (patch) | |
| tree | e2d2494e8ce14fb0e504216cc6cb7a4eefed04ad /internal/file/flags.go | |
| parent | 95e3477875c0e31e0c6907ab6afe4ce48fb37391 (diff) | |
refactor
Diffstat (limited to 'internal/file/flags.go')
| -rw-r--r-- | internal/file/flags.go | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/internal/file/flags.go b/internal/file/flags.go index 85c73ce..f03d904 100644 --- a/internal/file/flags.go +++ b/internal/file/flags.go @@ -1,13 +1,15 @@ package file import ( - "fmt" "os" "strings" "syscall" ) -var flagsToHumanCache = map[int32]string{} +type Flags int32 + +var flagsToHumanCache = map[Flags]string{} +var unknownFlag = Flags(-1) type tuple struct { syscallNr int @@ -15,6 +17,7 @@ type tuple struct { } var flagsToHuman = []tuple{ + {-1, "O_NONE"}, {syscall.O_RDONLY, "O_RDONLY"}, {syscall.O_WRONLY, "O_WRONLY"}, {syscall.O_RDWR, "O_RDWR"}, @@ -35,29 +38,45 @@ var flagsToHuman = []tuple{ {syscall.O_TRUNC, "O_TRUNC"}, } -func flagsToStr(sb *strings.Builder, flags int32) { - if str, ok := flagsToHumanCache[flags]; ok { +func (f Flags) Is(flag int) bool { + if f == unknownFlag { + return false + } + if int(f)&flag == flag { + return true + } + return false +} + +func (f Flags) BuildString(sb *strings.Builder) { + if str, ok := flagsToHumanCache[f]; ok { sb.WriteString(str) return } - str := strings.Join(flagsToStrs(flags), "|") - flagsToHumanCache[flags] = fmt.Sprintf("%O=>%s", flags, str) + str := f.String() + flagsToHumanCache[f] = str sb.WriteString(str) } -func flagsToStrs(flags int32) (result []string) { +func (f Flags) String() string { + var strs []string + + if f == -1 { + return "O_NONE" + } - if int(flags)&(os.O_WRONLY|os.O_RDWR) == 0 { + if int(f)&(os.O_WRONLY|os.O_RDWR) == 0 { // Must be read only then - result = append(result, "O_RDONLY") + strs = append(strs, "O_RDONLY") } for _, toHuman := range flagsToHuman[1:] { - if int(flags)&toHuman.syscallNr == toHuman.syscallNr { - result = append(result, toHuman.str) + if int(f)&toHuman.syscallNr == toHuman.syscallNr { + strs = append(strs, toHuman.str) } } - if len(result) == 0 { - result = append(result, "non=>O_RDONLY") + if len(strs) == 0 { + strs = append(strs, "O_RDONLY") } - return + + return strings.Join(strs, "|") } |
