Skip to content

Commit 729592c

Browse files
authored
Merge pull request #767 from sparkfun/pcUpdates_Replace_strtok
Replace strtok with strtok_r
2 parents 7773573 + ebd88fd commit 729592c

File tree

6 files changed

+38
-22
lines changed

6 files changed

+38
-22
lines changed

Firmware/RTK_Everywhere/Display.ino

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,11 +2813,12 @@ void displayMessage(const char *message, uint16_t displayTime)
28132813
// Count words based on spaces
28142814
uint8_t wordCount = 0;
28152815
strncpy(temp, message, sizeof(temp) - 1); // strtok modifies the message so make copy
2816-
char *token = strtok(temp, " ");
2816+
char *preservedPointer;
2817+
char *token = strtok_r(temp, " ", &preservedPointer);
28172818
while (token != nullptr)
28182819
{
28192820
wordCount++;
2820-
token = strtok(nullptr, " ");
2821+
token = strtok_r(nullptr, " ", &preservedPointer);
28212822
}
28222823

28232824
uint8_t yPos = (oled->getHeight() / 2) - (fontHeight / 2);
@@ -2829,11 +2830,11 @@ void displayMessage(const char *message, uint16_t displayTime)
28292830
// drawFrame();
28302831

28312832
strncpy(temp, message, sizeof(temp) - 1);
2832-
token = strtok(temp, " ");
2833+
token = strtok_r(temp, " ", &preservedPointer);
28332834
while (token != nullptr)
28342835
{
28352836
printTextCenter(token, yPos, QW_FONT_8X16, 1, false); // text, y, font type, kerning, inverted
2836-
token = strtok(nullptr, " ");
2837+
token = strtok_r(nullptr, " ", &preservedPointer);
28372838
yPos += fontHeight;
28382839
}
28392840

