struct buffer {
        struct buffer *parent;
        YY_BUFFER_STATE state;
+       int yylineno;
 };
 
 static struct buffer *current_buf;
        struct buffer *buf = xmalloc(sizeof(*buf));
 
        buf->state = YY_CURRENT_BUFFER;
+       buf->yylineno = yylineno;
        buf->parent = current_buf;
        current_buf = buf;
        yyin = zconf_fopen(file->name);
        }
        yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
 
-       current_file->lineno = yylineno;
+       current_file->lineno = zconf_lineno();
        file->parent = current_file;
 
        for (iter = current_file; iter; iter = iter->parent) {
                        do {
                                iter = iter->parent;
                                fprintf(stderr, "  included from: %s:%d\n",
-                                       iter->name, iter->lineno - 1);
+                                       iter->name, iter->lineno);
                        } while (strcmp(iter->name, file->name));
                        exit(1);
                }
        struct buffer *tmp;
 
        current_file = current_file->parent;
-       if (current_file)
-               yylineno = current_file->lineno;
 
        if (!current_buf)
                return;
        fclose(yyin);
        yy_delete_buffer(YY_CURRENT_BUFFER);
        yy_switch_to_buffer(current_buf->state);
+       yylineno = current_buf->yylineno;
        tmp = current_buf;
        current_buf = current_buf->parent;
        free(tmp);