Files
Benchmarks/odin-lang/main.odin
T

84 lines
1.3 KiB
Odin

package main
import "core:fmt"
import "core:os"
import "core:strconv"
import "core:strings"
import "core:unicode/utf8"
main :: proc() {
if len(os.args) < 2 {
fmt.println("Error: file required")
os.exit(-1)
}
filename := os.args[1]
sum, ok := getSum(filename)
if !ok {
os.exit(-1)
}
fmt.println(sum)
}
getSum :: proc(filename: string) -> (int, bool) {
data, err := os.read_entire_file(filename, context.allocator)
if err != nil {
fmt.println("error opening file", err)
return -1, false
}
defer delete(data, context.allocator)
sum := 0
iter := string(data)
for line in strings.split_lines_iterator(&iter) {
first := getFirst(line)
last := getLast(line)
// convert to rune array
digits := []rune{first, last}
// convert rune array to string first?
str := utf8.runes_to_string(digits, context.allocator)
// covert string to int..
val, ok := strconv.parse_int(str)
if !ok {
fmt.println("error converting to int")
continue
}
sum += val
}
return sum, true
}
getFirst :: proc(line: string) -> rune {
first: rune
for ch in line {
if ch >= '0' && ch <= '9' {
first = ch
break
}
}
return first
}
getLast :: proc(line: string) -> rune {
last: rune
length := len(line) - 1
for i := length; i >= 0; i -= 1 {
if line[i] >= '0' && line[i] <= '9' {
last = rune(line[i])
break
}
}
return last
}