diff options
author | Carl Hetherington <carl@carlh.net> | 2012-03-13 01:23:44 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-03-13 01:23:44 +0000 |
commit | ca19d2af163728d9a48d46acec895d65bfd81e0b (patch) | |
tree | 25353aefd989c7655d180c83d52a68d144031ae6 /libs/ardour | |
parent | b4999fbc1408fa2fb49861e8b9d07fca5f7d65b3 (diff) |
Use fgets and sscanf to read numbers rather than fscanf, avoiding strange occurrence of fscanf (..., %dn, ...) eating a blank line immediately after the number that it reads; fix erroneous warning about failure to get VST information.
git-svn-id: svn://localhost/ardour2/branches/3.0@11658 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/linux_vst_info_file.cc | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/libs/ardour/linux_vst_info_file.cc b/libs/ardour/linux_vst_info_file.cc index 9fae93f835..83cbfe4a56 100644 --- a/libs/ardour/linux_vst_info_file.cc +++ b/libs/ardour/linux_vst_info_file.cc @@ -45,6 +45,22 @@ static char* read_string(FILE *fp) } } +/** Read an integer value from a line in fp into n, + * @return true on success, false on failure. + */ +static bool +read_int (FILE* fp, int* n) +{ + char buf[MAX_STRING_LEN]; + + char* p = fgets (buf, MAX_STRING_LEN, fp); + if (p == 0) { + return false; + } + + return (sscanf (p, "%d", n) != 1); +} + static VSTInfo * load_vstfx_info_file (FILE* fp) { @@ -54,23 +70,23 @@ load_vstfx_info_file (FILE* fp) return 0; } - if((info->name = read_string(fp)) == 0) goto error; - if((info->creator = read_string(fp)) == 0) goto error; - if(1 != fscanf(fp, "%d\n", &info->UniqueID)) goto error; - if((info->Category = read_string(fp)) == 0) goto error; - if(1 != fscanf(fp, "%d\n", &info->numInputs)) goto error; - if(1 != fscanf(fp, "%d\n", &info->numOutputs)) goto error; - if(1 != fscanf(fp, "%d\n", &info->numParams)) goto error; - if(1 != fscanf(fp, "%d\n", &info->wantMidi)) goto error; - if(1 != fscanf(fp, "%d\n", &info->hasEditor)) goto error; - if(1 != fscanf(fp, "%d\n", &info->canProcessReplacing)) goto error; - - if((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { + if ((info->name = read_string(fp)) == 0) goto error; + if ((info->creator = read_string(fp)) == 0) goto error; + if (read_int (fp, &info->UniqueID)) goto error; + if ((info->Category = read_string(fp)) == 0) goto error; + if (read_int (fp, &info->numInputs)) goto error; + if (read_int (fp, &info->numOutputs)) goto error; + if (read_int (fp, &info->numParams)) goto error; + if (read_int (fp, &info->wantMidi)) goto error; + if (read_int (fp, &info->hasEditor)) goto error; + if (read_int (fp, &info->canProcessReplacing)) goto error; + + if ((info->ParamNames = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { goto error; } for (int i = 0; i < info->numParams; ++i) { - if((info->ParamNames[i] = read_string(fp)) == 0) goto error; + if ((info->ParamNames[i] = read_string(fp)) == 0) goto error; } if ((info->ParamLabels = (char **) malloc(sizeof(char*)*info->numParams)) == 0) { @@ -78,7 +94,7 @@ load_vstfx_info_file (FILE* fp) } for (int i = 0; i < info->numParams; ++i) { - if((info->ParamLabels[i] = read_string(fp)) == 0) goto error; + if ((info->ParamLabels[i] = read_string(fp)) == 0) goto error; } return info; @@ -369,7 +385,9 @@ vstfx_get_info (char* dllpath) VSTInfo *info; info = load_vstfx_info_file (infofile); fclose (infofile); - PBD::warning << "Cannot get LinuxVST information form " << dllpath << ": info file load failed." << endmsg; + if (info == 0) { + PBD::warning << "Cannot get LinuxVST information form " << dllpath << ": info file load failed." << endmsg; + } return info; } |