Skip to content

Commit 05e88a8

Browse files
committed
Factored all c++ source lines parsers
1 parent 6f37006 commit 05e88a8

File tree

10 files changed

+107
-104
lines changed

10 files changed

+107
-104
lines changed

arduino/builder/cpp.go renamed to arduino/builder/cpp/cpp.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// Arduino software without disclosing the source code of your own applications.
1414
// To purchase a commercial license, send an email to [email protected].
1515

16-
package builder
16+
package cpp
1717

1818
import (
1919
"strconv"
@@ -23,18 +23,18 @@ import (
2323
"github.com/arduino/go-paths-helper"
2424
)
2525

26-
// QuoteCppString returns the given string as a quoted string for use with the C
26+
// QuoteString returns the given string as a quoted string for use with the C
2727
// preprocessor. This adds double quotes around it and escapes any
2828
// double quotes and backslashes in the string.
29-
func QuoteCppString(str string) string {
29+
func QuoteString(str string) string {
3030
str = strings.Replace(str, "\\", "\\\\", -1)
3131
str = strings.Replace(str, "\"", "\\\"", -1)
3232
return "\"" + str + "\""
3333
}
3434

35-
// Parses the given line as a gcc line marker and returns the contained
35+
// ParseLineMarker parses the given line as a gcc line marker and returns the contained
3636
// filename.
37-
func parseLineMarker(line string) *paths.Path {
37+
func ParseLineMarker(line string) *paths.Path {
3838
// A line marker contains the line number and filename and looks like:
3939
// # 123 /path/to/file.cpp
4040
// It can be followed by zero or more flag number that indicate the
@@ -55,7 +55,7 @@ func parseLineMarker(line string) *paths.Path {
5555
// If we get here, we found a # followed by a line number, so
5656
// assume this is a line marker and see if the rest of the line
5757
// starts with a string containing the filename
58-
str, rest, ok := ParseCppString(split[2])
58+
str, rest, ok := ParseString(split[2])
5959

6060
if ok && (rest == "" || rest[0] == ' ') {
6161
return paths.New(str)
@@ -69,7 +69,7 @@ func parseLineMarker(line string) *paths.Path {
6969
// start of the given line, returns the unquoted string contents, the
7070
// remainder of the line (everything after the closing "), and true.
7171
// Otherwise, returns the empty string, the entire line and false.
72-
func ParseCppString(line string) (string, string, bool) {
72+
func ParseString(line string) (string, string, bool) {
7373
// For details about how these strings are output by gcc, see:
7474
// https://github.com/gcc-mirror/gcc/blob/a588355ab948cf551bc9d2b89f18e5ae5140f52c/libcpp/macro.c#L491-L511
7575
// Note that the documentation suggests all non-printable

arduino/builder/cpp/cpp_test.go

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to [email protected].
15+
16+
package cpp_test
17+
18+
import (
19+
"testing"
20+
21+
"github.com/arduino/arduino-cli/arduino/builder/cpp"
22+
"github.com/stretchr/testify/require"
23+
)
24+
25+
func TestParseString(t *testing.T) {
26+
_, _, ok := cpp.ParseString(`foo`)
27+
require.Equal(t, false, ok)
28+
29+
_, _, ok = cpp.ParseString(`"foo`)
30+
require.Equal(t, false, ok)
31+
32+
str, rest, ok := cpp.ParseString(`"foo"`)
33+
require.Equal(t, true, ok)
34+
require.Equal(t, `foo`, str)
35+
require.Equal(t, ``, rest)
36+
37+
str, rest, ok = cpp.ParseString(`"foo\\bar"`)
38+
require.Equal(t, true, ok)
39+
require.Equal(t, `foo\bar`, str)
40+
require.Equal(t, ``, rest)
41+
42+
str, rest, ok = cpp.ParseString(`"foo \"is\" quoted and \\\\bar\"\" escaped\\" and "then" some`)
43+
require.Equal(t, true, ok)
44+
require.Equal(t, `foo "is" quoted and \\bar"" escaped\`, str)
45+
require.Equal(t, ` and "then" some`, rest)
46+
47+
str, rest, ok = cpp.ParseString(`" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_abcdefghijklmnopqrstuvwxyz{|}~"`)
48+
require.Equal(t, true, ok)
49+
require.Equal(t, ` !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~`, str)
50+
require.Equal(t, ``, rest)
51+
52+
str, rest, ok = cpp.ParseString(`"/home/ççç/"`)
53+
require.Equal(t, true, ok)
54+
require.Equal(t, `/home/ççç/`, str)
55+
require.Equal(t, ``, rest)
56+
57+
str, rest, ok = cpp.ParseString(`"/home/ççç/ /$sdsdd\\"`)
58+
require.Equal(t, true, ok)
59+
require.Equal(t, `/home/ççç/ /$sdsdd\`, str)
60+
require.Equal(t, ``, rest)
61+
}
62+
63+
func TestQuoteString(t *testing.T) {
64+
cases := map[string]string{
65+
`foo`: `"foo"`,
66+
`foo\bar`: `"foo\\bar"`,
67+
`foo "is" quoted and \\bar"" escaped\`: `"foo \"is\" quoted and \\\\bar\"\" escaped\\"`,
68+
// ASCII 0x20 - 0x7e, excluding `
69+
` !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~`: `" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_abcdefghijklmnopqrstuvwxyz{|}~"`,
70+
}
71+
for input, expected := range cases {
72+
require.Equal(t, expected, cpp.QuoteString(input))
73+
}
74+
}

arduino/builder/cpp_test.go

-46
This file was deleted.

arduino/builder/preprocessor/ctags.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ import (
2121
"strconv"
2222
"strings"
2323

24+
"github.com/arduino/arduino-cli/arduino/builder/cpp"
2425
"github.com/arduino/arduino-cli/arduino/builder/preprocessor/ctags"
2526
"github.com/arduino/arduino-cli/arduino/sketch"
2627
"github.com/arduino/arduino-cli/executils"
2728
"github.com/arduino/arduino-cli/i18n"
28-
"github.com/arduino/arduino-cli/legacy/builder/utils"
2929
"github.com/arduino/go-paths-helper"
3030
"github.com/arduino/go-properties-orderedmap"
3131
"github.com/pkg/errors"
@@ -93,7 +93,7 @@ func composePrototypeSection(line int, prototypes []*ctags.Prototype) string {
9393
str := joinPrototypes(prototypes)
9494
str += "\n#line "
9595
str += strconv.Itoa(line)
96-
str += " " + utils.QuoteCppString(prototypes[0].File)
96+
str += " " + cpp.QuoteString(prototypes[0].File)
9797
str += "\n"
9898

9999
return str
@@ -105,7 +105,7 @@ func joinPrototypes(prototypes []*ctags.Prototype) string {
105105
if signatureContainsaDefaultArg(proto) {
106106
continue
107107
}
108-
prototypesSlice = append(prototypesSlice, "#line "+strconv.Itoa(proto.Line)+" "+utils.QuoteCppString(proto.File))
108+
prototypesSlice = append(prototypesSlice, "#line "+strconv.Itoa(proto.Line)+" "+cpp.QuoteString(proto.File))
109109
prototypeParts := []string{}
110110
if proto.Modifiers != "" {
111111
prototypeParts = append(prototypeParts, proto.Modifiers)

arduino/builder/sketch.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"io"
2323
"regexp"
2424

25+
"github.com/arduino/arduino-cli/arduino/builder/cpp"
2526
"github.com/arduino/arduino-cli/arduino/sketch"
2627
"github.com/arduino/arduino-cli/i18n"
2728
"github.com/arduino/go-paths-helper"
@@ -98,7 +99,7 @@ func sketchMergeSources(sk *sketch.Sketch, overrides map[string]string) (int, st
9899
lineOffset++
99100
}
100101

101-
mergedSource += "#line 1 " + QuoteCppString(sk.MainFile.String()) + "\n"
102+
mergedSource += "#line 1 " + cpp.QuoteString(sk.MainFile.String()) + "\n"
102103
mergedSource += mainSrc + "\n"
103104
lineOffset++
104105

@@ -107,7 +108,7 @@ func sketchMergeSources(sk *sketch.Sketch, overrides map[string]string) (int, st
107108
if err != nil {
108109
return 0, "", err
109110
}
110-
mergedSource += "#line 1 " + QuoteCppString(file.String()) + "\n"
111+
mergedSource += "#line 1 " + cpp.QuoteString(file.String()) + "\n"
111112
mergedSource += src + "\n"
112113
}
113114

@@ -147,7 +148,7 @@ func sketchCopyAdditionalFiles(sketch *sketch.Sketch, destPath *paths.Path, over
147148
}
148149

149150
// tag each addtional file with the filename of the source it was copied from
150-
sourceBytes = append([]byte("#line 1 "+QuoteCppString(file.String())+"\n"), sourceBytes...)
151+
sourceBytes = append([]byte("#line 1 "+cpp.QuoteString(file.String())+"\n"), sourceBytes...)
151152

152153
err = writeIfDifferent(sourceBytes, targetPath)
153154
if err != nil {
@@ -217,7 +218,7 @@ func FilterSketchSource(sketch *sketch.Sketch, source io.Reader, removeLineMarke
217218
scanner := bufio.NewScanner(source)
218219
for scanner.Scan() {
219220
line := scanner.Text()
220-
if filename := parseLineMarker(line); filename != nil {
221+
if filename := cpp.ParseLineMarker(line); filename != nil {
221222
inSketch = fileNames.Contains(filename)
222223
if inSketch && removeLineMarkers {
223224
continue

internal/integrationtest/compile_1/compile_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"testing"
2626
"time"
2727

28-
"github.com/arduino/arduino-cli/arduino/builder"
28+
"github.com/arduino/arduino-cli/arduino/builder/cpp"
2929
"github.com/arduino/arduino-cli/internal/integrationtest"
3030
"github.com/arduino/go-paths-helper"
3131
"github.com/stretchr/testify/require"
@@ -1191,7 +1191,7 @@ void loop() {
11911191
}
11921192
11931193
`
1194-
expected = strings.ReplaceAll(expected, "%SKETCH_PATH%", builder.QuoteCppString(sketchPath.Join("SketchSimple.ino").String()))
1194+
expected = strings.ReplaceAll(expected, "%SKETCH_PATH%", cpp.QuoteString(sketchPath.Join("SketchSimple.ino").String()))
11951195

11961196
jsonOut, _, err := cli.Run("compile", "-b", fqbn, "--preprocess", sketchPath.String(), "--format", "json")
11971197
require.NoError(t, err)

legacy/builder/test/helper.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ import (
2323
"testing"
2424
"text/template"
2525

26+
"github.com/arduino/arduino-cli/arduino/builder/cpp"
2627
"github.com/arduino/arduino-cli/arduino/cores"
2728
"github.com/arduino/arduino-cli/arduino/libraries"
2829
"github.com/arduino/arduino-cli/legacy/builder/constants"
2930
"github.com/arduino/arduino-cli/legacy/builder/types"
30-
"github.com/arduino/arduino-cli/legacy/builder/utils"
3131
paths "github.com/arduino/go-paths-helper"
3232
"github.com/stretchr/testify/assert"
3333
"github.com/stretchr/testify/require"
3434
)
3535

3636
func LoadAndInterpolate(t *testing.T, filename string, ctx *types.Context) string {
3737
funcsMap := template.FuncMap{
38-
"QuoteCppString": utils.QuoteCppPath,
38+
"QuoteCppString": func(p *paths.Path) string { return cpp.QuoteString(p.String()) },
3939
}
4040

4141
tpl, err := template.New(filepath.Base(filename)).Funcs(funcsMap).ParseFiles(filename)

0 commit comments

Comments
 (0)