Firmware/RTK_Everywhere/NVM.ino

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -990,8 +990,16 @@ bool parseLine(char *str)
990990
{
991991
char *ptr;
992992

993+
// A health warning about strtok:
994+
// strtok will convert any delimiters it finds ("=" in our case) into NULL characters.
995+
// Also, be very careful that you do not use strtok within an strtok while loop.
996+
// The next call of strtok(NULL, ...) in the outer loop will use the pointer saved from the inner loop!
997+
// The same is true for tasks!
998+
// The solution is to use strtok_r - the reentrant version of strtok
999+
9931000
// Set strtok start of line.
994-
str = strtok(str, "=");
1001+
char *preservedPointer;
1002+
str = strtok_r(str, "=", &preservedPointer);
9951003
if (!str)
9961004
{
9971005
log_d("Fail");
@@ -1006,7 +1014,7 @@ bool parseLine(char *str)
10061014
char settingString[100] = "";
10071015

10081016
// Move pointer to end of line
1009-
str = strtok(nullptr, "\n");
1017+
str = strtok_r(nullptr, "\n", &preservedPointer);
10101018
if (!str)
10111019
{
10121020
// This line does not contain a \n or the settingString is zero length

Firmware/RTK_Everywhere/Network.ino

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,11 @@ void menuTcpUdp()
262262
// Remove any http:// or https:// prefix from host name
263263
// strtok modifies string to be parsed so we create a copy
264264
strncpy(hostname, settings.tcpClientHost, sizeof(hostname) - 1);
265-
char *token = strtok(hostname, "//");
265+
char *preservedPointer;
266+
char *token = strtok_r(hostname, "//", &preservedPointer);
266267
if (token != nullptr)
267268
{
268-
token = strtok(nullptr, "//"); // Advance to data after //
269+
token = strtok_r(nullptr, "//", &preservedPointer); // Advance to data after //
269270
if (token != nullptr)
270271
strcpy(settings.tcpClientHost, token);
271272
}

Firmware/RTK_Everywhere/NtripClient.ino

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,11 @@ bool ntripClientConnect()
216216
char hostname[51];
217217
strncpy(hostname, settings.ntripClient_CasterHost,
218218
sizeof(hostname) - 1); // strtok modifies string to be parsed so we create a copy
219-
char *token = strtok(hostname, "//");
219+
char *preservedPointer;
220+
char *token = strtok_r(hostname, "//", &preservedPointer);
220221
if (token != nullptr)
221222
{
222-
token = strtok(nullptr, "//"); // Advance to data after //
223+
token = strtok_r(nullptr, "//", &preservedPointer); // Advance to data after //
223224
if (token != nullptr)
224225
strcpy(settings.ntripClient_CasterHost, token);
225226
}

Firmware/RTK_Everywhere/NtripServer.ino

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,11 @@ bool ntripServerConnectCaster(int serverIndex)
192192
char hostname[51];
193193
strncpy(hostname, settings.ntripServer_CasterHost[serverIndex],
194194
sizeof(hostname) - 1); // strtok modifies string to be parsed so we create a copy
195-
char *token = strtok(hostname, "//");
195+
char *preservedPointer;
196+
char *token = strtok_r(hostname, "//", &preservedPointer);
196197
if (token != nullptr)
197198
{
198-
token = strtok(nullptr, "//"); // Advance to data after //
199+
token = strtok_r(nullptr, "//", &preservedPointer); // Advance to data after //
199200
if (token != nullptr)
200201
strcpy(settings.ntripServer_CasterHost[serverIndex], token);
201202
}

Firmware/RTK_Everywhere/System.ino

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -585,10 +585,11 @@ CoordinateInputType coordinateIdentifyInputType(const char *userEntryOriginal, d
585585
{
586586
coordinateInputType = COORDINATE_INPUT_TYPE_DD_MM_DASH;
587587

588-
char *token = strtok(userEntry, "-"); // Modifies the given array
588+
char *preservedPointer;
589+
char *token = strtok_r(userEntry, "-", &preservedPointer); // Modifies the given array
589590
// We trust that token points at something because the dashCount is > 0
590591
int decimal = atoi(token); // Get DD
591-
token = strtok(nullptr, "-");
592+
token = strtok_r(nullptr, "-", &preservedPointer);
592593
double minutes = atof(token); // Get MM.mmmmmmm
593594
*coordinate = decimal + (minutes / 60.0);
594595
if (negativeSign)
@@ -598,12 +599,13 @@ CoordinateInputType coordinateIdentifyInputType(const char *userEntryOriginal, d
598599
{
599600
coordinateInputType = COORDINATE_INPUT_TYPE_DD_MM_SS_DASH;
600601

601-
char *token = strtok(userEntry, "-"); // Modifies the given array
602+
char *preservedPointer;
603+
char *token = strtok_r(userEntry, "-", &preservedPointer); // Modifies the given array
602604
// We trust that token points at something because the spaceCount is > 0
603605
int decimal = atoi(token); // Get DD
604-
token = strtok(nullptr, "-");
606+
token = strtok_r(nullptr, "-", &preservedPointer);
605607
int minutes = atoi(token); // Get MM
606-
token = strtok(nullptr, "-");
608+
token = strtok_r(nullptr, "-", &preservedPointer);
607609

608610
// Find '.'
609611
char *decimalPtr = strchr(token, '.');
@@ -626,10 +628,11 @@ CoordinateInputType coordinateIdentifyInputType(const char *userEntryOriginal, d
626628
{
627629
coordinateInputType = COORDINATE_INPUT_TYPE_DD_MM;
628630

629-
char *token = strtok(userEntry, " "); // Modifies the given array
631+
char *preservedPointer;
632+
char *token = strtok_r(userEntry, " ", &preservedPointer); // Modifies the given array
630633
// We trust that token points at something because the spaceCount is > 0
631634
int decimal = atoi(token); // Get DD
632-
token = strtok(nullptr, " ");
635+
token = strtok_r(nullptr, " ", &preservedPointer);
633636
double minutes = atof(token); // Get MM.mmmmmmm
634637
*coordinate = decimal + (minutes / 60.0);
635638
if (negativeSign)
@@ -639,12 +642,13 @@ CoordinateInputType coordinateIdentifyInputType(const char *userEntryOriginal, d
639642
{
640643
coordinateInputType = COORDINATE_INPUT_TYPE_DD_MM_SS;
641644

642-
char *token = strtok(userEntry, " "); // Modifies the given array
645+
char *preservedPointer;
646+
char *token = strtok_r(userEntry, " ", &preservedPointer); // Modifies the given array
643647
// We trust that token points at something because the spaceCount is > 0
644648
int decimal = atoi(token); // Get DD
645-
token = strtok(nullptr, " ");
649+
token = strtok_r(nullptr, " ", &preservedPointer);
646650
int minutes = atoi(token); // Get MM
647-
token = strtok(nullptr, " ");
651+
token = strtok_r(nullptr, " ", &preservedPointer);
648652

649653
// Find '.'
650654
char *decimalPtr = strchr(token, '.');

0 commit comments

Comments
 (0)