]> Cypherpunks.ru repositories - gotai64n.git/blob - cmd/tai64nlocal/main.go
Raised copyright years
[gotai64n.git] / cmd / tai64nlocal / main.go
1 /*
2 go.cypherpunks.ru/tai64n -- Pure Go TAI64/TAI64N implementation
3 Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 package main
19
20 import (
21         "bufio"
22         "flag"
23         "fmt"
24         "io/ioutil"
25         "log"
26         "os"
27         "strings"
28         "time"
29
30         "go.cypherpunks.ru/tai64n/v2"
31 )
32
33 func main() {
34         log.SetFlags(0)
35         flag.Usage = func() {
36                 fmt.Fprintf(
37                         flag.CommandLine.Output(),
38                         "Replace \"@HEX(TAI64)\"-prefixed line with human readable UTC.\n",
39                 )
40                 flag.PrintDefaults()
41         }
42         leapsecs := flag.Bool("leapsecs", false, "Take leap seconds into account: honest TAI->UTC")
43         db := flag.String("leapsecsdb", "", "Use that leapsecs.dat leap seconds database")
44         flag.Parse()
45
46         if *db != "" {
47                 buf, err := ioutil.ReadFile(*db)
48                 if err != nil {
49                         log.Fatalln(err)
50                 }
51                 tai64n.LeapsecsDBLoad(buf)
52         }
53
54         scanner := bufio.NewScanner(os.Stdin)
55         var err error
56         var s string
57         var sep int
58         var t time.Time
59         for {
60                 if !scanner.Scan() {
61                         if err = scanner.Err(); err != nil {
62                                 log.Fatalln(err)
63                         }
64                         break
65                 }
66                 s = scanner.Text()
67                 if s[0] != '@' {
68                         os.Stdout.WriteString(s + "\n")
69                         continue
70                 }
71                 sep = strings.IndexByte(s, byte(' '))
72                 if sep == -1 {
73                         os.Stdout.WriteString(s + "\n")
74                         continue
75                 }
76                 t, err = tai64n.Decode(s[1:sep])
77                 if err != nil {
78                         log.Fatalln(err)
79                 }
80                 if *leapsecs {
81                         t = tai64n.LeapsecsSub(t)
82                 }
83                 os.Stdout.WriteString(t.Format(tai64n.LocalFmt) + s[sep:] + "\n")
84         }
85 }