Skip to content
RELEASE 9.5 (2010/11/07)

Minor packaging issue over 9.4 which is Dead On Arrival

Major changes:

- Fixed level 8 of babyshapes. The makefile was missing all the images
  for this level. I reworked the files so that they lie in the
  resource directory instead of subdirectories.

- New hangman activity. Icon is a a modified one from Mathieu's icon
  set. The cute background is based on a drawing Franck Doucet made
  for our bargame activity.  This activity uses our
  default-<locale>.xml files to propose words to the children. It is
  thus very important now to have them properly filled. For now I did
  the work for English and French. Translators, please refer to this
  page for instructions: http://gcompris.net/wiki/Translation_addons

- Added details activity by Marc Levivier.  In the spirit of famous
  painting discovery, in this activity the painting is complete and
  the children must put painting parts on the right places.

- New feature in the chat activity. The user has a shared white boards
  now. This has been developped by Fionn Ziegler.

- First release of an in progress tool that converts wiktionary xml
  dumps in an xml file. For now, it works only for French, this page
  tracks the progress: http://gcompris.net/wiki/Wiktionary_to_XML The
  idea behind this is to get an xml formatted dictionnary to create
  new activities in the reading / writing area. For now this is just
  not used in GCompris.

- In planegame now the numbers are spoken when the plane hit the
  correct cloud.

- Added missing configuration button in several activites where it
  makes sense. Now teachers / children can set force uppercase in
  click on letter, falling wards, falling letter, horizontal/vertical
  reading. Thanks to Luciana from sleducacional.org

- Added missing level for photohunter by Marc Levivier

- Added the option --disable-level. Some teacher want to be sure the
  children don't skip a level.

- Now the click on letter activity can be played also with the keybord.
  This has been suggested by Sini Ruohomaa.

- Fixed reference to tuxpaint dataset. Now we display saved tuxpaint
  images in our image selector again. Thanks to the person in
  Latinoware 2010 who reported me that this feature has been lost.

