mirror of
https://github.com/onyx-and-iris/vmrcli.git
synced 2025-12-20 21:47:48 +00:00
Compare commits
No commits in common. "main" and "v0.11.0" have entirely different histories.
3
.gitignore
vendored
3
.gitignore
vendored
@ -51,9 +51,6 @@ Module.symvers
|
|||||||
Mkfile.old
|
Mkfile.old
|
||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
# Task Runner
|
|
||||||
.task/
|
|
||||||
|
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
test*
|
test*
|
||||||
34
README.md
34
README.md
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
## `Tested against`
|
## `Tested against`
|
||||||
|
|
||||||
- Basic 1.1.1.9
|
- Basic 1.1.1.1
|
||||||
- Banana 2.1.1.9
|
- Banana 2.1.1.1
|
||||||
- Potato 3.1.1.9
|
- Potato 3.1.1.1
|
||||||
|
|
||||||
## `Requirements`
|
## `Requirements`
|
||||||
|
|
||||||
@ -13,19 +13,17 @@
|
|||||||
## `Use`
|
## `Use`
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\vmrcli.exe [-h] [-v] [-i|-I] [-f] [-k] [-l] [-e] [-c] [-m] [-s] <api commands>
|
.\vmrcli.exe [-h] [-i|-I] [-k] [-D] [-v] [-c] [-m] [-s] <api commands>
|
||||||
```
|
```
|
||||||
|
|
||||||
Where:
|
Where:
|
||||||
|
|
||||||
- `h`: Print the help message.
|
- `h`: Prints the help message.
|
||||||
- `v`: Print the version of vmrcli.
|
|
||||||
- `i`: Enable interactive mode, use (-I) to disable the '>>' prompt.
|
- `i`: Enable interactive mode, use (-I) to disable the '>>' prompt.
|
||||||
- If set, any api commands passed on the command line will be ignored.
|
- If set, any api commands passed on the command line will be ignored.
|
||||||
- `f`: Do not split input on spaces.
|
|
||||||
- `k`: The kind of Voicemeeter (basic, banana or potato). Use this to launch the GUI.
|
- `k`: The kind of Voicemeeter (basic, banana or potato). Use this to launch the GUI.
|
||||||
- `l`: Set log level, must be one of TRACE, DEBUG, INFO, WARN, ERROR, or FATAL
|
- `D`: Set log level 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=FATAL
|
||||||
- `e`: Enable extra console output (toggle, set messages)
|
- `v`: Enable extra console output (toggle, set messages)
|
||||||
- `c`: Load a user configuration (give the full file path)
|
- `c`: Load a user configuration (give the full file path)
|
||||||
- `m`: Launch the MacroButtons application
|
- `m`: Launch the MacroButtons application
|
||||||
- `s`: Launch the StreamerView application
|
- `s`: Launch the StreamerView application
|
||||||
@ -41,23 +39,13 @@ Examples:
|
|||||||
Launch basic GUI, set log level to INFO, Toggle Strip 0 Mute, print its new value, then decrease Bus 0 Gain by 3.8
|
Launch basic GUI, set log level to INFO, Toggle Strip 0 Mute, print its new value, then decrease Bus 0 Gain by 3.8
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\vmrcli.exe -kbasic -lINFO !strip[0].mute strip[0].mute bus[0].gain-=3.8
|
.\vmrcli.exe -kbasic -D2 !strip[0].mute strip[0].mute bus[0].gain-=3.8
|
||||||
```
|
```
|
||||||
|
|
||||||
Launch banana GUI, set log level to DEBUG, set Strip 0 label to podmic then print Strip 2 label
|
Launch banana GUI, set log level to DEBUG, set Strip 0 label to podmic then print Strip 2 label
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\vmrcli.exe -kbanana -lDEBUG strip[0].label=podmic strip[2].label
|
.\vmrcli.exe -kbanana -D1 strip[0].label=podmic strip[2].label
|
||||||
```
|
|
||||||
|
|
||||||
#### `String Commands With Spaces`
|
|
||||||
|
|
||||||
It may be desirable to send a string request containing spaces, for example to change an output device. By default the CLI splits such strings, to avoid this pass the `-f` flag. It's probably best to use this with single commands only due to its effect on how the CLI parses strings. Also note the inclusion of the double quotation marks, it seems the C API requires them.
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
.\vmrcli.exe -lDEBUG -f bus[1].device.wdm='"Realtek Digital Output (Realtek(R) Audio)"'
|
|
||||||
|
|
||||||
.\vmrcli.exe -lDEBUG -f strip[0].label='"My Podmic"'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `Quick Commands`
|
#### `Quick Commands`
|
||||||
@ -94,13 +82,13 @@ API commands follow the same rules as listed above. Entering `Q` or `q` will exi
|
|||||||
Scripts can be loaded from text files, for example in Powershell:
|
Scripts can be loaded from text files, for example in Powershell:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\vmrcli.exe -lDEBUG $(Get-Content .\example_commands.txt)
|
.\vmrcli.exe -D1 $(Get-Content .\example_commands.txt)
|
||||||
```
|
```
|
||||||
|
|
||||||
You may also pipe a scripts contents to the CLI:
|
You may also pipe a scripts contents to the CLI:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$(Get-Content .\example_commands.txt) | .\vmrcli.exe -lDEBUG -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, they may be separated by space, `;` or `,`.
|
||||||
|
|||||||
71
Taskfile.yml
71
Taskfile.yml
@ -1,71 +0,0 @@
|
|||||||
version: '3'
|
|
||||||
|
|
||||||
dotenv: ['.env']
|
|
||||||
|
|
||||||
vars:
|
|
||||||
PROGRAM: vmrcli
|
|
||||||
SHELL: pwsh
|
|
||||||
|
|
||||||
CC: gcc
|
|
||||||
|
|
||||||
SRC_DIR: src
|
|
||||||
INC_DIR: include
|
|
||||||
OBJ_DIR: obj
|
|
||||||
BIN_DIR: bin
|
|
||||||
|
|
||||||
CPPFLAGS: -I{{.INC_DIR}} -MMD -MP {{if eq .LOG_USE_COLOR "yes"}}-DLOG_USE_COLOR{{end}}
|
|
||||||
|
|
||||||
CFLAGS: -O -Wall -W -pedantic -ansi -std=c2x
|
|
||||||
LDFLAGS: -Llib
|
|
||||||
LDLIBS: -lm
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
default:
|
|
||||||
desc: Build vmrcli for Windows
|
|
||||||
deps: [build]
|
|
||||||
|
|
||||||
build:
|
|
||||||
desc: Build vmrcli for Windows
|
|
||||||
deps: [link]
|
|
||||||
|
|
||||||
link:
|
|
||||||
desc: Link all files in obj/ for Windows
|
|
||||||
deps: [compile]
|
|
||||||
cmds:
|
|
||||||
- |
|
|
||||||
{{.SHELL}} -Command "
|
|
||||||
if (!(Test-Path -Path '{{.BIN_DIR}}')) {
|
|
||||||
New-Item -ItemType Directory -Path '{{.BIN_DIR}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
{{.CC}} {{.LDFLAGS}} {{.OBJ_DIR}}/*.o {{.LDLIBS}} -o {{.BIN_DIR}}/{{.PROGRAM}}.exe"
|
|
||||||
sources:
|
|
||||||
- '{{.OBJ_DIR}}/**'
|
|
||||||
generates:
|
|
||||||
- '{{.BIN_DIR}}/{{.PROGRAM}}.exe'
|
|
||||||
|
|
||||||
compile:
|
|
||||||
desc: Compile all files in src/ and include/ for Windows
|
|
||||||
cmds:
|
|
||||||
- |
|
|
||||||
{{.SHELL}} -Command "
|
|
||||||
if (!(Test-Path -Path '{{.OBJ_DIR}}')) {
|
|
||||||
New-Item -ItemType Directory -Path '{{.OBJ_DIR}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
Get-ChildItem -Path '{{.SRC_DIR}}' -Filter '*.c' |
|
|
||||||
ForEach-Object { \$_.Name -replace '\.c$', '' } |
|
|
||||||
ForEach-Object { {{.CC}} {{.CPPFLAGS}} {{.CFLAGS}} -c {{.SRC_DIR}}/\$_.c -o {{.OBJ_DIR}}/\$_.o }"
|
|
||||||
sources:
|
|
||||||
- '{{.SRC_DIR}}/**'
|
|
||||||
- '{{.INC_DIR}}/**'
|
|
||||||
generates:
|
|
||||||
- '{{.OBJ_DIR}}/**'
|
|
||||||
|
|
||||||
clean:
|
|
||||||
desc: Remove all files in obj/ and bin/
|
|
||||||
cmds:
|
|
||||||
- |
|
|
||||||
{{.SHELL}} -Command "
|
|
||||||
if (Test-Path -Path '{{.OBJ_DIR}}') { Remove-Item -Path '{{.OBJ_DIR}}' -Recurse -Force }
|
|
||||||
if (Test-Path -Path '{{.BIN_DIR}}') { Remove-Item -Path '{{.BIN_DIR}}' -Recurse -Force }"
|
|
||||||
@ -10,8 +10,6 @@
|
|||||||
|
|
||||||
#include "VoicemeeterRemote.h"
|
#include "VoicemeeterRemote.h"
|
||||||
|
|
||||||
#define IS_64_BIT sizeof(void *) == 8
|
|
||||||
|
|
||||||
PT_VMR create_interface();
|
PT_VMR create_interface();
|
||||||
|
|
||||||
#endif /* __IVMR_H__ */
|
#endif /* __IVMR_H__ */
|
||||||
@ -15,7 +15,6 @@ struct quickcommand
|
|||||||
};
|
};
|
||||||
|
|
||||||
void remove_last_part_of_path(char *fullpath);
|
void remove_last_part_of_path(char *fullpath);
|
||||||
int log_level_from_string(const char *level);
|
|
||||||
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 *s, long v, int n);
|
||||||
bool is_comment(char *s);
|
bool is_comment(char *s);
|
||||||
|
|||||||
17
makefile
17
makefile
@ -1,53 +1,38 @@
|
|||||||
# Program name
|
|
||||||
program = vmrcli
|
program = vmrcli
|
||||||
|
|
||||||
# Compiler
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
# Directories
|
|
||||||
SRC_DIR := src
|
SRC_DIR := src
|
||||||
OBJ_DIR := obj
|
OBJ_DIR := obj
|
||||||
BIN_DIR := bin
|
BIN_DIR := bin
|
||||||
|
|
||||||
# Executable and source/object files
|
|
||||||
EXE := $(BIN_DIR)/$(program).exe
|
EXE := $(BIN_DIR)/$(program).exe
|
||||||
SRC := $(wildcard $(SRC_DIR)/*.c)
|
SRC := $(wildcard $(SRC_DIR)/*.c)
|
||||||
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
|
|
||||||
# Conditional compilation flags for logging
|
|
||||||
LOG_USE_COLOR ?= yes
|
LOG_USE_COLOR ?= yes
|
||||||
ifeq ($(LOG_USE_COLOR), yes)
|
ifeq ($(LOG_USE_COLOR), yes)
|
||||||
CPPFLAGS := -Iinclude -MMD -MP -DLOG_USE_COLOR
|
CPPFLAGS := -Iinclude -MMD -MP -DLOG_USE_COLOR
|
||||||
else
|
else
|
||||||
CPPFLAGS := -Iinclude -MMD -MP
|
CPPFLAGS := -Iinclude -MMD -MP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Compiler and linker flags
|
|
||||||
CFLAGS = -O -Wall -W -pedantic -ansi -std=c2x
|
CFLAGS = -O -Wall -W -pedantic -ansi -std=c2x
|
||||||
LDFLAGS := -Llib
|
LDFLAGS := -Llib
|
||||||
LDLIBS := -lm
|
LDLIBS := -lm
|
||||||
|
|
||||||
# Phony targets
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
# Default target
|
|
||||||
all: $(EXE)
|
all: $(EXE)
|
||||||
|
|
||||||
# Link the executable
|
|
||||||
$(EXE): $(OBJ) | $(BIN_DIR)
|
$(EXE): $(OBJ) | $(BIN_DIR)
|
||||||
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
||||||
|
|
||||||
# Compile source files to object files
|
|
||||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
# Create necessary directories
|
|
||||||
$(BIN_DIR) $(OBJ_DIR):
|
$(BIN_DIR) $(OBJ_DIR):
|
||||||
pwsh -Command New-Item -Path $@ -ItemType Directory
|
pwsh -Command New-Item -Path $@ -ItemType Directory
|
||||||
|
|
||||||
# Clean up generated files
|
|
||||||
clean:
|
clean:
|
||||||
pwsh -Command Remove-Item -Recurse $(BIN_DIR), $(OBJ_DIR) -force
|
pwsh -Command Remove-Item -Recurse $(EXE), $(OBJ_DIR) -force
|
||||||
|
|
||||||
# Include dependency files
|
|
||||||
-include $(OBJ:.o=.d)
|
-include $(OBJ:.o=.d)
|
||||||
|
|||||||
@ -81,7 +81,7 @@ static long initialize_dll_interfaces(PT_VMR vmr)
|
|||||||
return -100;
|
return -100;
|
||||||
}
|
}
|
||||||
// use right dll according to O/S type
|
// use right dll according to O/S type
|
||||||
if (IS_64_BIT)
|
if (sizeof(void *) == 8)
|
||||||
strncat(dll_fullpath, DLL64_NAME, DLL_FULLPATH_SZ - strlen(DLL64_NAME) - 1);
|
strncat(dll_fullpath, DLL64_NAME, DLL_FULLPATH_SZ - strlen(DLL64_NAME) - 1);
|
||||||
else
|
else
|
||||||
strncat(dll_fullpath, DLL32_NAME, DLL_FULLPATH_SZ - strlen(DLL32_NAME) - 1);
|
strncat(dll_fullpath, DLL32_NAME, DLL_FULLPATH_SZ - strlen(DLL32_NAME) - 1);
|
||||||
|
|||||||
@ -118,7 +118,7 @@ void log_set_quiet(bool enable)
|
|||||||
|
|
||||||
int log_add_callback(log_LogFn fn, void *udata, int level)
|
int log_add_callback(log_LogFn fn, void *udata, int level)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_CALLBACKS; ++i)
|
for (int i = 0; i < MAX_CALLBACKS; i++)
|
||||||
{
|
{
|
||||||
if (!L.callbacks[i].fn)
|
if (!L.callbacks[i].fn)
|
||||||
{
|
{
|
||||||
@ -163,7 +163,7 @@ void log_log(int level, const char *file, int line, const char *fmt, ...)
|
|||||||
va_end(ev.ap);
|
va_end(ev.ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAX_CALLBACKS && L.callbacks[i].fn; ++i)
|
for (int i = 0; i < MAX_CALLBACKS && L.callbacks[i].fn; i++)
|
||||||
{
|
{
|
||||||
Callback *cb = &L.callbacks[i];
|
Callback *cb = &L.callbacks[i];
|
||||||
if (level >= cb->level)
|
if (level >= cb->level)
|
||||||
|
|||||||
26
src/util.c
26
src/util.c
@ -12,7 +12,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "log.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Removes the last part of a path
|
* @brief Removes the last part of a path
|
||||||
@ -29,29 +28,6 @@ void remove_last_part_of_path(char *fullpath)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Gets log level as int from string
|
|
||||||
* @param level Log level as string
|
|
||||||
* @return int Log level as int, or -1 if not found
|
|
||||||
*/
|
|
||||||
int log_level_from_string(const char *level)
|
|
||||||
{
|
|
||||||
if (strcmp(level, "TRACE") == 0)
|
|
||||||
return LOG_TRACE;
|
|
||||||
else if (strcmp(level, "DEBUG") == 0)
|
|
||||||
return LOG_DEBUG;
|
|
||||||
else if (strcmp(level, "INFO") == 0)
|
|
||||||
return LOG_INFO;
|
|
||||||
else if (strcmp(level, "WARN") == 0)
|
|
||||||
return LOG_WARN;
|
|
||||||
else if (strcmp(level, "ERROR") == 0)
|
|
||||||
return LOG_ERROR;
|
|
||||||
else if (strcmp(level, "FATAL") == 0)
|
|
||||||
return LOG_FATAL;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Converts Voicemeeter's kind into a string.
|
* @brief Converts Voicemeeter's kind into a string.
|
||||||
*
|
*
|
||||||
@ -116,7 +92,7 @@ bool is_comment(char *s)
|
|||||||
*/
|
*/
|
||||||
struct quickcommand *command_in_quickcommands(const char *command_key, const struct quickcommand *quickcommands, int n)
|
struct quickcommand *command_in_quickcommands(const char *command_key, const struct quickcommand *quickcommands, int n)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < n; ++i)
|
for (int i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
if (strcmp(command_key, quickcommands[i].name) == 0)
|
if (strcmp(command_key, quickcommands[i].name) == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
85
src/vmrcli.c
85
src/vmrcli.c
@ -18,24 +18,21 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define USAGE "Usage: .\\vmrcli.exe [-h] [-v] [-i|-I] [-f] [-k] [-l] [-e] [-c] [-m] [-s] <api commands>\n" \
|
#define USAGE "Usage: .\\vmrcli.exe [-h] [-i|-I] [-k] [-D] [-v] [-c] [-m] [-s] <api commands>\n" \
|
||||||
"Where: \n" \
|
"Where: \n" \
|
||||||
"\th: Print the help message\n" \
|
"\th: Prints the help message\n" \
|
||||||
"\tv: Print the version number\n" \
|
|
||||||
"\ti: Enable interactive mode, use (-I) to disable the '>>' prompt\n" \
|
"\ti: Enable interactive mode, use (-I) to disable the '>>' prompt\n" \
|
||||||
"\tf: Do not split input on spaces\n" \
|
|
||||||
"\tk: The kind of Voicemeeter (basic, banana, potato)\n" \
|
"\tk: The kind of Voicemeeter (basic, banana, potato)\n" \
|
||||||
"\tl: Set log level, must be one of TRACE, DEBUG, INFO, WARN, ERROR, or FATAL\n" \
|
"\tD: Set log level 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=FATAL\n" \
|
||||||
"\te: Enable extra console output (toggle, set messages)\n" \
|
"\tv: Enable extra console output (toggle, set messages)\n" \
|
||||||
"\tc: Load a user configuration (give the full file path)\n" \
|
"\tc: Load a user configuration (give the full file path)\n" \
|
||||||
"\tm: Launch the MacroButtons application\n" \
|
"\tm: Launch the MacroButtons application\n" \
|
||||||
"\ts: Launch the StreamerView application"
|
"\ts: Launch the StreamerView application"
|
||||||
#define OPTSTR ":hvk:msc:iIfl:e"
|
#define OPTSTR ":hk:msc:iID:v"
|
||||||
#define MAX_LINE 4096 /* Size of the input buffer */
|
#define MAX_LINE 4096 /* Size of the input buffer */
|
||||||
#define RES_SZ 512 /* Size of the buffer passed to VBVMR_GetParameterStringW */
|
#define RES_SZ 512 /* Size of the buffer passed to VBVMR_GetParameterStringW */
|
||||||
#define COUNT_OF(x) (sizeof(x) / sizeof(x[0]))
|
#define COUNT_OF(x) (sizeof(x) / sizeof(x[0]))
|
||||||
#define DELIMITERS " \t;,"
|
#define DELIMITERS " \t;,"
|
||||||
#define VERSION "0.12.0"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @enum The kind of values a get call may return.
|
* @enum The kind of values a get call may return.
|
||||||
@ -61,13 +58,13 @@ struct result
|
|||||||
} val;
|
} val;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool eflag = false;
|
static bool vflag = false;
|
||||||
|
|
||||||
static void terminate(PT_VMR vmr, char *msg);
|
static void terminate(PT_VMR vmr, char *msg);
|
||||||
static void usage();
|
static void usage();
|
||||||
static enum kind set_kind(char *kval);
|
static enum kind set_kind(char *kval);
|
||||||
static void interactive(PT_VMR vmr, bool with_prompt, char *delimiters);
|
static void interactive(PT_VMR vmr, bool with_prompt);
|
||||||
static void parse_input(PT_VMR vmr, char *input, char *delimiters);
|
static void parse_input(PT_VMR vmr, char *input);
|
||||||
static void parse_command(PT_VMR vmr, char *command);
|
static void parse_command(PT_VMR vmr, char *command);
|
||||||
static void get(PT_VMR vmr, char *command, struct result *res);
|
static void get(PT_VMR vmr, char *command, struct result *res);
|
||||||
|
|
||||||
@ -77,10 +74,9 @@ int main(int argc, char *argv[])
|
|||||||
mflag = false,
|
mflag = false,
|
||||||
sflag = false,
|
sflag = false,
|
||||||
cflag = false,
|
cflag = false,
|
||||||
fflag = false,
|
|
||||||
with_prompt = true;
|
with_prompt = true;
|
||||||
int opt;
|
int opt;
|
||||||
int log_level = LOG_WARN;
|
int dvalue;
|
||||||
char *cvalue;
|
char *cvalue;
|
||||||
enum kind kind = BANANAX64;
|
enum kind kind = BANANAX64;
|
||||||
|
|
||||||
@ -89,16 +85,13 @@ int main(int argc, char *argv[])
|
|||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
log_set_level(log_level);
|
log_set_level(LOG_WARN);
|
||||||
|
|
||||||
opterr = 0;
|
opterr = 0;
|
||||||
while ((opt = getopt(argc, argv, OPTSTR)) != -1)
|
while ((opt = getopt(argc, argv, OPTSTR)) != -1)
|
||||||
{
|
{
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
case 'v':
|
|
||||||
printf("vmrcli version %s\n", VERSION);
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
case 'k':
|
case 'k':
|
||||||
kind = set_kind(optarg);
|
kind = set_kind(optarg);
|
||||||
if (kind == UNKNOWN)
|
if (kind == UNKNOWN)
|
||||||
@ -123,24 +116,21 @@ int main(int argc, char *argv[])
|
|||||||
case 'i':
|
case 'i':
|
||||||
iflag = true;
|
iflag = true;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'D':
|
||||||
fflag = true;
|
dvalue = atoi(optarg);
|
||||||
break;
|
if (dvalue >= LOG_TRACE && dvalue <= LOG_FATAL)
|
||||||
case 'l':
|
|
||||||
log_level = log_level_from_string(optarg);
|
|
||||||
if (log_level != -1)
|
|
||||||
{
|
{
|
||||||
log_set_level(log_level);
|
log_set_level(dvalue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_warn(
|
log_warn(
|
||||||
"-l arg out of range, expected TRACE, DEBUG, INFO, WARN, ERROR, or FATAL\n"
|
"-D arg out of range, expected value from 0 up to 5\n"
|
||||||
"Log level will default to LOG_WARN (3).\n");
|
"Log level will default to LOG_WARN (3).\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'v':
|
||||||
eflag = true;
|
vflag = true;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
log_fatal("unknown option -- '%c'\n"
|
log_fatal("unknown option -- '%c'\n"
|
||||||
@ -194,22 +184,16 @@ int main(int argc, char *argv[])
|
|||||||
clear(vmr, is_pdirty);
|
clear(vmr, is_pdirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *delimiter_ptr = DELIMITERS;
|
|
||||||
if (fflag)
|
|
||||||
{
|
|
||||||
delimiter_ptr++; /* skip space delimiter */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iflag)
|
if (iflag)
|
||||||
{
|
{
|
||||||
puts("Interactive mode enabled. Enter 'Q' to exit.");
|
puts("Interactive mode enabled. Enter 'Q' to exit.");
|
||||||
interactive(vmr, with_prompt, delimiter_ptr);
|
interactive(vmr, with_prompt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i = optind; i < argc; ++i)
|
for (int i = optind; i < argc; i++)
|
||||||
{
|
{
|
||||||
parse_input(vmr, argv[i], delimiter_ptr);
|
parse_input(vmr, argv[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,11 +240,11 @@ static void usage()
|
|||||||
static enum kind set_kind(char *kval)
|
static enum kind set_kind(char *kval)
|
||||||
{
|
{
|
||||||
if (strcmp(kval, "basic") == 0)
|
if (strcmp(kval, "basic") == 0)
|
||||||
return IS_64_BIT ? BASICX64 : BASIC;
|
return sizeof(void *) == 8 ? BASICX64 : BASIC;
|
||||||
else if (strcmp(kval, "banana") == 0)
|
else if (strcmp(kval, "banana") == 0)
|
||||||
return IS_64_BIT ? BANANAX64 : BANANA;
|
return sizeof(void *) == 8 ? BANANAX64 : BANANA;
|
||||||
else if (strcmp(kval, "potato") == 0)
|
else if (strcmp(kval, "potato") == 0)
|
||||||
return IS_64_BIT ? POTATOX64 : POTATO;
|
return sizeof(void *) == 8 ? POTATOX64 : POTATO;
|
||||||
else
|
else
|
||||||
return UNKNOWN;
|
return UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -272,9 +256,8 @@ static enum kind set_kind(char *kval)
|
|||||||
*
|
*
|
||||||
* @param vmr Pointer to the iVMR interface
|
* @param vmr Pointer to the iVMR interface
|
||||||
* @param with_prompt If true, prints the interactive prompt '>>'
|
* @param with_prompt If true, prints the interactive prompt '>>'
|
||||||
* @param delimiters A string of delimiter characters to split each input line
|
|
||||||
*/
|
*/
|
||||||
static void interactive(PT_VMR vmr, bool with_prompt, char *delimiters)
|
static void interactive(PT_VMR vmr, bool with_prompt)
|
||||||
{
|
{
|
||||||
char input[MAX_LINE];
|
char input[MAX_LINE];
|
||||||
size_t len;
|
size_t len;
|
||||||
@ -283,11 +266,12 @@ static void interactive(PT_VMR vmr, bool with_prompt, char *delimiters)
|
|||||||
printf(">> ");
|
printf(">> ");
|
||||||
while (fgets(input, MAX_LINE, stdin) != NULL)
|
while (fgets(input, MAX_LINE, stdin) != NULL)
|
||||||
{
|
{
|
||||||
input[(len = strcspn(input, "\n"))] = 0;
|
input[strcspn(input, "\n")] = 0;
|
||||||
if (len == 1 && toupper(input[0]) == 'Q')
|
if ((len = strlen(input)) == 1 && toupper(input[0]) == 'Q')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
parse_input(vmr, input, delimiters);
|
parse_input(vmr, input);
|
||||||
|
memset(input, 0, len); /* reset input buffer */
|
||||||
|
|
||||||
if (with_prompt)
|
if (with_prompt)
|
||||||
printf(">> ");
|
printf(">> ");
|
||||||
@ -301,20 +285,19 @@ static void interactive(PT_VMR vmr, bool with_prompt, char *delimiters)
|
|||||||
*
|
*
|
||||||
* @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 delimiters A string of delimiter characters to split each input line
|
|
||||||
*/
|
*/
|
||||||
static void parse_input(PT_VMR vmr, char *input, char *delimiters)
|
static void parse_input(PT_VMR vmr, char *input)
|
||||||
{
|
{
|
||||||
if (is_comment(input))
|
if (is_comment(input))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char *token, *p;
|
char *token, *p;
|
||||||
|
|
||||||
token = strtok_r(input, delimiters, &p);
|
token = strtok_r(input, DELIMITERS, &p);
|
||||||
while (token != NULL)
|
while (token != NULL)
|
||||||
{
|
{
|
||||||
parse_command(vmr, token);
|
parse_command(vmr, token);
|
||||||
token = strtok_r(NULL, delimiters, &p);
|
token = strtok_r(NULL, DELIMITERS, &p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +324,7 @@ static void parse_command(PT_VMR vmr, char *command)
|
|||||||
if (qc_ptr != NULL)
|
if (qc_ptr != NULL)
|
||||||
{
|
{
|
||||||
set_parameters(vmr, qc_ptr->fullcommand);
|
set_parameters(vmr, qc_ptr->fullcommand);
|
||||||
if (eflag)
|
if (vflag)
|
||||||
{
|
{
|
||||||
printf("Setting %s\n", qc_ptr->fullcommand);
|
printf("Setting %s\n", qc_ptr->fullcommand);
|
||||||
}
|
}
|
||||||
@ -359,7 +342,7 @@ static void parse_command(PT_VMR vmr, char *command)
|
|||||||
if (res.val.f == 1 || res.val.f == 0)
|
if (res.val.f == 1 || res.val.f == 0)
|
||||||
{
|
{
|
||||||
set_parameter_float(vmr, command, 1 - res.val.f);
|
set_parameter_float(vmr, command, 1 - res.val.f);
|
||||||
if (eflag)
|
if (vflag)
|
||||||
{
|
{
|
||||||
printf("Toggling %s\n", command);
|
printf("Toggling %s\n", command);
|
||||||
}
|
}
|
||||||
@ -373,7 +356,7 @@ static void parse_command(PT_VMR vmr, char *command)
|
|||||||
if (strchr(command, '=') != NULL) /* set */
|
if (strchr(command, '=') != NULL) /* set */
|
||||||
{
|
{
|
||||||
set_parameters(vmr, command);
|
set_parameters(vmr, command);
|
||||||
if (eflag)
|
if (vflag)
|
||||||
{
|
{
|
||||||
printf("Setting %s\n", command);
|
printf("Setting %s\n", command);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user