- name_end = strchr(name_begin + 1, '"');
- /* No terminating quote */
- if (name_end == NULL) {
- g_warning("Malformed filter in '%s' line %d.", ff_path, line);
+ }
+
+ /* Get the name of the filter. */
+ filt_name_index = 0;
+ for (;;) {
+ c = getc(ff);
+ if (c == EOF || c == '\n')
+ break; /* End of line - or end of file */
+ if (c == '"') {
+ /* Closing quote. */
+ if (filt_name_index >= filt_name_len) {
+ /* Filter name buffer isn't long enough; double its length. */
+ filt_name_len *= 2;
+ filt_name = (char *)g_realloc(filt_name, filt_name_len + 1);
+ }
+ filt_name[filt_name_index] = '\0';
+ break;
+ }
+ if (c == '\\') {
+ /* Next character is escaped */
+ c = getc(ff);
+ if (c == EOF || c == '\n')
+ break; /* End of line - or end of file */
+ }
+ /* Add this character to the filter name string. */
+ if (filt_name_index >= filt_name_len) {
+ /* Filter name buffer isn't long enough; double its length. */
+ filt_name_len *= 2;
+ filt_name = (char *)g_realloc(filt_name, filt_name_len + 1);
+ }
+ filt_name[filt_name_index] = c;
+ filt_name_index++;
+ }
+
+ if (c == EOF) {
+ if (!ferror(ff)) {
+ /* EOF, not error; no newline seen before EOF */
+ g_warning("'%s' line %d doesn't have a newline.", ff_path,
+ line);
+ }
+ break; /* nothing more to read */
+ }
+
+ if (c != '"') {
+ /* No newline seen before end-of-line */
+ g_warning("'%s' line %d doesn't have a closing quote.", ff_path,
+ line);