Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Stuart Buchanan -- Monday 02 June 2008: ... and here's the patch, based on Fred's original patch. Assuming it passes muster, could someone review and commit please? I fixed the bug[1] and committed it, thanks Fred Stuart! Though Fred's way to display the entries in upper case hides the ugly case inconsistency, I kept your approach, since upper case text takes more space and is a bit harder to read. I'll contact Robin and ask if he sees a way to fix apt.dat. I also added a leading space to all entries, so you can use a space in the search string to mark word boundaries. Searching for wat will return Waterloo and Clearwater, while wat will not return Clearwater. m. [1] should be filter.size() in ct.toupper((char *) filter.data(), (char *)filter.data() + _filter.size()); - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
--- On Sun, 1/6/08, Frederic Bouvier wrote: I confirm there in no strcasestr or equivalent in MS runtime. The patch below should be portable, although more convoluted. From reading the patch, I don't think this does quite what we want either. My reading is that this ensures that the identifier of the airport is in upper case. However, thanks for pointing out another approach to the problem. What we really want is to ensure that any search is completely case-insensitive. For example, apt.dat contains the following lines: 1 400 1 1 KLVK LIVERMORE MUNI 1 425 0 1 4AK2 Livengood Camp 13982 0 0 LIVD Dobbiaco Currently, searching for LIV returns the first and last lines, while searching for Livermore returns nothing, despite being what most people would search for. I think a use searching for liv would expect to see all the results above, and more. One issue that is worth discussion is that if we make the search completely case-insensitive, we obviously increase the number of results returned. In the example above, searching for liv would return a total of 54 results. A much less unique string, such as san would return over 400. Note that this assumes that the user has the entire world scenery installed, which is pretty unlikely. Nevertheless, I think these are acceptable numbers for a 3 character string. The user can easily perform a more specific search on receiving a large number of results. I will continue looking at this, though if anyone else would like to jump in with suggestions, that would be very welcome. -Stuart __ Sent from Yahoo! Mail. A Smarter Email http://uk.docs.yahoo.com/nowyoucan.html - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
--- On Mon, 2/6/08, Melchior FRANZ wrote: * Stuart Buchanan -- Monday 02 June 2008: Nevertheless, I think these are acceptable numbers for a 3 character string. The user can easily perform a more specific search on receiving a large number of results. As I told on IRC already, the current case-sensitive behavior wasn't an accident or laziness. I must have missed that. I have not been paying enough attention to the IRC channel when logged on recently. My apologies. BTW: that ICAO codes are output in parentheses is also not just a cosmetic issue: this was done to allow searching for all French airports with (LF, for (almost) all Austrian military airports with (LOX etc. Thanks for pointing that out. I will ensure that this behaviour is unaffected by any changes. -Stuart __ Sent from Yahoo! Mail. A Smarter Email http://uk.docs.yahoo.com/nowyoucan.html - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
Am Montag, 2. Juni 2008 schrieb Melchior FRANZ: * Stuart Buchanan -- Monday 02 June 2008: Nevertheless, I think these are acceptable numbers for a 3 character string. The user can easily perform a more specific search on receiving a large number of results. As I told on IRC already, the current case-sensitive behavior wasn't an accident or laziness. It allowed a more precise search string with less hits. This seemed useful at times where airport names were consistently and correctly capitalized. Unfortunately, current apt.dat is a complete mess in this regard, so case-sensitivity turned into a disadvantage, and I agree that case-insensitivity is now desirable. (Well, fixing apt.dat would be even better, but not in our responsibility.) Maybe a litte checkbox named Case sensitive search might give the user the freedom of choice? This adds one option without dropping the other. Torsten - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Torsten Dreyer -- Tuesday 03 June 2008: Maybe a litte checkbox named Case sensitive search might give the user the freedom of choice? This adds one option without dropping the other. Widgets are associated with one single property, and they read from it after getting a dialog-update and write to it after getting a dialog-apply. The former is used for sending the search expression to the widget, the latter for returning the selected entry. So to add a widget config option, one would have to encode that in the search expression, for example by (optionally) setting a non-ASCII character at the first position via some embedded Nasal. But that's a bit ugly, and I'm not sure if it's worth it. Case-insensitive ought to be enough for anybody. :-) m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
--- On Mon, 2/6/08, Stuart Buchanan wrote: I will continue looking at this, though if anyone else would like to jump in with suggestions, that would be very welcome. ... and here's the patch, based on Fred's original patch. Assuming it passes muster, could someone review and commit please? -Stuart Index: AirportList.cxx === RCS file: /var/cvs/FlightGear-0.9/source/src/GUI/AirportList.cxx,v retrieving revision 1.18 diff -u -p -r1.18 AirportList.cxx --- AirportList.cxx 11 Mar 2008 15:58:57 - 1.18 +++ AirportList.cxx 2 Jun 2008 21:05:01 - @@ -1,4 +1,4 @@ - +#include locale #include Main/globals.hxx #include Airports/simple.hxx @@ -22,6 +22,7 @@ AirportList::~AirportList () void AirportList::create_list () { +const std::ctypechar ct = std::use_facetstd::ctypechar (std::locale() ); int num_apt = _airports-size(); char **content = new char *[num_apt + 1]; @@ -30,8 +31,13 @@ AirportList::create_list () const FGAirport *apt = _airports-getAirport(i); STD::string entry(apt-getName() +( + apt-getId() + ')'); -if (!_filter.empty() entry.find(_filter) == STD::string::npos) +if (!_filter.empty()) { + // Perform filter check case-insensitively + std::string cientry(apt-getName() +( + apt-getId() + ')'); + ct.toupper( (char *) cientry.data(), (char *) cientry.data() + cientry.size() ); + if (cientry.find(_filter) == std::string::npos) continue; +} content[n] = new char[entry.size() + 1]; strcpy(content[n], entry.c_str()); @@ -60,7 +66,12 @@ AirportList::destroy_list () void AirportList::setValue (const char *s) { -STD::string filter(s); +std::string filter(s); +const std::ctypechar ct = std::use_facetstd::ctypechar (std::locale() ); + +// convert filter to upper-case for case-insensitive matching +ct.toupper( (char *) filter.data(), (char *) filter.data() + _filter.size() ); + if (filter != _filter) { _filter = filter; create_list(); Index: AirportList.hxx === RCS file: /var/cvs/FlightGear-0.9/source/src/GUI/AirportList.hxx,v retrieving revision 1.7 diff -u -p -r1.7 AirportList.hxx --- AirportList.hxx 11 Mar 2008 15:58:57 - 1.7 +++ AirportList.hxx 2 Jun 2008 21:05:01 - @@ -9,10 +9,6 @@ #include plib/puAux.h #include dialog.hxx - - -SG_USING_STD(string); - class FGAirportList; class AirportList : public puaList, public GUI_ID @@ -28,7 +24,7 @@ class AirportList : public puaList, publ private: FGAirportList * _airports; char ** _content; -STD::string _filter; +std::string _filter; }; #endif // __AIRPORTLIST_HXX __ Sent from Yahoo! Mail. A Smarter Email http://uk.docs.yahoo.com/nowyoucan.html - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Stuart Buchanan -- Monday 02 June 2008: Assuming it passes muster, [...] It doesn't. You are adding 2-space spaghetti code indentation to a file that uses 4 spaces. m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
Torsten Dreyer -- Tuesday 03 June 2008: Maybe a litte checkbox named Case sensitive search might give the user the freedom of choice? This adds one option without dropping the other. On Mon, Jun 2, 2008 at 4:07 PM, Melchior FRANZ wrote: Widgets are associated with one single property, and they read from it after getting a dialog-update and write to it after getting a dialog-apply. The former is used for sending the search expression to the widget, the latter for returning the selected entry. So to add a widget config option, one would have to encode that in the search expression, for example by (optionally) setting a non-ASCII character at the first position via some embedded Nasal. But that's a bit ugly, and I'm not sure if it's worth it. Case-insensitive ought to be enough for anybody. :-) I may be completely misunderstanding this whole thread, but could we add another widget to the search dialog window that is tied to a boolean property. Then the search function could check the state of this value when it searches to control the case sensitivity behavior. Regards, Curt. -- Curtis Olson: http://baron.flightgear.org/~curt/ - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Curtis Olson -- Monday 02 June 2008: I may be completely misunderstanding this whole thread, but could we add another widget to the search dialog window that is tied to a boolean property. We could, but it would IMHO also be a bit unclean, as it would influence all airport-search widgets. (Sure, we use only one, but that's not the point.) And before we do anything like that we should first decide if we *really* want and need the case sensitivity configurable. Just adding checkboxes for the sake of it doesn't make dialogs better. This rings my bloat-bell. :-} m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Melchior FRANZ -- Monday 02 June 2008: And before we do anything like that we should first decide if we *really* want and need the case sensitivity configurable. ... especially considering that we are having the discussion exactly because case-sensitivity turned out to be useless given the bad state of apt.dat. So, if it's useless, why make it an option? :-) m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
On Mon, Jun 2, 2008 at 4:55 PM, Melchior FRANZ [EMAIL PROTECTED] wrote: * Melchior FRANZ -- Monday 02 June 2008: And before we do anything like that we should first decide if we *really* want and need the case sensitivity configurable. ... especially considering that we are having the discussion exactly because case-sensitivity turned out to be useless given the bad state of apt.dat. So, if it's useless, why make it an option? :-) Well assuming that we have agreed to switch over to a case insensitive search, that it's hard to disagree with you. :-) Curt. -- Curtis Olson: http://baron.flightgear.org/~curt/ - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Curtis Olson -- Tuesday 03 June 2008: Well assuming that we have agreed to switch over to a case insensitive search, I think we have. Takes another hour until I have compiled OSG 2.5.1 and the newest sg/fg changes, but then I'll commit Stuart's patch (after having fixed indendation and random spaces, of course :-). For those not fully understanding the issue yet, here's a little illustration: If I use the following quite useful shell function ... apt() { LANG=en_US zgrep ^1 $FG_ROOT/Airports/apt.dat.gz|sed -r 's,^..{13},,'|egrep -i $* ; } like so: $ apt # normally I'd write e.g.apt ^LO or apt Dallas then I get a list of all airports, and a part of it looks like this: YWTL Waterloo CYKF WATERLOO KALO WATERLOO RGNL 37NE Watermeier MA97 Waters KART WATERTOWN INTL KRYV Watertown Muni KATY WATERTOWN RGNL 2S5 Waterville CCW3 Waterville Kings Co Muni KWVL WATERVILLE ROBERT LAFLEUR 40C Watervliet Municipal S25 WATFORD CITY MUNI So a case-sensitive search for Wat would give me an unpredictable random result. There's no rule for when names are capitalized or versal. This is not suited to find a particular airport. Of course, we could modify the names when reading in apt.dat.gz, but that's a bit tricky, too. Some things don't make sense when auto-capitalized: AB (Airbase) shouldn't become Ab, for example. m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
* Stuart Buchanan -- Saturday 31 May 2008: +if (!_filter.empty() (strcasestr(entry.c_str(), _filter.c_str()) == NULL)) quote from 'man strcasestr': The strcasestr() function is a non-standard extension. I doubt that it's available on all supported platforms. m. - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
Re: [Flightgear-devel] Patch to perform airport searches case-insensitively
Melchior FRANZ a écrit : * Stuart Buchanan -- Saturday 31 May 2008: +if (!_filter.empty() (strcasestr(entry.c_str(), _filter.c_str()) == NULL)) quote from 'man strcasestr': The strcasestr() function is a non-standard extension. I doubt that it's available on all supported platforms. I confirm there in no strcasestr or equivalent in MS runtime. The patch below should be portable, although more convoluted. -Fred cvs -z4 -w -q diff -u -wb -- src\GUI\AirportList.cxx src\GUI\AirportList.hxx (in directory I:\Devel\FlightGear\) Index: src/GUI/AirportList.cxx === RCS file: /var/cvs/FlightGear-0.9/FlightGear/src/GUI/AirportList.cxx,v retrieving revision 1.18 diff -u -w -b -r1.18 AirportList.cxx --- src/GUI/AirportList.cxx11 Mar 2008 15:58:57 -1.18 +++ src/GUI/AirportList.cxx1 Jun 2008 10:21:57 - @@ -2,6 +2,8 @@ #include Main/globals.hxx #include Airports/simple.hxx +#include locale + #include AirportList.hxx @@ -25,12 +27,15 @@ int num_apt = _airports-size(); char **content = new char *[num_apt + 1]; +const std::ctypechar ct = std::use_facetstd::ctypechar ( std::locale() ); int n = 0; for (int i = 0; i num_apt; i++) { const FGAirport *apt = _airports-getAirport(i); -STD::string entry(apt-getName() +( + apt-getId() + ')'); +std::string aid = apt-getId(); +ct.toupper( (char *)aid.data(), (char *)aid.data()+aid.size() ); +std::string entry(apt-getName() +( + aid + ')'); -if (!_filter.empty() entry.find(_filter) == STD::string::npos) +if (!_filter.empty() entry.find(_filter) == std::string::npos) continue; content[n] = new char[entry.size() + 1]; @@ -60,7 +65,8 @@ void AirportList::setValue (const char *s) { -STD::string filter(s); +std::string filter(s); +std::use_facetstd::ctypechar ( std::locale() ).toupper( (char *)filter.data(), (char *)filter.data()+filter.size() ); if (filter != _filter) { _filter = filter; create_list(); Index: src/GUI/AirportList.hxx === RCS file: /var/cvs/FlightGear-0.9/FlightGear/src/GUI/AirportList.hxx,v retrieving revision 1.7 diff -u -w -b -r1.7 AirportList.hxx --- src/GUI/AirportList.hxx11 Mar 2008 15:58:57 -1.7 +++ src/GUI/AirportList.hxx1 Jun 2008 10:08:17 - @@ -9,10 +9,6 @@ #include plib/puAux.h #include dialog.hxx - - -SG_USING_STD(string); - class FGAirportList; class AirportList : public puaList, public GUI_ID @@ -28,7 +24,7 @@ private: FGAirportList * _airports; char ** _content; -STD::string _filter; +std::string _filter; }; #endif // __AIRPORTLIST_HXX -- Frédéric Bouvier http://my.fotolia.com/frfoto/ Photo gallery http://fgsd.sourceforge.net/FlightGear Scenery Designer - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel
[Flightgear-devel] Patch to perform airport searches case-insensitively
Hi All, Someone on the Forum (or was it here?) mentioned a problem where they couldn't use the Airport Search dialog easily because some airports in apt.dat are named in mixed case while some are in all-caps. Rather than attempt to fix apt.dat (I'm not completely mad ;) ), I've created a small patch to our airport search function so that this search is done case-insensitively. I've done some minimal testing, and it at least appears to be functionally correct. However: a) As I'm sure many people are already aware, I'm not a very good C programmer, so there may be a better way to do this that I'm missing b) This uses the strcasestr() function, which is part of the GNU C library in string.h. What is the best way to check that such a function is available on all our platforms? -Stuart Index: AirportList.cxx === RCS file: /var/cvs/FlightGear-0.9/source/src/GUI/AirportList.cxx,v retrieving revision 1.18 diff -u -p -r1.18 AirportList.cxx --- AirportList.cxx 11 Mar 2008 15:58:57 - 1.18 +++ AirportList.cxx 31 May 2008 21:12:34 - @@ -30,7 +30,8 @@ AirportList::create_list () const FGAirport *apt = _airports-getAirport(i); STD::string entry(apt-getName() +( + apt-getId() + ')'); -if (!_filter.empty() entry.find(_filter) == STD::string::npos) +// Perform filter check case-insensitively +if (!_filter.empty() (strcasestr(entry.c_str(), _filter.c_str()) == NULL)) continue; content[n] = new char[entry.size() + 1]; __ Sent from Yahoo! Mail. A Smarter Email http://uk.docs.yahoo.com/nowyoucan.html - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/ ___ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel