Compare commits

..

No commits in common. "88fe1f57822cdb34d9c7f1e82578c7d7d74dacb3" and "dc8a4036c834c20d8fdea9d49cb2b178d3a2fec2" have entirely different histories.

6 changed files with 61 additions and 16 deletions

View File

@ -78,7 +78,7 @@ You may also pipe a scripts contents to the CLI:
$(Get-Content .\example_commands.txt) | .\vmrcli.exe -D1 -i $(Get-Content .\example_commands.txt) | .\vmrcli.exe -D1 -i
``` ```
Multiple API commands can be in a single line, they may be separated by space, `;` or `,`. Multiple API commands can be in a single line but they should be space separated.
## `Build` ## `Build`

View File

@ -8,8 +8,9 @@
#ifndef __UTIL_H__ #ifndef __UTIL_H__
#define __UTIL_H__ #define __UTIL_H__
void remove_last_part_of_path(char *fullpath); void remove_last_part_of_path(char *szPath);
int replace_blanks_with_single_space(char *s, size_t len);
char *kind_as_string(char *s, int kind, int n); char *kind_as_string(char *s, int kind, int n);
char *version_as_string(char *s, long v, int n); char *version_as_string(char *, long v, int n);
#endif /* __UTIL_H__ */ #endif /* __UTIL_H__ */

View File

@ -3,7 +3,7 @@
* @author Vincent Burel, Onyx and Iris (code@onyxandiris.online) * @author Vincent Burel, Onyx and Iris (code@onyxandiris.online)
* @brief Functions for initializing the iVMR interface. * @brief Functions for initializing the iVMR interface.
* Defines a single public function that returns a pointer to the interface. * Defines a single public function that returns a pointer to the interface.
* @version 0.6.0 * @version 0.5.0
* @date 2024-07-06 * @date 2024-07-06
* *
* @copyright Vincent Burel(c)2015-2021 All Rights Reserved * @copyright Vincent Burel(c)2015-2021 All Rights Reserved

View File

@ -2,7 +2,7 @@
* @file util.c * @file util.c
* @author Onyx and Iris (code@onyxandiris.online) * @author Onyx and Iris (code@onyxandiris.online)
* @brief Utility functions. * @brief Utility functions.
* @version 0.6.0 * @version 0.5.0
* @date 2024-07-06 * @date 2024-07-06
* *
* @copyright Copyright (c) 2024 * @copyright Copyright (c) 2024
@ -31,6 +31,47 @@ void remove_last_part_of_path(char *fullpath)
} }
} }
/**
* @brief Replaces multiple spaces and tabs with single spaces
*
* @param s The string to be reduced
* @param len Current length of the string
* @return int New length of the string
*/
int replace_blanks_with_single_space(char *s, size_t len)
{
int j = 0;
int count = 0;
if (len == 1 && isblank(s[0]))
{
s[0] = '\0';
return len;
}
if (len < 2)
return len;
for (int i = 0; s[i] != '\0'; i++)
{
if (isblank(s[i]))
{
count++;
}
else
{
if (count >= 1)
{
count = 0;
s[j++] = ' ';
}
s[j++] = s[i];
}
}
s[j] = '\0';
return j;
}
/** /**
* @brief Converts Voicemeeter's kind into a string. * @brief Converts Voicemeeter's kind into a string.
* *

View File

@ -2,7 +2,7 @@
* @file vmrcli.c * @file vmrcli.c
* @author Onyx and Iris (code@onyxandiris.online) * @author Onyx and Iris (code@onyxandiris.online)
* @brief A Voicemeeter Remote Command Line Interface * @brief A Voicemeeter Remote Command Line Interface
* @version 0.6.0 * @version 0.5.0
* @date 2024-07-06 * @date 2024-07-06
* *
* @copyright Copyright (c) 2024 * @copyright Copyright (c) 2024
@ -50,7 +50,7 @@ static bool vflag = false;
void help(void); void help(void);
enum kind set_kind(char *kval); enum kind set_kind(char *kval);
void interactive(PT_VMR vmr); void interactive(PT_VMR vmr);
void parse_input(PT_VMR vmr, char *input); void parse_input(PT_VMR vmr, char *input, int len);
void parse_command(PT_VMR vmr, char *command); void parse_command(PT_VMR vmr, char *command);
void get(PT_VMR vmr, char *command, struct result *res); void get(PT_VMR vmr, char *command, struct result *res);
@ -160,7 +160,7 @@ int main(int argc, char *argv[])
{ {
for (int i = optind; i < argc; i++) for (int i = optind; i < argc; i++)
{ {
parse_input(vmr, argv[i]); parse_input(vmr, argv[i], strlen(argv[i]));
} }
} }
@ -240,15 +240,16 @@ enum kind set_kind(char *kval)
void interactive(PT_VMR vmr) void interactive(PT_VMR vmr)
{ {
char input[MAX_LINE]; char input[MAX_LINE];
size_t len;
printf(">> "); printf(">> ");
while (fgets(input, MAX_LINE, stdin) != NULL) while (fgets(input, MAX_LINE, stdin) != NULL)
{ {
input[strcspn(input, "\n")] = 0; input[strcspn(input, "\n")] = 0;
if (strlen(input) == 1 && toupper(input[0]) == 'Q') if ((len = strlen(input)) == 1 && toupper(input[0]) == 'Q')
break; break;
parse_input(vmr, input); parse_input(vmr, input, len);
memset(input, 0, MAX_LINE); /* reset input buffer */ memset(input, 0, MAX_LINE); /* reset input buffer */
printf(">> "); printf(">> ");
@ -256,21 +257,23 @@ void interactive(PT_VMR vmr)
} }
/** /**
* @brief Walks through each line split by " \t;," delimiters. * @brief Walks through each line split by a space delimiter.
* Each token is passed to parse_command() * Each token is passed to parse_command()
* *
* @param vmr Pointer to the iVMR interface * @param vmr Pointer to the iVMR interface
* @param input Each input line, from stdin or CLI args * @param input Each input line, from stdin or CLI args
* @param len The length of the input line
*/ */
void parse_input(PT_VMR vmr, char *input) void parse_input(PT_VMR vmr, char *input, int len)
{ {
char *token, *p; char *token;
token = strtok_r(input, " \t;,", &p); replace_blanks_with_single_space(input, len);
token = strtok(input, " ");
while (token != NULL) while (token != NULL)
{ {
parse_command(vmr, token); parse_command(vmr, token);
token = strtok_r(NULL, " \t;,", &p); token = strtok(NULL, " ");
} }
} }

View File

@ -2,7 +2,7 @@
* @file wrapper.c * @file wrapper.c
* @author Onyx and Iris (code@onyxandiris.online) * @author Onyx and Iris (code@onyxandiris.online)
* @brief Provides public functions that wrap the iVMR calls * @brief Provides public functions that wrap the iVMR calls
* @version 0.6.0 * @version 0.5.0
* @date 2024-07-06 * @date 2024-07-06
* *
* @copyright Copyright (c) 2024 * @copyright Copyright (c) 2024