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
This commit is contained in:
Carl Hetherington
2012-03-13 01:23:44 +00:00
parent b4999fbc14
commit ca19d2af16

View File

@@ -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;
}