2023-08-17 05:15:28 +00:00
|
|
|
// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
|
2023-05-29 21:03:29 +00:00
|
|
|
// Use of this file is governed by the BSD 3-clause license that
|
|
|
|
// can be found in the LICENSE.txt file in the project root.
|
|
|
|
|
|
|
|
package antlr
|
|
|
|
|
|
|
|
import (
|
2024-08-19 08:01:33 +00:00
|
|
|
"bufio"
|
2023-05-29 21:03:29 +00:00
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
// This is an InputStream that is loaded from a file all at once
|
|
|
|
// when you construct the object.
|
|
|
|
|
|
|
|
type FileStream struct {
|
2024-08-19 08:01:33 +00:00
|
|
|
InputStream
|
2023-05-29 21:03:29 +00:00
|
|
|
filename string
|
|
|
|
}
|
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
//goland:noinspection GoUnusedExportedFunction
|
2023-05-29 21:03:29 +00:00
|
|
|
func NewFileStream(fileName string) (*FileStream, error) {
|
|
|
|
|
|
|
|
f, err := os.Open(fileName)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2024-08-19 08:01:33 +00:00
|
|
|
|
|
|
|
defer func(f *os.File) {
|
|
|
|
errF := f.Close()
|
|
|
|
if errF != nil {
|
|
|
|
}
|
|
|
|
}(f)
|
|
|
|
|
|
|
|
reader := bufio.NewReader(f)
|
|
|
|
fInfo, err := f.Stat()
|
2023-05-29 21:03:29 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
fs := &FileStream{
|
|
|
|
InputStream: InputStream{
|
|
|
|
index: 0,
|
|
|
|
name: fileName,
|
|
|
|
},
|
|
|
|
filename: fileName,
|
|
|
|
}
|
2023-05-29 21:03:29 +00:00
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
// Pre-build the buffer and read runes efficiently
|
|
|
|
//
|
|
|
|
fs.data = make([]rune, 0, fInfo.Size())
|
|
|
|
for {
|
|
|
|
r, _, err := reader.ReadRune()
|
|
|
|
if err != nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fs.data = append(fs.data, r)
|
|
|
|
}
|
|
|
|
fs.size = len(fs.data) // Size in runes
|
2023-05-29 21:03:29 +00:00
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
// All done.
|
|
|
|
//
|
2023-05-29 21:03:29 +00:00
|
|
|
return fs, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *FileStream) GetSourceName() string {
|
|
|
|
return f.filename
|
|
|
|
}
|