- The configuration of the 'missing letter' activity was not working for UTF-8
  multibyte characters (https://bugzilla.gnome.org/show_bug.cgi?id=633978)
  Added a tooltip to better explain the different fields.

- Refined the sudoku's level for scholl usage (By Sylvain Dechy).

- Changed the difficulty level of the maze activity to make it more
  usable in classrooms. (By Sylvain Dechy)

Minor fixes:

- Fixed activity 'double entry' for level 3. References to voices were
  wrong, this level was not playable.

- Fixed bug in which some buttons are no more displayed like in the
  help and the ok buttons in the dialogs (happens on Ubuntu 10.10) No
  more use my autocrop feature in goocanvas. It no more works for an
  unknown reason but it is not very useful, we can live without it. I
  ported GCompris to no more use it.

- Added the command line option --nocursor (-C). As its name implies,
  GCompris won't show any visible cursor. This is very useful to touch
  screen users.

- Added missing words list for Ukranian, Esperanto and Hebrew. There
  were not properly packaged (they need to be completed anyway).

- Now hide the bar in shapegame activities when the focus is on the ok
  button we now show the title and info items. This let the children
  have a complete view of the painting.

- Fixed gc_file_find_absolute() to better parse long and short locale.
  Now a 3 letter locale like 'ast' is supported. Added support for
  locale Fixed a startup issue. Our gc_file_find_absolute() was without
  '.'.

- A few fixes to better manage locale especially in click_on_letter to
  properly display the locale to search if its not a 2 letter prefix
  like for asturian (locale=ast).

- Replaced paintings considered not children proof by new one (By Marc
  Levivier).

Minor changes:

- Added -O2 flag instead of debug in our compilation chain by
  default. Without it we crashes on macosx EXC_ARITHMETIC in a g_malloc
  in sound init.

- Removed the flying plane in the about dialog. This removes the
  need for an extra .png of our logo. Now we have our logo in the
  main window when we start it.

- Integrated the gcompris and fsf logo in our skin.svg file Modified
  the code to use the logo from there.

- Avoid compilation issue in debug mode in gnuchess.

- Added basic instructions to compile GCompris on MacOSX.

- Updated translation instructions for our word list xml files.

- Fixed activation code. Was broken on windows.

- Allow deprecated flag for gtk and gdk to compile again against gtk
  2.22

- Added an explicit sound_close when we exit.  The patch comes from
  debian.

- Added a toolitp in superbrain activity to make it easy to understand
  what a white or black square means.

- Added the method gcompris.get_random_word(wordlist, level) on the
  python side.

- Fixed references to african country for the voices to no more have
  them in a separate directory.

- Added author information for each paintings by Marc Levivier.

- Added the info tag in shape based activity. An info tag is exactly
  the same as a title tag except that is is displayed only when the
  level is completed and the mouse enters the OK button.

- Improved documentation of the sound API documentation (python doc)

- Support GNUCHESS environment variable Will be useful in 0install
  environment when GnuChess is installed from 0install feed.

- Support GNUCAP environment variable Will be useful in 0install
  environment when GnuCap is installed from 0install feed.

- Fix sqlite-less build by Aleksey Lim

- Fixes bug#619433 in the chess game, we no more display the turn at
  game end.

- Removed the help button in the administration where we don't have
  help.

- Improved our shape based activities so that titles entries are
  raised when the focus enters the OK button. It allows the children to
  see the name of the painting even if it is displayed under it.

- Improved the python template activity to have an hello world. For
  info, this page explains how to add an activity:
  http://gcompris.net/wiki/Adding_an_activity

- Created a new script utility named createit.sh. It creates a new
  empty activity with the given name (only python activity).

- Pass NULL as last goo_canvas_image_new's argument. May be fixes some
  crashes.

- Fixed es.po, no more translate keywords in es.po

- In shapegame activities, now the xml format does accept
  'targetfile=""' to remove the red dot.

- Added the number of activities in the main menu view.

- No more check for pysqlite2 unless installed python is 2.4

- Fixed status bar call crashing in command line mode like for
  gcompris -l list.

- README.translators updated to reflect new file organisation.

- Added a message in GCompris itself when we fail to load the skin.
  Before, when the skin file was not found, which means GCompris is
  not properly installed or configured, there was an assert and
  nothing was explained to the user. Now there is a message in the
  GCompris window.

- Now the 'createit.sh <my activity>' script used to create a new
  activity no more requires you to run make. You can just test your
  activity by calling it with 'runit.sh <my activity>'

- Now the text color is black in the memory cards. In white it was
  hard to read.

- Remade the background image of ball catch, paraglider, helicopter.

Voices:

- New voice set for Slovenian by Saša Batistič

Translations:

- Alan Monfort (br)
- Aleksey Lim (es)
- Andrej Žnidaršič (sl)
- Bruno Brouard (fr)
- Christian Kirbach (de)
- Fran Diéguez (gl)
- Frederico Goncalves Guimaraes (pt_BR)
- Gabor Kelemen (hu)
- Giannis Kaskamanidis (el)
- Gonçalo Cordeiro (gl)
- Inaki Larranaga Murgoitio (eu)
- Joe Hansen (da)
- Jorge González (es)
- Karl Ove Hufthammer (nn)
- Mantas Kriaučiūnas (lt)
- Marek Černocký (cs)
- Mario Blättermann (de)
- Petr Kovar (cs)
- Reuma Mordechai (he)
- Xandru Armesto (ast)
- Yannis Kaskamanidis (el)

commit 528976bd7274aaa4227e2d5805a9fcb95dc27370
Author: Bruno Coudoin <bruno.coudoin@free.fr>
Date:   Sun Dec 5 23:23:57 2010 +0100

    Remove prepare-ChangeLog.pl, it does not support git.

diff --git a/prepare-ChangeLog.pl b/prepare-ChangeLog.pl
deleted file mode 100755
index e1bc162..0000000
--- a/prepare-ChangeLog.pl
+++ /dev/null
@@ -1,599 +0,0 @@
-#!/usr/bin/perl -w
-# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 2  -*-
-
-# Perl script to create a ChangeLog entry with names of files
-# and functions from a cvs diff.
-#
-# Darin Adler <darin@eazel.com>, started 20 April 2000
-# Java support added by Maciej Stachowiak <mjs@eazel.com>
-# last updated 28 December 2000
-#
-# (Someone put a license in here, like maybe GPL.)
-#
-# TODO:
-#   Provide option to put new ChangeLog into a separate file
-#     instead of editing the ChangeLog.
-#   For new files, just say "New file" instead of listing
-#     function names.
-#   List functions that have been removed too.
-#   Decide what a good logical order is for the changed files
-#     other than a normal text "sort" (top level first?)
-#     (group directories?) (.h before .c?)
-#   Leave a diff file behind if asked, but in unified format.
-#   Handle C++ and yacc source files too (other languages?).
-#   Help merge when there are ChangeLog conflicts or if there's
-#     already a partly written ChangeLog entry.
-#   Find appropriate ChangeLog to edit for each changed file
-#     instead of always using ChangeLog in current directory.
-#   Add command line option to put the ChangeLog into a separate
-#     file or just spew it out stdout.
-#   Figure out how to allow -z options from .cvsrc to work without
-#     letting other bad options work. Currently the -f disables
-#     everything from the .cvsrc.
-#   Add CVS version numbers for each file too (can't do that until
-#     the changes are checked in, though).
-#   Work around diff stupidity where deleting a function that starts
-#     with a comment makes diff think that the following function
-#     has been changed (if the following function starts with a comment
-#     with the same first line, such as /**)
-#   Work around diff stupidity where deleting an entire function and
-#     the blank lines before it makes diff think you've changed the
-#     previous function.
-
-use diagnostics;
-use strict;
-
-use English;
-use Text::Wrap;
-
-# Check for cvs or svn system
-my $command;
-if (-e "CVS/Root")
-  {
-    $command = "cvs";
-  }
-elsif (-e ".svn/text-base/README.svn-base")
-  {
-    $command = "svn";
-  }
-else
-  {
-    die "There is not known revision system.\n"
-  }
-
-# Read the old change log file.
-# It's less efficient to read the whole thing into memory than it would be
-# to read it while we prepend to it later, but I like doing this part first.
-if ($command eq "cvs")
-  {
-     print STDERR "  Updating ChangeLog from cvs repository.\n";
-     open ERRORS, "cvs update ChangeLog |" or die "The cvs update of ChangeLog failed: $OS_ERROR.\n";
-  }
-else
-  {
-     print STDERR "  Updating ChangeLog from svn repository.\n";
-     open ERRORS, "svn update ChangeLog |" or die "The cvs update of ChangeLog failed: $OS_ERROR.\n";
-  }
-print STDERR "    $ARG" while <ERRORS>;
-close ERRORS;
-open OLD_CHANGE_LOG, "ChangeLog" or die "Could not open ChangeLog file: $OS_ERROR.\n";
-my @old_change_log = <OLD_CHANGE_LOG>;
-close OLD_CHANGE_LOG;
-
-# For each file, build a list of modified lines.
-# Use line numbers from the "after" side of each diff.
-my %changed_line_ranges;
-my $file;
-if ($command eq "cvs")
-  {
-    print STDERR "  Running cvs diff to find changes.\n";
-    open DIFF, "cvs -fq diff -N |" or die "The cvs diff failed: $OS_ERROR.\n";
-  }
-else
-  {
-    print STDERR "  Running svn diff to find changes.\n";
-    open DIFF, "svn --non-interactive diff --diff-cmd diff -x \"-b\" |" or die "The cvs diff failed: $OS_ERROR.\n";
-  }
-
-while (<DIFF>)
-  {
-    $file = $1 if /^Index: (\S+)$/;
-    if (defined $file
-        and $file ne "ChangeLog"
-        and (/^\d+(,\d+)?[acd](\d+)(,(\d+))?/ or /^Binary files/) )
-      {
-        push @{$changed_line_ranges{$file}}, [ $2, $4 || $2 ];
-      }
-  }
-close DIFF;
-if (!%changed_line_ranges)
-  {
-    print STDERR "  No changes found.\n";
-    exit;
-  }
-
-# For each ".c" file, convert line range to function list.
-print STDERR "  Extracting affected function names from C source files.\n";
-my %function_lists;
-foreach my $file (keys %changed_line_ranges)
-  {
-    # An empty function list still indicates that something changed.
-    $function_lists{$file} = "";
-
-    # Only look for function names in .c files.
-    next unless $file =~ /\.(c|java|cs)/;
-
-    # Find all the functions in the file.
-    open SOURCE, $file or next;
-    my @function_ranges = get_function_line_ranges(\*SOURCE, $file);
-    close SOURCE;
-
-    # Find all the modified functions.
-    my @functions;
-    my %saw_function;
-    my @change_ranges = (@{$changed_line_ranges{$file}}, []);
-    my @change_range = (0, 0);
-    FUNCTION: foreach my $function_range_ref (@function_ranges)
-      {
-        my @function_range = @$function_range_ref;
-
-        # Advance to successive change ranges.
-        for (;; @change_range = @{shift @change_ranges})
-          {
-            last FUNCTION unless @change_range;
-
-            # If past this function, move on to the next one.
-            next FUNCTION if $change_range[0] > $function_range[1];
-
-            # If an overlap with this function range, record the function name.
-            if ($change_range[1] >= $function_range[0]
-                and $change_range[0] <= $function_range[1])
-              {
-                if (!$saw_function{$function_range[2]})
-                  {
-                    $saw_function{$function_range[2]} = 1;
-                    push @functions, $function_range[2];
-                  }
-                next FUNCTION;
-              }
-          }
-      }
-
-    # Format the list of functions now.
-    $function_lists{$file} = " (" . join("), (", @functions) . "):" if @functions;
-  }
-
-# Write out a new ChangeLog file.
-print STDERR "  Editing the ChangeLog file.\n";
-my $date = sprintf "%d-%02d-%02d",
-  1900 + (localtime $BASETIME)[5], # year
-  1 + (localtime $BASETIME)[4], # month
-  (localtime $BASETIME)[3]; # day within month
-my $name = $ENV{CHANGE_LOG_NAME}
-  || $ENV{REAL_NAME}
-  || (getpwuid $REAL_USER_ID)[6]
-  || "set REAL_NAME environment variable";
-my $email_address = $ENV{CHANGE_LOG_EMAIL_ADDRESS}
-  || $ENV{EMAIL_ADDRESS}
-  || "set EMAIL_ADDRESS environment variable";
-open CHANGE_LOG, "> ChangeLog" or die "Could not write ChangeLog\n.";
-print CHANGE_LOG "$date  $name  <$email_address>\n\n";
-print CHANGE_LOG "\treviewed by: <delete if not using a buddy>\n\n";
-foreach my $file (sort keys %function_lists)
-  {
-    my $lines = wrap("\t", "\t", "XX$file:$function_lists{$file}");
-    $lines =~ s/^\tXX/\t* /;
-    print CHANGE_LOG "$lines\n";
-  }
-print CHANGE_LOG "\n", @old_change_log;
-close CHANGE_LOG;
-
-# Done.
-print STDERR "  Done editing ChangeLog.\n";
-exit;
-
-
-
-sub get_function_line_ranges
-  {
-    my ($file_handle, $file_name) = @_;
-
-    if ($file_name =~ /\.c$/) {
-        return get_function_line_ranges_for_c ($file_handle, $file_name);
-    } elsif ($file_name =~ /\.java$/) {
-        return get_function_line_ranges_for_java ($file_handle, $file_name);
-    } elsif ($file_name =~ /\.cs$/) {
-	#FIXME write a function to extract from .cs files
-        return get_function_line_ranges_for_java ($file_handle, $file_name);
-    }
-    return ();
-  }
-
-# Read a file and get all the line ranges of the things that look like C functions.
-# A function name is the last word before an open parenthesis before the outer
-# level open brace. A function starts at the first character after the last close
-# brace or semicolon before the function name and ends at the close brace.
-# Comment handling is simple-minded but will work for all but pathological cases.
-#
-# Result is a list of triples: [ start_line, end_line, function_name ].
-
-sub get_function_line_ranges_for_c
-  {
-    my ($file_handle, $file_name) = @_;
-
-    my @ranges;
-
-    my $in_comment = 0;
-    my $in_macro = 0;
-    my $in_parentheses = 0;
-    my $in_braces = 0;
-
-    my $word = "";
-
-    my $potential_start = 0;
-    my $potential_name = "";
-
-    my $start = 0;
-    my $name = "";
-
-    while (<$file_handle>)
-      {
-        # Handle continued multi-line comment.
-        if ($in_comment)
-          {
-            next unless s-.*\*/--;
-            $in_comment = 0;
-          }
-
-        # Handle continued macro.
-        if ($in_macro)
-          {
-            $in_macro = 0 unless /\\$/;
-            next;
-          }
-
-        # Handle start of macro (or any preprocessor directive).
-        if (/^\s*\#/)
-          {
-            $in_macro = 1 if /^([^\\]|\\.)*\\$/;
-            next;
-          }
-
-        # Handle comments and quoted text.
-        while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy
-          {
-            my $match = $1;
-            if ($match eq "/*")
-              {
-                if (!s-/\*.*?\*/--)
-                  {
-                    s-/\*.*--;
-                    $in_comment = 1;
-                  }
-              }
-            elsif ($match eq "//")
-              {
-                s-//.*--;
-              }
-            else # ' or "
-              {
-                if (!s-$match([^\\]|\\.)*?$match--)
-                  {
-                    warn "mismatched quotes at line $INPUT_LINE_NUMBER in $file_name\n";
-                    s-$match.*--;
-                  }
-              }
-          }
-
-        # Find function names.
-        while (m-(\w+|[(){};])-g)
-          {
-            # Open parenthesis.
-            if ($1 eq "(")
-              {
-                $potential_name = $word unless $in_parentheses;
-                $in_parentheses++;
-                next;
-              }
-
-            # Close parenthesis.
-            if ($1 eq ")")
-              {
-                $in_parentheses--;
-                next;
-              }
-
-            # Open brace.
-            if ($1 eq "{")
-              {
-                # Promote potiential name to real function name at the
-                # start of the outer level set of braces (function body?).
-                if (!$in_braces and $potential_start)
-                  {
-                    $start = $potential_start;
-                    $name = $potential_name;
-                  }
-
-                $in_braces++;
-                next;
-              }
-
-            # Close brace.
-            if ($1 eq "}")
-              {
-                $in_braces--;
-
-                # End of an outer level set of braces.
-                # This could be a function body.
-                if (!$in_braces and $name)
-                  {
-                    push @ranges, [ $start, $INPUT_LINE_NUMBER, $name ];
-                    $name = "";
-                  }
-
-                $potential_start = 0;
-                $potential_name = "";
-                next;
-              }
-
-            # Semicolon.
-            if ($1 eq ";")
-              {
-                $potential_start = 0;
-                $potential_name = "";
-                next;
-              }
-
-            # Word.
-            $word = $1;
-            if (!$in_parentheses)
-              {
-                $potential_start = 0;
-                $potential_name = "";
-              }
-            if (!$potential_start)
-              {
-                $potential_start = $INPUT_LINE_NUMBER;
-                $potential_name = "";
-              }
-          }
-      }
-
-    warn "mismatched braces in $file_name\n" if $in_braces;
-    warn "mismatched parentheses in $file_name\n" if $in_parentheses;
-
-    return @ranges;
-  }
-
-
-
-# Read a file and get all the line ranges of the things that look like Java
-# classes, interfaces and methods.
-#
-# A class or interface name is the word that immediately follows
-# `class' or `interface' when followed by an open curly brace and not
-# a semicolon. It can appear at the top level, or inside another class
-# or interface block, but not inside a function block
-#
-# A class or interface starts at the first character after the first close
-# brace or after the function name and ends at the close brace.
-#
-# A function name is the last word before an open parenthesis before
-# an open brace rather than a semicolon. It can appear at top level or
-# inside a class or interface block, but not inside a function block.
-#
-# A function starts at the first character after the first close
-# brace or after the function name and ends at the close brace.
-#
-# Comment handling is simple-minded but will work for all but pathological cases.
-#
-# Result is a list of triples: [ start_line, end_line, function_name ].
-
-sub get_function_line_ranges_for_java
-  {
-    my ($file_handle, $file_name) = @_;
-
-    my @current_scopes;
-
-    my @ranges;
-
-    my $in_comment = 0;
-    my $in_macro = 0;
-    my $in_parentheses = 0;
-    my $in_braces = 0;
-    my $in_non_block_braces = 0;
-    my $class_or_interface_just_seen = 0;
-
-    my $word = "";
-
-    my $potential_start = 0;
-    my $potential_name = "";
-    my $potential_name_is_class_or_interface = 0;
-
-    my $start = 0;
-    my $name = "";
-    my $current_name_is_class_or_interface = 0;
-
-    while (<$file_handle>)
-      {
-        # Handle continued multi-line comment.
-        if ($in_comment)
-          {
-            next unless s-.*\*/--;
-            $in_comment = 0;
-          }
-
-        # Handle continued macro.
-        if ($in_macro)
-          {
-            $in_macro = 0 unless /\\$/;
-            next;
-          }
-
-        # Handle start of macro (or any preprocessor directive).
-        if (/^\s*\#/)
-          {
-            $in_macro = 1 if /^([^\\]|\\.)*\\$/;
-            next;
-          }
-
-        # Handle comments and quoted text.
-        while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy
-          {
-            my $match = $1;
-            if ($match eq "/*")
-              {
-                if (!s-/\*.*?\*/--)
-                  {
-                    s-/\*.*--;
-                    $in_comment = 1;
-                  }
-              }
-            elsif ($match eq "//")
-              {
-                s-//.*--;
-              }
-            else # ' or "
-              {
-                if (!s-$match([^\\]|\\.)*?$match--)
-                  {
-                    warn "mismatched quotes at line $INPUT_LINE_NUMBER in $file_name\n";
-                    s-$match.*--;
-                  }
-              }
-          }
-
-        # Find function names.
-        while (m-(\w+|[(){};])-g)
-          {
-            # Open parenthesis.
-            if ($1 eq "(")
-              {
-                if (!$in_parentheses) {
-                    $potential_name = $word;
-                    $potential_name_is_class_or_interface = 0;
-                }
-                $in_parentheses++;
-                next;
-              }
-
-            # Close parenthesis.
-            if ($1 eq ")")
-              {
-                $in_parentheses--;
-                next;
-              }
-
-            # Open brace.
-            if ($1 eq "{")
-              {
-                # Promote potiential name to real function name at the
-                # start of the outer level set of braces (function/class/interface body?).
-                if (!$in_non_block_braces
-                    and (!$in_braces or $current_name_is_class_or_interface)
-                    and $potential_start)
-                  {
-                    if ($name)
-                      {
-                          push @ranges, [ $start, ($INPUT_LINE_NUMBER - 1),
-                                          join ('.', @current_scopes) ];
-                      }
-
-
-                    $current_name_is_class_or_interface = $potential_name_is_class_or_interface;
-
-                    $start = $potential_start;
-                    $name = $potential_name;
-
-                    push (@current_scopes, $name);
-                  } else {
-                      $in_non_block_braces++;
-                  }
-
-                $potential_name = "";
-                $potential_start = 0;
-
-                $in_braces++;
-                next;
-              }
-
-            # Close brace.
-            if ($1 eq "}")
-              {
-                $in_braces--;
-
-                # End of an outer level set of braces.
-                # This could be a function body.
-                if (!$in_non_block_braces)
-                  {
-                    if ($name)
-                      {
-                        push @ranges, [ $start, $INPUT_LINE_NUMBER,
-                                        join ('.', @current_scopes) ];
-
-                        pop (@current_scopes);
-
-                        if (@current_scopes)
-                          {
-                            $current_name_is_class_or_interface = 1;
-
-                            $start = $INPUT_LINE_NUMBER + 1;
-                            $name =  $current_scopes[$#current_scopes-1];
-                          }
-                        else
-                          {
-                            $current_name_is_class_or_interface = 0;
-                            $start = 0;
-                            $name =  "";
-                          }
-                    }
-                  }
-                else
-                  {
-                    $in_non_block_braces-- if $in_non_block_braces;
-                  }
-
-                $potential_start = 0;
-                $potential_name = "";
-                next;
-              }
-
-            # Semicolon.
-            if ($1 eq ";")
-              {
-                $potential_start = 0;
-                $potential_name = "";
-                next;
-              }
-
-            if ($1 eq "class" or $1 eq "interface") {
-                $class_or_interface_just_seen = 1;
-                next;
-            }
-
-            # Word.
-            $word = $1;
-            if (!$in_parentheses)
-              {
-                if ($class_or_interface_just_seen) {
-                    $potential_name = $word;
-                    $potential_start = $INPUT_LINE_NUMBER;
-                    $class_or_interface_just_seen = 0;
-                    $potential_name_is_class_or_interface = 1;
-                    next;
-                }
-              }
-            if (!$potential_start)
-              {
-                $potential_start = $INPUT_LINE_NUMBER;
-                $potential_name = "";
-              }
-            $class_or_interface_just_seen = 0;
-          }
-      }
-
-    warn "mismatched braces in $file_name\n" if $in_braces;
-    warn "mismatched parentheses in $file_name\n" if $in_parentheses;
-
-    return @ranges;
-  }