Skip to content

Commit 8c5d967

Browse files
kubistikaakallabeth
authored andcommitted
cmdline: export CommandLineParseCommaSeparatedValues
1 parent c68c50d commit 8c5d967

File tree

3 files changed

+105
-105
lines changed

3 files changed

+105
-105
lines changed

client/common/cmdline.c

Lines changed: 16 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -775,94 +775,6 @@ BOOL freerdp_client_add_dynamic_channel(rdpSettings* settings, size_t count, cha
775775
return FALSE;
776776
}
777777

778-
static char** freerdp_command_line_parse_comma_separated_values_ex(const char* name,
779-
const char* list, size_t* count)
780-
{
781-
char** p;
782-
char* str;
783-
size_t nArgs;
784-
size_t index;
785-
size_t nCommas;
786-
size_t prefix, len;
787-
nCommas = 0;
788-
assert(NULL != count);
789-
*count = 0;
790-
791-
if (!list)
792-
{
793-
if (name)
794-
{
795-
size_t len = strlen(name);
796-
p = (char**)calloc(2UL + len, sizeof(char*));
797-
798-
if (p)
799-
{
800-
char* dst = (char*)&p[1];
801-
p[0] = dst;
802-
sprintf_s(dst, len + 1, "%s", name);
803-
*count = 1;
804-
return p;
805-
}
806-
}
807-
808-
return NULL;
809-
}
810-
811-
{
812-
const char* it = list;
813-
814-
while ((it = strchr(it, ',')) != NULL)
815-
{
816-
it++;
817-
nCommas++;
818-
}
819-
}
820-
821-
nArgs = nCommas + 1;
822-
823-
if (name)
824-
nArgs++;
825-
826-
prefix = (nArgs + 1UL) * sizeof(char*);
827-
len = strlen(list);
828-
p = (char**)calloc(len + prefix + 1, sizeof(char*));
829-
830-
if (!p)
831-
return NULL;
832-
833-
str = &((char*)p)[prefix];
834-
memcpy(str, list, len);
835-
836-
if (name)
837-
p[0] = (char*)name;
838-
839-
for (index = name ? 1 : 0; index < nArgs; index++)
840-
{
841-
char* comma = strchr(str, ',');
842-
p[index] = str;
843-
844-
if (comma)
845-
{
846-
str = comma + 1;
847-
*comma = '\0';
848-
}
849-
}
850-
851-
*count = nArgs;
852-
return p;
853-
}
854-
855-
static char** freerdp_command_line_parse_comma_separated_values(char* list, size_t* count)
856-
{
857-
return freerdp_command_line_parse_comma_separated_values_ex(NULL, list, count);
858-
}
859-
860-
static char** freerdp_command_line_parse_comma_separated_values_offset(const char* name, char* list,
861-
size_t* count)
862-
{
863-
return freerdp_command_line_parse_comma_separated_values_ex(name, list, count);
864-
}
865-
866778
static int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_ARGUMENT_A* arg)
867779
{
868780
rdpSettings* settings = (rdpSettings*)context;
@@ -872,7 +784,7 @@ static int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_A
872784
{
873785
char** p;
874786
size_t count;
875-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
787+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
876788

877789
if ((status = freerdp_client_add_device_channel(settings, count, p)))
878790
{
@@ -885,64 +797,63 @@ static int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_A
885797
{
886798
char** p;
887799
size_t count;
888-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
800+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
889801
status = freerdp_client_add_static_channel(settings, count, p);
890802
free(p);
891803
}
892804
CommandLineSwitchCase(arg, "dvc")
893805
{
894806
char** p;
895807
size_t count;
896-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
808+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
897809
status = freerdp_client_add_dynamic_channel(settings, count, p);
898810
free(p);
899811
}
900812
CommandLineSwitchCase(arg, "drive")
901813
{
902814
char** p;
903815
size_t count;
904-
p = freerdp_command_line_parse_comma_separated_values_offset(arg->Name, arg->Value, &count);
816+
p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
905817
status = freerdp_client_add_device_channel(settings, count, p);
906818
free(p);
907819
}
908820
CommandLineSwitchCase(arg, "serial")
909821
{
910822
char** p;
911823
size_t count;
912-
p = freerdp_command_line_parse_comma_separated_values_offset(arg->Name, arg->Value, &count);
824+
p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
913825
status = freerdp_client_add_device_channel(settings, count, p);
914826
free(p);
915827
}
916828
CommandLineSwitchCase(arg, "parallel")
917829
{
918830
char** p;
919831
size_t count;
920-
p = freerdp_command_line_parse_comma_separated_values_offset(arg->Name, arg->Value, &count);
832+
p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
921833
status = freerdp_client_add_device_channel(settings, count, p);
922834
free(p);
923835
}
924836
CommandLineSwitchCase(arg, "smartcard")
925837
{
926838
char** p;
927839
size_t count;
928-
p = freerdp_command_line_parse_comma_separated_values_offset(arg->Name, arg->Value, &count);
840+
p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
929841
status = freerdp_client_add_device_channel(settings, count, p);
930842
free(p);
931843
}
932844
CommandLineSwitchCase(arg, "printer")
933845
{
934846
char** p;
935847
size_t count;
936-
p = freerdp_command_line_parse_comma_separated_values_offset(arg->Name, arg->Value, &count);
848+
p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
937849
status = freerdp_client_add_device_channel(settings, count, p);
938850
free(p);
939851
}
940852
CommandLineSwitchCase(arg, "usb")
941853
{
942854
char** p;
943855
size_t count;
944-
p = freerdp_command_line_parse_comma_separated_values_offset(URBDRC_CHANNEL_NAME,
945-
arg->Value, &count);
856+
p = CommandLineParseCommaSeparatedValuesEx(URBDRC_CHANNEL_NAME, arg->Value, &count);
946857
status = freerdp_client_add_dynamic_channel(settings, count, p);
947858
free(p);
948859
}
@@ -979,23 +890,23 @@ static int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_A
979890
{
980891
char** p;
981892
size_t count;
982-
p = freerdp_command_line_parse_comma_separated_values_offset("rdpsnd", arg->Value, &count);
893+
p = CommandLineParseCommaSeparatedValuesEx("rdpsnd", arg->Value, &count);
983894
status = freerdp_client_add_static_channel(settings, count, p);
984895
free(p);
985896
}
986897
CommandLineSwitchCase(arg, "microphone")
987898
{
988899
char** p;
989900
size_t count;
990-
p = freerdp_command_line_parse_comma_separated_values_offset("audin", arg->Value, &count);
901+
p = CommandLineParseCommaSeparatedValuesEx("audin", arg->Value, &count);
991902
status = freerdp_client_add_dynamic_channel(settings, count, p);
992903
free(p);
993904
}
994905
CommandLineSwitchCase(arg, "multimedia")
995906
{
996907
char** p;
997908
size_t count;
998-
p = freerdp_command_line_parse_comma_separated_values_offset("tsmf", arg->Value, &count);
909+
p = CommandLineParseCommaSeparatedValuesEx("tsmf", arg->Value, &count);
999910
status = freerdp_client_add_dynamic_channel(settings, count, p);
1000911
free(p);
1001912
}
@@ -1867,7 +1778,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
18671778
UINT32 i;
18681779
char** p;
18691780
size_t count = 0;
1870-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
1781+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
18711782

18721783
if (!p)
18731784
return COMMAND_LINE_ERROR_MEMORY;
@@ -2455,7 +2366,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
24552366
char** p;
24562367
size_t count, x;
24572368

2458-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
2369+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
24592370
if (!p || (count == 0))
24602371
rc = COMMAND_LINE_ERROR;
24612372
for (x = 0; x < count; x++)
@@ -2533,7 +2444,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
25332444
char** p;
25342445
size_t count, x;
25352446

2536-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
2447+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
25372448
if (!p || (count == 0))
25382449
rc = COMMAND_LINE_ERROR;
25392450
for (x = 0; x < count; x++)
@@ -2670,7 +2581,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
26702581
UINT32 i;
26712582
char** p;
26722583
size_t count = 0;
2673-
p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count);
2584+
p = CommandLineParseCommaSeparatedValues(arg->Value, &count);
26742585

26752586
for (i = 0; i < count; i++)
26762587
{

winpr/include/winpr/cmdline.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ extern "C"
159159
WINPR_API COMMAND_LINE_ARGUMENT_A*
160160
CommandLineFindNextArgumentA(COMMAND_LINE_ARGUMENT_A* argument);
161161

162+
WINPR_API char** CommandLineParseCommaSeparatedValues(const char* list, size_t* count);
163+
164+
WINPR_API char** CommandLineParseCommaSeparatedValuesEx(const char* name, const char* list,
165+
size_t* count);
166+
162167
#ifdef __cplusplus
163168
}
164169
#endif

winpr/libwinpr/utils/cmdline.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,3 +473,87 @@ COMMAND_LINE_ARGUMENT_A* CommandLineFindNextArgumentA(COMMAND_LINE_ARGUMENT_A* a
473473

474474
return nextArgument;
475475
}
476+
477+
char** CommandLineParseCommaSeparatedValuesEx(const char* name, const char* list, size_t* count)
478+
{
479+
char** p;
480+
char* str;
481+
size_t nArgs;
482+
size_t index;
483+
size_t nCommas;
484+
size_t prefix, len;
485+
nCommas = 0;
486+
487+
if (count == NULL)
488+
return NULL;
489+
490+
*count = 0;
491+
492+
if (!list)
493+
{
494+
if (name)
495+
{
496+
size_t len = strlen(name);
497+
p = (char**)calloc(2UL + len, sizeof(char*));
498+
499+
if (p)
500+
{
501+
char* dst = (char*)&p[1];
502+
p[0] = dst;
503+
sprintf_s(dst, len + 1, "%s", name);
504+
*count = 1;
505+
return p;
506+
}
507+
}
508+
509+
return NULL;
510+
}
511+
512+
{
513+
const char* it = list;
514+
515+
while ((it = strchr(it, ',')) != NULL)
516+
{
517+
it++;
518+
nCommas++;
519+
}
520+
}
521+
522+
nArgs = nCommas + 1;
523+
524+
if (name)
525+
nArgs++;
526+
527+
prefix = (nArgs + 1UL) * sizeof(char*);
528+
len = strlen(list);
529+
p = (char**)calloc(len + prefix + 1, sizeof(char*));
530+
531+
if (!p)
532+
return NULL;
533+
534+
str = &((char*)p)[prefix];
535+
memcpy(str, list, len);
536+
537+
if (name)
538+
p[0] = (char*)name;
539+
540+
for (index = name ? 1 : 0; index < nArgs; index++)
541+
{
542+
char* comma = strchr(str, ',');
543+
p[index] = str;
544+
545+
if (comma)
546+
{
547+
str = comma + 1;
548+
*comma = '\0';
549+
}
550+
}
551+
552+
*count = nArgs;
553+
return p;
554+
}
555+
556+
char** CommandLineParseCommaSeparatedValues(const char* list, size_t* count)
557+
{
558+
return CommandLineParseCommaSeparatedValuesEx(NULL, list, count);
559+
}

0 commit comments

Comments
 (0)