mirror of
https://github.com/arkadiyt/protodump.git
synced 2026-10-21 01:36:52 +02:00
Handle 10-character long proto filenames
This commit is contained in:
1 parent
6edde01ca7
commit
84b50ef1bf
3 files changed
+23
-14
No files matched your search
@@ -1,5 +1,5 @@
|
|||||||
build:
|
build:
|
||||||
go build -o protodump cmd/protodump/main.go
|
go build -o bin/protodump cmd/protodump/main.go
|
||||||
|
|
||||||
fmt:
|
fmt:
|
||||||
go fmt ./...
|
go fmt ./...
|
||||||
|
|||||||
@@ -250,9 +250,10 @@ func (pd *ProtoDefinition) writeFileOptions() {
|
|||||||
elemPtr := options.FieldByName(option.FieldName)
|
elemPtr := options.FieldByName(option.FieldName)
|
||||||
if !elemPtr.IsNil() {
|
if !elemPtr.IsNil() {
|
||||||
elem := elemPtr.Elem()
|
elem := elemPtr.Elem()
|
||||||
if elem.Kind() == reflect.String {
|
kind := elem.Kind()
|
||||||
|
if kind == reflect.String {
|
||||||
pd.writeStringFileOptions(option.OptionName, elem.String())
|
pd.writeStringFileOptions(option.OptionName, elem.String())
|
||||||
} else if elem.Kind() == reflect.Bool {
|
} else if kind == reflect.Bool {
|
||||||
pd.writeBoolFileOptions(option.OptionName, elem.Bool())
|
pd.writeBoolFileOptions(option.OptionName, elem.Bool())
|
||||||
}
|
}
|
||||||
printedOption = true
|
printedOption = true
|
||||||
|
|||||||
+19
-11
@@ -8,13 +8,8 @@ import (
|
|||||||
"google.golang.org/protobuf/encoding/protowire"
|
"google.golang.org/protobuf/encoding/protowire"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ScanFile(path string) ([][]byte, error) {
|
const scan = ".proto"
|
||||||
data, err := os.ReadFile(path)
|
const magicByte = 0xa
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Couldn't open file: %w", err)
|
|
||||||
}
|
|
||||||
return Scan(data), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func consumeBytes(data []byte, position int) int {
|
func consumeBytes(data []byte, position int) int {
|
||||||
start := position
|
start := position
|
||||||
@@ -29,26 +24,39 @@ func consumeBytes(data []byte, position int) int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ScanFile(path string) ([][]byte, error) {
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Couldn't open file: %w", err)
|
||||||
|
}
|
||||||
|
return Scan(data), nil
|
||||||
|
}
|
||||||
|
|
||||||
func Scan(data []byte) [][]byte {
|
func Scan(data []byte) [][]byte {
|
||||||
results := make([][]byte, 0)
|
results := make([][]byte, 0)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
index := bytes.Index(data, []byte(".proto"))
|
index := bytes.Index(data, []byte(scan))
|
||||||
if index == -1 {
|
if index == -1 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for a 0xa byte: 0 0001 010
|
// Look for a 0xa byte: 0 0001 010
|
||||||
// ^ no more bytes for varint
|
// ^ no more bytes for varint
|
||||||
// ^ field 1 (file name)
|
// ^ field 1 (file name)
|
||||||
// ^ type 2 (LEN)
|
// ^ type 2 (LEN)
|
||||||
start := bytes.LastIndexByte(data[:index], 0xa)
|
start := bytes.LastIndexByte(data[:index], magicByte)
|
||||||
if start == -1 {
|
if start == -1 {
|
||||||
// fmt.Printf("Warn: couldn't find start to proto definition at offset:0x%s\n", strconv.FormatInt(int64(index), 16))
|
|
||||||
data = data[index+1:]
|
data = data[index+1:]
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the "<file>.proto" filename is 10 characters long then the 0xa byte we found is actually
|
||||||
|
// the string length and not the start of the protobuf record, so go back 1 more
|
||||||
|
if index-start == (magicByte-len(scan)+1) && start > 0 && data[start-1] == magicByte {
|
||||||
|
start -= 1
|
||||||
|
}
|
||||||
|
|
||||||
length := consumeBytes(data, start)
|
length := consumeBytes(data, start)
|
||||||
results = append(results, data[start:start+length])
|
results = append(results, data[start:start+length])
|
||||||
data = data[start+length:]
|
data = data[start+length:]
|
||||||
|
|||||||
Reference in new issue
Block a user