langdrill-0.3/0040755000175000017500000000000007714454310011457 5ustar samsamlangdrill-0.3/Makefile0100644000175000017500000000060007341603725013112 0ustar samsam############################ # Language Drills # version 0.1.7 # Author: Ionutz Borcoman # , ############################ all: cd src && $(MAKE) all tarclean: cd src && $(MAKE) tarclean clean: cd src && $(MAKE) clean distclean: cd src && $(MAKE) distclean build: cd src && $(MAKE) build install: cd src && $(MAKE) install langdrill-0.3/AUTHORS0100644000175000017500000000016407341603725012527 0ustar samsamAuthors of langdrill. Ionutz Borcoman , Original program author. langdrill-0.3/BUGS0100644000175000017500000000327007341603725012143 0ustar samsamKnown bugs ( --: unsolved, -+ less important bugs, ++: solved ): ++ langdrill sigsegvs when negative values are introduced in "Setup->Possible Answers" field. reported by YAMAGUCHI Nobuyuki solved on 1998/12/12 -+ sigsegvs when you select a section with no keys. -+ the text of sense radio buttons is not correctly aligned. this should be solved at VDK level, not in my program, though. ++ program sigsegvs when a non-configuration file is loaded instead a valid one. solved on 1999/01/26 ++ program sigsegvs after pressing Start if a bad config file was founded. solved on 1999/01/26 ++ reload seems not to update the keys !?! Why ? on 1999/01/07 the problem seems to be solved. didn't do anything special for this. maybe it was no bug at all. ++ at reload the sense radio buttons are not correct set. solved on 1999/01/04 ++ the new gtk+ require a fontset now. solved on 1999/01/04 -+ because of using now a font set, the fonts can no more be changed at run time. -+ problems with clist when the clist is not visible: a. a warning at program ending if page "Solutions" was never viewed; b. selecting and deselecting some lessons when "Solutions" is not the active page and then moving to "Solutions" makes the scrolls not to be updated. Making a new selection when "Solutions" is active, clear and reload the clist, thus solving the problem. ++ langdrill has some problems for deciding when the desired number of good answer was done. I have to change the algo (by using a static variable and decrement it). hopefully solved on 1999/01/26. I will continue to test it. langdrill-0.3/COPYING0100644000175000017500000004310507341603725012514 0ustar samsam GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. langdrill-0.3/INSTALL0100644000175000017500000000041407341603725012506 0ustar samsam1. Install the VDK libs from http://www.guest.net/homepages/mmotta/VDKHome/index.htm 2. Run make in the directory where you have expanded the langdrill archive to compile the program $ make 3. Run it. $ ./langdrill or: $ ./langdrill lesson1.rj langdrill-0.3/NEWS0100644000175000017500000001236107714454277012172 0ustar samsam==================== New in langdrill 0.3 ==================== Uses Gtk2. ====================== New in langdrill 0.2.1 ====================== Now the LC_CTYPE and LC_MESSAGES must be set before running the program. For example, to use Japanese language and English in stock messages (like FileOpen messages) set these environmental variables: LC_CTYPE=ja_JP.ujis LC_MESSAGES=C You can also launch the langdrill by: LC_CTYPE=ja_JP.ujis LC_MESSAGES=C ./langdrill If you don't want to set these variables in you .profile (for instance). ======================== New in langdrill 0.2.0.3 ======================== Corrected bug in EventConnect. Still waiting for Mario to confirm the code breaking in VDKText. ======================== New in langdrill 0.2.0.2 ======================== Updated the default.drill and langdrill.rc ======================== New in langdrill 0.2.0.1 ======================== Added new number for debian version. Debian specific: compiled with gtk 1.2 and vdk 0.6.0. ====================== New in langdrill 0.2.0 ====================== Langdrill is now in freeze stage. :-) Now only the .drill files will be updated. Important changes: - added the simple quizz page. this page has a text box in which you are supposed to type the answer. Tested with skkinput and kinput2. I reccomend skkinput, but be carreful: langdrill sigsegvs when you try to close it and the skkinput was not closed. This looks like a bug in skkinput. - the langdrill now looks for langdrill.rc (name can be defined in Makefile) in your choosed configuration directory (for instance /etc) or in the home and current directory for .langdrill. Order for lookup is: current, home and finally configuration directory. - changed the name of some defines. - langdrill now knows what to do when you load a wrong configuration file. Actually, the new configuration file is considered only if it was loaded and parsed succesfully. (Jan. 26, 1999) ====================== New in langdrill 0.1.9 ====================== Changed the iconisation algo, as VDK knows now to handle this. Therefore the iconic.hh and iconic.cc were removed as that functionality is provided directly by VDK. (Jan. 22, 1999) Nothing new. Made this just to correct some errors wich I've made in working with the cvs. (Jan. 18, 1999) ====================== New in langdrill 0.1.8 ====================== Changed the "Start Button" to a CheckButton. Added more check buttons. Now the window can also be minimized, not only hiden. That's cool :-) Thank's to Pierre Hanser for posting these convenience functions on gtk-list some time ago. See iconic.* for additional info. (Jan. 18, 1998) ====================== New in langdrill 0.1.7 ====================== Added the timer page. This allows users to use the langdrill similar with a daemon: - you set the time spent in backgound; - eventually set the good answer needed for going background automaticaly (for this to take effect you also have to check the corresponding checkbox); - press the "Start Timer" button. Start use the langdrill. As long as the timer is working, trying to close the application will actually hide it. To stop it, you have to explicitly stop the timer first (by pressing the "Stop Timer"). I was forced to move the CList with words as the first page of the notebook to avoid sigsegvs. Ugly solution, but it works for now. (Jan. 17, 1999) ====================== New in langdrill 0.1.6 ====================== Deleted the entries for font names. Also the ones for Width and Height of controls. The Width and Height are still used (and you can set them in the .drill files), but the fontNames are no more supported. The "Words and Expressions" is named now "Quizzes". The "Possible Answers" entry was moved on the "Quizzes" (main) tabpage. A new tab page, "Solutions", was added. while the "Setup" page was deleted. The "Solutions" has a clist that shows all the words and their meaning from the selected lessons. The "Sense" frame, "Lessons" clist, "Start/Reset", "Reload" and "Load" buttons have been moved from the notebook on the main page. (Ian. 7, 1999) ====================== New in langdrill 0.1.5 ====================== There is now a "langrill.rc" file which contains the fontset info needed by gtk to correctly display Japanese. The code was simplified. Now Japanese is handled by gtk+, no more support from my account and I suspect you need a working locale. Till I discover how to set and load a fontset at runtime, fonts are no more changed dinamically. The sorce files used to do the Japanese parsing were removed. The coding system for Japanese was changed to ja/EUC as this is what GTK requires. (Ian. 4, 1999) The default input file is now "default.drill". "lesson1.rj" has been renamed to "romaji.drill". (Dec. 15, 1998) Simplified the input file. No more nead for lessonNr and lessonTitleXXX fields. langdrill scans now the input file and considers lessons all sections, excepting the "Application" one, which contain the general settings. (Dec. 14, 1998) Added Load/Reload button. Now the configuration file can be modified and the changes reloaded by clicking Reload. No more need for close/restart. Also, by clicking Load... a FileOpen dialog is opened and a new config file can be choosed. (Dec. 13, 1998) Changed the main section in "Application". langdrill-0.3/README0100644000175000017500000000065507341603725012344 0ustar samsamThis is langrill, a language drill program. It is used to test your vocabulary in foreign languages. It has some Japanese support included. http://borco-ei.eng.hokudai.ac.jp/~borco/vdk/langdrill.html Mail suggestions and bug reports to borco@borco-ei.eng.hokudai.ac.jp. This program is inspired from JavaDrill. However no code from JavaDrill was used. JavaDrill can be found at: http://www.righto.com/java/fonts/learn.html langdrill-0.3/THANKS0100644000175000017500000000051407341603725012371 0ustar samsamlangdrill was originally written by Ionutz Borcoman , It would not be what it is today without the invaluable help of these people: Mario Mota mmotta@guest.net (The author of VDK which made coding of langdrill a pleasure. Also tested and made sugestion to improve langdrill.) langdrill-0.3/TODO0100644000175000017500000000133407670651462012155 0ustar samsam(Code: --: todo, ++: done) -- Code beautification. (permamnent) -- Document with "doxygen" the code. (permamnent) -- Docment the program better, especially how to write the data files. ++ Simplify the input files by automaticaly detecting newly added lesson sections. ++ Load/Reload buttons to permit changing the definition file without restarting the application. -- Clean the memory allocated for the VDKFileTreeDialog after the window is closed. Now the memory is freed by the garbage collector at program termination. -- The Reload should not unselect the current selected lessons, but preserve the current selections. The Load and Reload should be changed not to start a new quizz set, eventually. langdrill-0.3/docs/0040755000175000017500000000000007670660436012420 5ustar samsamlangdrill-0.3/docs/langdrill.10100644000175000017500000000272007670660435014447 0ustar samsam.TH LANGDRILL 1 .\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection .\" other parms are allowed: see man(7), man(1) .SH NAME langdrill \- simple program to test your vocabulary in foreign languages .SH SYNOPSIS .B langdrill .I "[file]" .SH "DESCRIPTION" This manual page documents briefly the .BR langdrill commands. .B langdrill is a simple program for testing your vocabulary. It has complete support for internationalized text and can display languages such as Japanese, Hebrew, Russian and many more. The program was inspired by JavaDrill but the author (Ionutz Borcoman) thinks that langdrill has some improvements: while JavaDrill can handle one definition file at a time, langdrill can handle many definitions sections from a single file. .PP The default definition file for langdrill .I default.drill is located by default in one of the following directories: .HP .I /usr/share/langdrill .HP .I /usr/local/share/langdrill .PP depending on the system being Debian GNU/Linux or not. Adding a .I file on the command line, forces langdrill to use that file instead of the default one. .PP langdrill uses GTK 2 and VDK 2. .SH OPTIONS There are no options for langdrill, except the optional description .I file. .SH AUTHOR This manual page was written by Ionutz Borcoman for the Debian GNU/Linux distribution because the original program did not have a manual page. It is currently maintained by Sam Hocevar . langdrill-0.3/src/0040755000175000017500000000000007714454216012253 5ustar samsamlangdrill-0.3/src/Makefile0100644000175000017500000000360207670657351013717 0ustar samsam###### Files & Directories DESTDIR= MY_DEBIAN_SYSTEM= SRC = main.cc\ config.cc OBJ = main.o \ config.o TARGET = langdrill MAN_PAGE = ../docs/langdrill.1 DRILL_DEF = default.drill DRILL_SUP = romaji.drill french.drill DEF_FLAGS = -DTARGET='"$(TARGET)"' \ -DDRILL_DEF='"$(DRILL_DEF)"' \ -DDRILL_DIR='"$(DRILL_DIR)"' \ -I /usr/include/gtk-2.0/ ###### Test for Debian GNU/Linux # If your system is not Debian GNU/Linux please modify the values after # "else" statement. Modifying the values before else is useless, unless # you also set MY_DEBIAN_SYSTEM=1 ifeq ($(MY_DEBIAN_SYSTEM),1) MY_MESSAGE_OF_THE_DAY=">>" $(TARGET) compilled for Debian GNU/Linux system. "<<" DRILL_DIR=$(DESTDIR)/usr/share/langdrill BIN_DIR=$(DESTDIR)/usr/bin MAN_DIR=$(DESTDIR)/usr/share/man/man1 CFLAGS = -Wall `vdk-config-2 --cflags` $(DEF_FLAGS) else MY_MESSAGE_OF_THE_DAY=">>" $(TARGET) compilled for NON-Debian GNU/Linux system. "<<" DRILL_DIR=$(DESTDIR)/usr/local/share/langdrill BIN_DIR=$(DESTDIR)/usr/local/bin MAN_DIR=$(DESTDIR)/usr/local/man/man1 CFLAGS = -Wall -g `vdk-config-2 --cflags` $(DEF_FLAGS) endif CC = g++ LFLAGS = `vdk-config-2 --libs` ####### Implicit rules .SUFFIXES: .cc .cc.o: $(SRC) $(CC) $(CFLAGS) -c $*.cc -o $@ ####### Build rules all: $(TARGET) tarclean: rm -f $(TARGET) core clean: rm -f $(OBJ) distclean: clean rm -f $(TARGET) core *~ $(TARGET): tarclean $(OBJ) @echo $(MY_MESSAGE_OF_THE_DAY) $(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LFLAGS) run: tarclean $(OBJ) @echo $(MY_MESSAGE_OF_THE_DAY) $(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LFLAGS) ./$(TARGET) build: clean tarclean $(OBJ) @echo $(MY_MESSAGE_OF_THE_DAY) $(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LFLAGS) install: all install -d $(BIN_DIR) $(DRILL_DIR) $(MAN_DIR) install ./$(TARGET) $(BIN_DIR) install -m644 $(DRILL_DEF) $(DRILL_DIR) install -m644 $(MAN_PAGE) $(MAN_DIR) install -m644 $(DRILL_SUP) $(DRILL_DIR) langdrill-0.3/src/config.cc0100644000175000017500000002122007670650756014031 0ustar samsam/* * =========================== * langdrill: Language Drills * Version 0.1.5 * 12/1998 * =========================== * * Copyright (C) 1998, Ionutz Borcoman * Developed by Ionutz Borcoman , * * Many thanks to Mario Motta for the help given * during developing this program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.hh" #include ///////////////////////////////////////////// // // strdup_new: // // creates acopy of buff using op new. // returns a pointer to the new allocated // memory region. use delete to free // the memory. // ///////////////////////////////////////////// char *strdup_new(char * buff) { char *tmp = NULL; if(buff){ int len = strlen(buff) + 1; tmp = new char[len +1]; // copy buff, including the \0 memcpy(tmp,buff,len+1); } return tmp; } ///////////////////////////////////////////// // MyException: ///////////////////////////////////////////// MyException::MyException(int value, char *message) { _value = value; _message = strdup_new(message); } MyException::~MyException() { delete _message; } int MyException::Value() { return _value; } char * MyException::Message() const { return _message; } ///////////////////////////////////////////// // // MyKey: // // has a private buffer _value. can return // a copy of it or change its value. // convenient function for int values are // also provided. // ///////////////////////////////////////////// MyKey::MyKey(char *name, char *value) { _name = strdup_new(name); _value = strdup_new(value); } MyKey::MyKey(char *name, int value) { _name = strdup_new(name); _value = new char[MAX_CHARS_FOR_NUMBER]; sprintf( _value, "%i", value); } MyKey::~MyKey() { delete [] _name; delete [] _value; } char * MyKey::Get() const { return _value; } void MyKey::Set(char *value) { delete [] _value; _value = strdup_new(value); } int MyKey::GetInt() { return atoi(_value); } void MyKey::SetInt(int value) { delete [] _value; _value = new char[MAX_CHARS_FOR_NUMBER]; sprintf( _value, "%i", value); } char * MyKey::Name() const { return _name; } ///////////////////////////////////////////// // MySection ///////////////////////////////////////////// MySection::MySection(char *name) { // initialize an empty GSList _number = 0; _name = strdup_new(name); } MySection::~MySection() { delete [] _name; // delete the keys MyKeyListIter li(_list); while(li){ delete li.current(); li++; } } MyKey * MySection::Key(char *name) { MyKey *tmp; MyKeyListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0) return tmp; li++; } // char message[MAX_CHARS_FOR_MESSAGE]; // sprintf(message,"MySection::Key - key %s not found", name); // throw new MyException(4, message); return NULL; } void MySection::Add(char *name) { // check to see if we have this key MyKey *tmp; MyKeyListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0) return; li++; } tmp = new MyKey( name ); _list.add(tmp); _number++; } void MySection::Remove(char *name) { // check to see if we have this key MyKey *tmp; MyKeyListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0){ // we have found the key // we remove it from the list _list.remove(tmp); // we delete the key data delete tmp; // decrement number of keys _number--; return; } li++; } } int MySection::Number() { return _number; } char * MySection::Name() const { return _name; } ///////////////////////////////////////////// // MyConfigFile: ///////////////////////////////////////////// MyConfig::MyConfig(char *file) { // initialize an empty GSList _number = 0; _name = strdup_new(file); } MyConfig::~MyConfig() { delete [] _name; // delete the sections MySectionListIter li(_list); while(li){ delete li.current(); li++; } } MySection * MyConfig::Section(char *name) { MySection *tmp; MySectionListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0) return tmp; li++; } // char message[MAX_CHARS_FOR_MESSAGE]; // sprintf(message,"MyConfig::Section - section %s not found", name); // throw new MyException(5, message); return NULL; } void MyConfig::Add(char *name) { // check to see if we have this key MySection *tmp; MySectionListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0) return; li++; } tmp = new MySection( name ); _list.add(tmp); _number++; } void MyConfig::Remove(char *name) { // check to see if we have this key MySection *tmp; MySectionListIter li(_list); while(li){ tmp = li.current(); if(strcmp(tmp->Name(),name)==0){ // we have found the key // we remove it from the list _list.remove(tmp); // we delete the key data delete tmp; // decrement number of keys _number--; return; } li++; } } int MyConfig::Number() { return _number; } char * MyConfig::Name() const { return _name; } // the most important function: // it realises the parsing of the config void MyConfig::Read() { int lineNr = 0; char buff[MAX_CHARS_FOR_STRING]; char tmp1[MAX_CHARS_FOR_STRING]; char tmp2[MAX_CHARS_FOR_STRING]; char section[MAX_CHARS_FOR_STRING] = ""; char *p; char message[MAX_CHARS_FOR_MESSAGE]; iconv_t direct = (iconv_t)-1, reverse = (iconv_t)-1; ifstream in(_name); while(1){ in.getline(buff,MAX_CHARS_FOR_STRING); lineNr++; // comments support // ignore line if it starts with # or ; if(buff[0]=='#' || buff[0]==';') continue; if(buff[0]=='['){ // it is a section p = strchr(buff,']'); if(p && p > buff+1 ){ *p = '\0'; sprintf(section,"%s",buff+1); Add(section); }else{ // we didn't find the delimiter ']' sprintf(message, "MyConfig::Read [%s / line %d] didn't find the ']'", _name, lineNr); throw new MyException(1,message); } }else{ p = strrchr(buff,'='); if(p && p > buff+1 ){ // it is a key *p = '\0'; if(strcmp(section,"")){ if(!strcmp(buff,"directEncoding")){ direct = iconv_open("UTF-8", p+1); }else if(!strcmp(buff,"reverseEncoding")){ reverse = iconv_open("UTF-8", p+1); }else{ char *buff_key = buff, *buff_val = p+1; if(direct!=(iconv_t)-1 && strcmp(section,"Application")){ char *inbuf = buff_key, *outbuf = tmp1; size_t inbytes = strlen(buff_key), outbytes = 255; iconv(direct,&inbuf,&inbytes,&outbuf,&outbytes); iconv(direct,NULL,NULL,NULL,NULL); *outbuf = '\0'; buff_key = tmp1; } if(reverse!=(iconv_t)-1 && strcmp(section,"Application")){ char *inbuf = buff_val, *outbuf = tmp2; size_t inbytes = strlen(buff_val), outbytes = 255; iconv(reverse,&inbuf,&inbytes,&outbuf,&outbytes); iconv(reverse,NULL,NULL,NULL,NULL); *outbuf = '\0'; buff_val = tmp2; } Section(section)->Add(buff_key); Section(section)->Key(buff_key)->Set(buff_val); } }else{ // no section defined sprintf(message, "MyConfig::Read [%s / line %d] key with no section", _name, lineNr); throw new MyException(2,message); } } } if (in.eof()) return; if (!in.good()){ sprintf(message, "MyConfig::Read [%s / line %d] error in imput stream", _name, lineNr); throw new MyException(3,message); } } if(direct!=(iconv_t)-1) iconv_close(direct); if(reverse!=(iconv_t)-1) iconv_close(reverse); } langdrill-0.3/src/config.hh0100644000175000017500000000711207670644670014045 0ustar samsam/* * =========================== * langdrill: Language Drills * Version 0.1.5 * 12/1998 * =========================== * * Copyright (C) 1998, Ionutz Borcoman * Developed by Ionutz Borcoman , * * Many thanks to Mario Motta for the help given * during developing this program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __config__hh__ #define __config__hh__ #include #include #include #include #include #define MAX_CHARS_FOR_NUMBER 10 #define MAX_CHARS_FOR_STRING 255 #define MAX_CHARS_FOR_MESSAGE 255 #define eol '\n' class MyException; class MyKey; class MySection; typedef VDKList MyKeyList; typedef VDKListiterator MyKeyListIter; typedef VDKList MySectionList; typedef VDKListiterator MySectionListIter; ///////////////////////////////////////////// // // strdup_new: // // creates acopy of buff using op new. // returns a pointer to the new allocated // memory region. use delete to free // the memory. // ///////////////////////////////////////////// char *strdup_new(char * buff); ///////////////////////////////////////////// // MyException: ///////////////////////////////////////////// class MyException { int _value; char *_message; public: MyException(int value, char *message); ~MyException(); int Value(); char *Message() const; }; ///////////////////////////////////////////// // // MyKey: // // has a private buffer _value. can return // a copy of it or change its value. // convenient function for int values are // also provided. // ///////////////////////////////////////////// class MyKey { char *_value; char *_name; public: MyKey(char *name, char *value); MyKey(char *name, int value=0); ~MyKey(); // returns a pointer to the _value char *Get() const; void Set(char * value); // convenience functions int GetInt(); void SetInt(int value); char *Name() const; }; ///////////////////////////////////////////// // MySection ///////////////////////////////////////////// class MySection { char *_name; int _number; MyKeyList _list; public: MySection(char *name); ~MySection(); void Add(char *name); void Remove(char *name); // this will return a pointer to key MyKey *Key(char *name); int Number(); char *Name() const; MyKey *operator[](int n){ return _list[n]; } }; ///////////////////////////////////////////// // MyConfigFile: ///////////////////////////////////////////// class MyConfig { char *_name; int _number; // number of sections MySectionList _list; public: MyConfig(char *file); ~MyConfig(); void Add(char *name); void Remove(char *name); MySection *Section(char *name); int Number(); char *Name()const; void Read(); void Write( char *name); MySection *operator[](int n){ return _list[n]; } }; #endif langdrill-0.3/src/default.drill0100644000175000017500000005001407670650070014721 0ustar samsam[Application] sense=0 directSenseName=Japanese reverseSenseName=English # UTF-8 is the default encoding directEncoding=EUCJP reverseEncoding=UTF-8 quizzAnswerNr=8 hQuizz=40 wQuizz=300 # the timer value is given in minutes. # it represents the time between the automatical # activation of the langdrill. timer=10 # use this to set how many good answers the langdrill # waits till hides by itself. limitedAnswer must be 1 # for this to take effect limitedAnswerNr=25 limitedAnswers=1 # set to 1 if you want the window to be hidden when you # try to close it and the useTimer is 1 hideWindow=0 useTimer=1 [Hiragana] あ=a い=i う=u え=e お=o か=ka き=ki く=ku け=ke こ=ko さ=sa し=shi す=su せ=se そ=so た=ta ち=chi つ=tsu て=te と=to な=na に=ni ぬ=nu ね=ne の=no は=ha ひ=hi ふ=fu へ=he ほ=ho ま=ma み=mi む=mu め=me も=mo や=ya ゆ=yu よ=yo ら=ra り=ri る=ru れ=re ろ=ro わ=wa を=o (wo) ん=n [Katakana] ア=A イ=I ウ=U エ=E オ=O カ=KA キ=KI ク=KU ケ=KE コ=KO サ=SA シ=SHI ス=SU セ=SE ソ=SO タ=TA チ=CHI ツ=TSU テ=TE ト=TO ナ=NA ニ=NI ヌ=NU ネ=NE ノ=NO ハ=HA ヒ=HI フ=FU ヘ=HE ホ=HO マ=MA ミ=MI ム=MU メ=ME モ=MO ヤ=YA ユ=YU ヨ=YO ラ=RA リ=RI ル=RU レ=RE ロ=RO ワ=WA ヲ=O ン=N [Numbers] ぜろ=0 いち=1 に=2 さん=3 し / よん=4 ご=5 ろく=6 しち / なな=7 はち=8 く / きゅう=9 じゅう=10 じゅういち=11 じゅうに=12 じゅうさん=13 じゅうよん=14 じゅうご=15 じゅうろく=16 じゅうなな=17 じゅうはち=18 じゅうきゅう=19 にじゅう=20 にじゅういち=21 にじゅうに=22 ににじゅうさん=23 にじゅうよん=24 にじゅうご=25 にじゅうろく=26 にじゅうなな=27 にじゅうはち=28 にじゅうきゅう=29 さんじゅう=30 さんじゅういち=31 さんじゅうに=32 さんじゅうさん=33 さんじゅうよん=34 さんじゅうご=35 さんじゅうろく=36 さんじゅうなな=37 さんじゅうはち=38 さんじゅうきゅう=39 よんじゅう=40 ごじゅう=50 ろくじゅう=60 ななじゅう=70 はちじゅう=80 きゅうじゅう=90 ひゃく=100 にひゃく=200 さんびゃく=300 よんひゃく=400 ごひゃく=500 ろっぴゃく=600 ななひゃく=700 はっぴゃく=800 きゅうひゃく=900 せん=1000 にせん=2000 さんぜん=3000 よんせん=4000 ごせん=5000 ろくせん=6000 ななせん=7000 はっせん=8000 きゅうせん=9000 ひゃくまん=10000 [Time: Days of the week] げつようび [月曜日]=Monday かようび [火曜日]=Tuesday すいようび [水曜日]=Wednesday もくようび [木曜日]=Thursday きんようい [金曜日]=Friday どようび [土曜日]=Saturday にちようび [日曜日]=Sunday なんようび=What day of the week 日 (ひ)=sun; sunshine; day 曜日 (ようび)=day of the week [Time: Days of the month] ついたち=first day of the month ふつか=second, two days みっか=third, three days よっか=fourth, four days いつか=fifth, five days むいか=sixth, six days なのか=seventh, seven days ようか=eight, eight days ここのか=ninth, nine days とおか=tenth, ten days じゅうよっか=fourteenth, forteen days はつか=twentieth, twenty days にじゅうよっか=twenty fourth, twenty four days ーにち=-th day of the month, -days なんにち=which day of the month, how many days [Time: General] いつ=when いま=now ーじ=- o'clock ーふん(ーぷん)=- minutes はん=half past なんじ=what time なんぷん=how many minutes ごぜん=a.m., morning ごご=p.m., afternoon あさ=morning ひる=day time, noon ばん(よる)=night, evening おととい=the day before yesterday きのう=yesterday きょう=today あした=tomorrow あさって=the day after tomorrow けさ=this morning こんばん=tonight まいあさ=every morning まいばん=every night まいにち=every day 〜から=from ~ 〜まで=up to ~, untill ~ ーがつ=-th month of the year なんがつ=what month せんしゅう=last week こんしゅう=this week らいしゅう=next week せんげつ=last month こんげつ=this month らいげつ=next month きょねん=last year ことし=this year らいねん=next year 〜かい=~ times いちにち(1−にち)=one day (as a period of time) 〜じかん=~ hour (s) 〜しゅうかん=~ week (s) 〜かげつ=~ month (s) 〜ねん=~ year (s) どのくらい=how long, how many 〜ぐらい=about ~ (referring to an amount or period of time) それから=and, then (the next thing), furthermore ひま[な]=free time [Words: Lesson 1] わたし=I わたしたち=we あなた=you あのひと=that person, he, she みなさん=ladies and gentlemen, all of you せんせい=teacher, instructor けんしゅうせい=trainee 〜さん=Mr. Mrs. Miss だれ、どなた=who はい=yes いいえ=no でんき=electricity, electric light きかい=machinery じどうしゃ=automobile, car コンピューター=computer せんもん=speciality, specialization of study −さい=~ years old なんさい、おいくつ=how old にほん=Japan インド=India インドネシア=Indonesia かんこく=Korea ちゅうごく=China フィリピン=Philippines タイ=Thailand マレーシア=Malaysia 〜じん=a national of ~ おはよございます。=Good morning. はじめまして。=How do you do ? どうぞよろしく。=Nice to meet you. [Words: Lesson 2] これ=this (thing here) それ=that (thing near you) あれ=that (thing over there) この〜=this ~ (here) その〜=that ~ (near you) あの〜=that ~ (over you) ほん=book ざっし=magazine じしょ=dictionary ノート=notebook かみ=paper しんぶん=newspaper てがみ=letter えんぴつ=pencil ボールペン=ballpoint pen シャープペンシル=propelling pencil たばこ=tabacco, cigarette マッチ=match ライター=(chigarette) lighter はいざら=ashtray かぎ=key とけい=watch, clock かばん=bag, briefcase はこ=box テープレコーダー=tape recorder でんわ=telephone いす=chair つくえ=desk まど=window ドア=door ラジオ=radio テレビ=television カメラ=camera なん=what そう=so おねがいします。=Please. (when asking for a favour) どうぞ。=Please. Here you are. (when offering something) [どうも]ありがとございます。=Thank you [very much]. あ=Oh ! Ah ! (when suddenly remembering or noticing something) ちょっと=a little, for a moment まってください。=Please wait. ちがいます。=No, it isn't. You are wrong. [Words: Lesson 3] ここ=here, this place そこ=there, that place near you あそこ=that place over you どこ=where こちら=this way, polite of "koko" そちら=that way, polite of "soko" あちら=that way, polite of "asoko" どちら=which way, polite of "doko" きょうしつ=classroom しょくどう=dining hall, canteen おてあらい(トイレ)=toilet ロビー=lobby うけつけ=reception desk じむしょ=office へや=room にわ=garden [けんしゅう]センター=the center [for trainees] エレベーター=elevator, lift うち=house かいしゃ=company くに=country うりば=counter, department (in a department store) ーかい=-th floor ーえん=-yen いくら=how much ひゃく=a hundred せん=a thousand ーまん=ten thousand アメリカ=the United States イギリス=Britain, the United Kingdom [ちょっと]すみません。=Excuse me. どうも=Thank you. (alone expresses casual thanks) いらっしゃい[ませ]。=Welcome. May I help you ? (greeting to a customer or a guest) じゃ。=Well. O.K. [これ]をください。=Please give me [this]. [Words: Lesson 4] おきます=get up ねます=sleep, go to bed はたらきます=work やすみます=take a rest, take a holiday べんきょうします=study おわります=finish いま=now ーじ=- o'clock ーふん(ーぷん)=- minutes はん=half past なんじ=what time なんぷん=how many minutes ごぜん=a.m., morning ごご=p.m., afternoon あさ=morning ひる=day time, noon ばん(よる)=night, evening おととい=the day before yesterday きのう=yesterday きょう=today あした=tomorrow あさって=the day after tomorrow けさ=this morning こんばん=tonight まいあさ=every morning まいばん=every night まいにち=every day にほんご=the Japanese language べんきょう=study (noun) こうぎ=lecture けんがく=(factory) visit for study and observation 〜から=from ~ 〜まで=up to ~, untill ~ げつようび=Monday かようび=Tuesday すいようび=Wednesday もくようび=Thursday きんようい=Friday どようび=Saturday にちようび=Sunday なんようび=What day of the week そうですあ。=I see. (When making agreeable response) たいへんですね。=It must be hard for you (When expressing appreciation or sympathy) [Words: Lesson 5] いきます=go きます=come かえります=go home, return (vb.I) こうじょう=factory えき=railway station ぎんこう=bank びょういん=hospital デパート=department store スーパー=supermarket ほにや=bookshop 〜や=~ store ーがつ=-th month of the year なんがつ=what month ついたち=first day of the month ふつか=second, two days みっか=third, three days よっか=fourth, four days いつか=fifth, five days むいか=sixth, six days なのか=seventh, seven days ようか=eight, eight days ここのか=ninth, nine days とおか=tenth, ten days じゅうよっか=fourteenth, forteen days はつか=twentieth, twenty days にじゅうよっか=twenty fourth, twenty four days ーにち=-th day of the month, -days なんにち=which day of the month, how many days いつ=when せんしゅう=last week こんしゅう=this week らいしゅう=next week せんげつ=last month こんげつ=this month らいげつ=next month きょねん=last year ことし=this year らいねん=next year ひこうき=aircraft ふね=ship でんしゃ=electric train バス=bus タクシー=taxi ちかてつ=subway しんかんせん=the Shinkansen, the bullet train あるいて=on foot ひと=person ともだち=friend こいびと=sweethart ひとりで=alone ーばんせん=platform -, -th platform [Words: Lesson 6] たべます=eat のみます=drink すいます[たばこを〜]=smoke [a cigarette] かきます=write, draw, paint よみます=read ききます=listen みます=see, look at, watch かいます=buy とります[しゃしんを〜]=take [a photograph] じっしゅうします=do practical thing します[ピンポンを〜]=play [table tennis] します=do あいます[でんわを〜]=meet [a friend] ごはん=a meal, cooked rice あさごはん=breakfast ひるごはん=lunch ばんごはん=supper パン=bread たまご=egg にく=meat さかな=fish やさい=vegetable りんご=apple ぎゅうにゅう(ミルク)=milk おちゃ=green tea コーヒー=coffee こうちゃ=black tea ジュース=juice ビール=beer [おー]さけ=alcohol, Japanese rice wine みず=water ネクタイ=necktie シャツ=shirt くつ=shoes テープ(カセットテープ)=(cassette) tape フィルム=film しゃしん=photograph えいが=movie ピンポン=table-tennis なに=what いっしょに=together それから=after that, and than 〜と〜=and (conjunction used only with nouns) もしもし=Hello. (on the telephone) [あした]ひまですか.=Are you free [tomorrow] ? ええ=Yes いいですね。=That's good. わかりました。=I see. O.K. またあした。=See you tomorrow. [Words: Lesson 7] きります=cut しゅうりします=repair かけます[でんわを〜]=make a phone call ;; give && receive verbs もらいます=receives あげます=gives かします=lends かります=borrows ならいます=learns おしえます=teaches はし=chopsticks ナイフ=knife フォーク=fork スプーン=spoon はさみ=scissors ドライバー=screwdriver スパナ=spanner, wrench ペンチ=cutting pliers おかね=money プレゼント=present, gift レポート=report かぞく=family おとうさん=father おかあさん=mother おにいさん=elder brother おねえさん=elder sister おとうと=young brother いもうと=young sister おくさん=(someone's else) wife かない=(one's own) wife しゅじん=(one's own) husband ごしゅじん=(someone's else) husband こども=child えいご=the English language 〜ご=~language もう=already まだ=not yet これから=Soon, from now on. おめでとうございます。=Congratulations. (birthday, New Year's Day, ...) わあ=wow, oh ! (expression of surprise) どういたしまして。=Never mind. Not at all. You're welcome. いい[シャツ]ですね。=It's a nice [shirt], isn't it. [Words: Lesson 8] きれい(な)=beautiful, clean ハンサム(な)=handsome しんせつ(な)=kind ゆめい(な)=famous げんき(な)=healthy, sound, cheerful しずか(な)=quiet にぎやか(な)=lively おおきい=big, large ちいさい=small, little あたらしい=new ふるい=old (not of age) いい(よい)=good わるい=bad あつい=hot さむい=cold, chilly (weather) つめたい=cold (temperature) むずかしい=difficult やさしい=easy たかい=expensive; tall, high やすい=cheap ひくい=low おもしろい=interesting おいしい=tasty, delicious しろい=white くろい=black あかい=red あおい=blue しけん=examination しゅくだい=homework たべもの=food さくら=cherry blossom はな=flower まち=town やま=mountain ふじさん=Mt. Fuji ところ=place どう=how どんな〜=what kind of ~ どれ=which one たいへん=very あまり=not so ~ (used in a negative sentence) そして=and (connecting sentences) 〜が、〜=~, but ~ やあ=Hi! (used by males, this is a casual greeting) しばるくですね。=Long time no see. おげんきですか。=How are you? どうぞこちらへ。=this way, please. (コーヒー)はいきがですか。=Won't you have (a cup of coffee)? いただきます。=Thank you. I accept. (customarily said before a meal) ごちそうさま(でした)。=That was delicious. そうですね。=Well let me see. (pausing) [Words: Lesson 9] わかります=understand あります=have すき(な)=like きらい(な)=dislike じょうず(な)=good at へた(な)=poor at ひらがな=Hiragana script かたかな=Katakana Script ローマじ=The Roman alphabet かんじ=Chinese characters りょうり=dish (cooked food), cooking くだもの=fruit のみます=drinks ぶたにく=pork とりにく=chicken ぎゅうにく=beef みかん=orange バナナ=banana おんがく=music うた=song ダンス=dance ギター=guitar スポーツ=sport サッカー=soccer テニス=tennis じかん=time たくさん=many, much すこし=a little, few よく=well だいたい=almost, roughly ぜんぜん=not at all (used in negative sentence) もちろん=of course どして=why 〜から=because ~ びょうき=illness くすり=medicine あたま=head おなか=stomach いたい(あたまが〜)=have a (stomach) ache ねつがありまさ=have a fever かぜをひじゅました=have caught a cold やすみます(かいしゃを〜)=take a day off (from the company) なんですか。=May I help you? すみませんが、Excuse me, but when ~ どいしましたか。=What's the matter (with you)? [Words: Lesson 10] います=exist, be (living things) あります=exist, be (inanimate things) いろいろ[な]=various うえ=on, above した=under, below, beneath まえ=front うしろ=back, behind みぎ=right (side) ひだり=left (side) なか=in, inside そと=outside となり=next (door) あいだ=between, among ちかく=near もの=thing ちず=map けしゴム=eraser セロテープ=sellotape, clear adhesive tape ホッチキス=stapler パスポート=passport ベッド=bed おとこのひと=man おんなのひと=woman おとこのこ=boy おんなのこ=girl レストラン=restaurant こうえん=park たいしけん=embassy ゆうびんきょく=post office ポスト=post box がっこう=school 〜や〜= ~ and ~ and so on あのう=Excuse me, but (used when talking to someone with hesitation) いってまいります。=I'm going to leave now. いっていらっしゃい。=I hope you have a pleasant trip. Have a good time. [Words: Lesson 11] います、[こどもが〜]=have [a child] います、[にほに〜]=stay, be [in Japan] かかります=take (referring to time) ひとつ=one (when counting things) ふたつ=two (when counting things) みっつ=three (when counting things) よっつ=four (when counting things) いつつ=five (when counting things) むっつ=six (when counting things) ななつ=seven (when counting things) やっつ=eight (when counting things) ここのつ=nine (when counting things) とお=ten (when counting things) いくつ=how many (when counting things) ひとり=one person ふたり=two persons 〜にん=~ people 〜だい=(counter for machines, cars, ...) 〜まい=(counter for paper, stamps, ...) 〜かい=~ times きょうだい=brothers and sisters きっぷ=ticket ふうとう=envelope きって=postage stamp エアメール=airmail にもつ=baggage, parcel いちにち(1−にち)=one day (as a period of time) 〜じかん=~ hour(s) 〜しゅうかん=~ week(s) 〜かげつ=~ month(s) 〜ねん=~ year(s) どのくらい=how long, how many 〜ぐらい=about ~ (referring to an amount or period of time) ぜんぶで=in total 〜だけ=only ~, exactly それから=and, then (the next thing), furthermore [Words: Lesson 12] ひま[な]=free time いそがしい=busy ちかい=near とおい=far はやい=early, fast おそい=slow おおい、[ひとが〜]=many [people] すくない、[ひとが〜]=few [people] あたたかい=warm すずしい=cool あまい=sweet からい=hot (taste), spicy たのしい=enjoyable, pleasant わかい=young いい、[コーヒー〜]=prefer [coffee] てんき=weather, fine weather あめ=rain ゆき=snow くもり=cloudy やすみ=holiday, an absence りょこう=trip, tour パーティー=party みせ=store, shop クラス=a class (a group of students) どちら=which (from two) どちらも=both いちばん=number one, the most ~ とても=very ずっと=far~, much ~ (comparing one thing with others) でも=but ただいま。=I'm home. (used by the one returning home) おかえりなさい。=Welcome home ! (said to one just returned home) つかれました。=(I'm) tired. [Words: Lesson 13] あそびます I(あそぶ、あそんで)=enjoy oneself, play おくります[にもつを〜](おくる、おくって)=send [baggage, parcel] かえます II(かえる、かえて)=change けっこんします III(〜する、〜して)=get married かいものします III(〜する、〜して)=do shopping さんぽします[こうえんを〜] III(〜する、〜して)=take a walk [in the park] けんぶつします[まちを〜] III(〜する、〜して)=do sightseeing [in a town] けんがくします[こうじょうを〜] III(〜する、〜して)=visit [a factory] はいります[へやに〜] I(はえる、はいって)=enter [the room] でます[へやを〜] II(でる、でて)=go out [of the room] ほしい=want (something) ビデオ=video cassette recorder, video tape ラジカセ=radio cassette tape recorder ステレオ=stereo くるま=vehicle おみやげ=souvenir, present いつも=always ときどき=sometimes どこか=somewhere, some place なにか=something いいてんきですね。=Nice weather, isn't it ? そおですね。=Yes, it is. I agree. おなかがすきました。=(I'm) hungry. おなかがいっぱいです。=(I'm) full. のどがかわきました。=(I'm) thirsty. そうしましょう。=Let's do that. (when agreeing with someone's suggestion) [Words: Lesson 14] よびます I(よぶ、よんで)=call いそぎます I(いそぐ、いそいで)=hurry まちます I(まつ、まって)=wait とります I(とる、とって)=take てつだいます I(てつだう、てつたって)=help (with a task) いいます I(いう、いって)=say はなします I(はなす、はなして)=speak おぼえます II(おぼえる、おぼえて)=remember, memorize おしえます II(おしえる、 おしえて)=tell, teach みせます II(みせる、 みせて)=show ふります[あめが〜] I(ふる、 ふるて)=rain ことば=word, language なまえ=name じゅうしょ=address でんわばんごう=telephone number しょ=salt さとう=sugar かさ=umbrella タイプ=typewriter, typewriting ワープロ=word processor つかいかた=method of use かきかた=method of writing よみかた=method of reading ゆっくり=slowly もういちど=one more time, once more また=again, next time もうすこし=a little more はやく=fast, early すぐ=immediately あとで=later [やすいの]はありませんか。=Don't you have [a cheaper one] ? こちらはいかがですか。=How about this ? いかが=how; in what way ううん...=Hmm ... (when wondering what to do) [どうも]すみません。=I'm [very] sorry. (an apology) またきます。=I'll come again. (can be used as an excuse when leaving a shop without buying anything) [Words: Lesson 15] つかいます I(つかう、つかって)=use つけます II(つける、つけて)=turn on (a light, ...) けします I(けす、けして)=turn off (a light, ...) あけます II(あける、あけて)=open しめます II(しめる、しめて)=shut すわります[いすに〜] I(すわる、すわって)=sit down [on a chair] たちます I(たつ、たって)=stand up おきます I(おく、おいて)=put つくります I(つくる、つくって)=make, produce うります I(うる、 うって)=sell しります I(しる、しって)=get to know もちます I(もつ、もって)=hold すみます I(すむ、 すんで)=be going to live しっています=know もっています=be holding, have すんでいます[とうきょうにー]=live [in Tokyo] きんえん=no smoking せいひん=products せっけん=soaps タオル=towel どくしん=single, unmaried [お]しごと=work, business エンジニア=engineer かいしゃいん=company employee ぎんこういん=bank employee がくせい=student だいがく=university うえ の[いもと]=elder [elder sister] した の[いもと]=younger [younger sister] いもうとさん=(someone else's) younger sister [Words: Lesson 17] わすれます II(わすれる、わするて)=forget なくします I(なくす、なくして)=lose しんぱいします III(〜する、〜して)=worry き を つけます [くるまに〜] II(き を つける、き を つけて)=pay attention to [a car] いれます II(いれる、いれて)=put in, insert だします I(だす、だして)=take out, hand in とめます II(とめる、とめて)=stop, park (a car) かえします I(かえす、かえして)=give back はらいます I(はらう、はらって)=pay ぬぎます I(ぬぐ、ぬいで)=take off (clothes, shoes, etc.) さわります [きかい に 〜] I(さわる、さわって)=touch [a machine] たいせつ[な]=important, precious すごい=Brilliant! Great! (express astonishment and admiration) あぶない=dangerous おと=sound ロボット=robot きょか=permission スイッチ=switch クーラー=air conditioner ヒーター=heater まいしゅう=every week 〜までに=before ~, by ~ (indicating time limit) ですから=therefore, so だめです。=That's not good. You must not. ざんねんです。=I'm sorry (to hear that). That's a pity. langdrill-0.3/src/main.cc0100644000175000017500000010640507671402056013506 0ustar samsam/* * =========================== * langdrill: Language Drills * Version 0.1.7 * 1/1999 * =========================== * * Copyright (C) 1998, Ionutz Borcoman * Developed by Ionutz Borcoman , * * Many thanks to Mario Motta for the help given * during developing this program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // #include #include "main.hh" #include #include #define SOLUTIONS_PAGE 0 #define QUIZZES_PAGE 1 #define SIMPLEQUIZZ_PAGE 2 DEFINE_SIGNAL_MAP(MyLangForm, VDKForm) ON_SIGNAL( _book, switch_page_signal, SwitchPage ), ON_SIGNAL( _clist, select_row_signal, SelectRow ), ON_SIGNAL( _clist, unselect_row_signal, SelectRow ), ON_SIGNAL( _aboutMenu, activate_signal, AboutClicked ), ON_SIGNAL( _exitMenu, activate_signal, ExitClicked ), ON_SIGNAL( _loadButton, clicked_signal, LoadClicked ), ON_SIGNAL( _reloadButton, clicked_signal, ReloadClicked ), ON_SIGNAL( _senseGroup, toggled_signal, SenseToggled ), ON_SIGNAL( _startButton, clicked_signal, StartClicked ), ON_SIGNAL( _simpleQuizzButton, clicked_signal, QuizzAnswerClicked), ON_SIGNAL( _timer, timer_tick_signal, TimerTick ) END_SIGNAL_MAP; // Is this working ? // DEFINE_EVENT_MAP(MyLangForm, VDKForm) // ON_EVENT( _simpleQuizzText, key_press_event, QuizzTextKeyPress ) // END_EVENT_MAP DEFINE_SIGNAL_LIST(MyLangForm, VDKForm); DEFINE_EVENT_LIST(MyLangForm, VDKForm); bool MyLangForm::changeAnswerButtons() { // check to see if the input values are usable int newNr = atoi(_quizzAnswerNrEntry->Text); int wQuizzTmp = atoi(_setup.wQuizz); int hQuizzTmp = atoi(_setup.hQuizz); if(newNr<=2){ _sbar->Push("The program needs at least 2 possible answers."); return false; } int oldNr = atoi(_setup.quizzAnswerNr); // delete the old buttons only if their number has changed QuizzDestroy( newNr, oldNr ); QuizzSetup( newNr, oldNr, wQuizzTmp, hQuizzTmp ); // now update the values of _setup sprintf( _setup.quizzAnswerNr, _quizzAnswerNrEntry->Text); return true; } void MyLangForm::checkSections() { if( _clist->Tuples.size()<=0){ _startButton->Enabled = false; } else{ _startButton->Enabled = true; } } void MyLangForm::clearLessons() { for(int i=0; i<_setup.lessonNr; i++){ delete [] _setup.lessonTitle[i]; } delete [] _setup.lessonTitle; if(_config) delete _config; } void MyLangForm::distribute(int *array, int nr, int nr_avail) { int *occupied; int i, j, k; occupied = new int[nr_avail]; memset( occupied, 0, nr_avail*sizeof(int) ); for(i=0; iPush("Could not load the file. Reverting to old values."); delete tempConfig; return; } // we save the current selections VDKArray selected; VDKArray selectedNames; int selectedNr; if(isNew==false){ selected = _clist->Selections(); selectedNr = selected.size(); selectedNames.resize(selectedNr); for(int i=0; iTuples[(selectedNr?selected[i]:i)][0]; } } // now clear the _clist _clist->Clear(); // save some old values int oldQuizzNr = atoi (_setup.quizzAnswerNr); // we clear the previous data clearLessons(); // set the new values _config = tempConfig; _setup = tempSetup; // we overide what's in the RC file with what's in // the _quizzAnswerNrEntry int newQuizzNr = atoi (_quizzAnswerNrEntry->Text); int newWQuizz = atoi (_setup.wQuizz); int newHQuizz = atoi (_setup.hQuizz); // now add the rows to _clist // the _setup.lessonNr can be different now ! for(int i=0; i<_setup.lessonNr; i++){ _clist->AddRow( &(_setup.lessonTitle[i]) ); } QuizzDestroy( newQuizzNr, oldQuizzNr ); QuizzSetup( newQuizzNr, oldQuizzNr, newWQuizz, newHQuizz ); char * tmpName; tmpName = new char[ strlen(_setup.directSenseName) + strlen(_setup.reverseSenseName) + 4 ]; sprintf(tmpName, "%s > %s", _setup.directSenseName, _setup.reverseSenseName); _senseGroup->Buttons[0]->Caption =tmpName; sprintf(tmpName, "%s > %s", _setup.reverseSenseName, _setup.directSenseName); _senseGroup->Buttons[1]->Caption = tmpName; delete []tmpName; // overide the sense from the loaded file with // what the user has already chosen _setup.sense = _senseGroup->Selected; sprintf( _setup.quizzAnswerNr, _quizzAnswerNrEntry->Text ); // if we have just reloaded, // the we checked back the old selections // a check must be made to ensure that no problem arrises // if there are less lessons if(isNew==false){ for(int j=0; jSize(); i++){ if(_clist->Tuples[i][0] == selectedNames[j]){ _clist->SelectRow(i,0); break; } } } } _clist->Thaw(); checkSections(); // depending on what page we are viewing // we take corresponding action switch(_book->ActivePage){ case QUIZZES_PAGE: case SIMPLEQUIZZ_PAGE: // force restart StartClicked(NULL); break; case SOLUTIONS_PAGE: SelectRow(NULL); break; } printf("Loaded drill file: %s\n", _setup.name); } void MyLangForm::newRandowSet(int rows, int cols, int *set) { int i, j; int tmp; int *tmpcol; int *tmprow; tmpcol = new int[cols]; tmprow = new int[rows]; for(i=0; iRead(); } catch ( MyException * exception){ printf( exception->Message()); printf("\n"); delete exception; return false; } MySection *sect; MyKey *key; sect = tempConfig->Section("Application"); if(sect){ if((key = sect->Key("compatVersion"))) strncpy(tempSetup.compatVersion, key->Get(), 9); if((key = sect->Key("sense"))) tempSetup.sense=key->GetInt(); if((key = sect->Key("directSenseName"))) strncpy(tempSetup.directSenseName, key->Get(), MAX_SENSE_NAME-1); if((key = sect->Key("reverseSenseName"))) strncpy(tempSetup.reverseSenseName, key->Get(), MAX_SENSE_NAME-1); if((key = sect->Key("quizzAnswerNr"))) strncpy(tempSetup.quizzAnswerNr, key->Get(), 2); if((key = sect->Key("timer"))) strncpy(tempSetup.timer, key->Get(), 2); if((key = sect->Key("limitedAnswerNr"))) strncpy(tempSetup.limitedAnswerNr, key->Get(), 3); if((key = sect->Key("limitedAnswers"))) tempSetup.limitedAnswers = key->GetInt(); if((key = sect->Key("hideWindow"))) tempSetup.hideWindow = key->GetInt(); if((key = sect->Key("useTimer"))) tempSetup.useTimer = key->GetInt(); // search for lessons // one of the sections is the "Application" one tempSetup.lessonNr = tempConfig->Number() - 1; if(tempSetup.lessonNr ){ tempSetup.lessonTitle = new char *[tempSetup.lessonNr]; int i, j; for( i=0, j=0; iNumber(); i++){ MySection *newSect = tempConfig->operator[](i); if( sect != newSect ){ tempSetup.lessonTitle[j] = strdup_new(newSect->Name()); j++; } } } }else{ // didn't find the main section // this section is vital // it contains at least one value not set by default // the version value return false; } return true; } void MyLangForm::setActiveButtons(int keyTotalNr) { int i; int cols = atoi(_setup.quizzAnswerNr); if( keyTotalNr <= cols ){ // we have less quizzes than available buttons // we must disable some buttons for(i=0; iEnabled == false ) _quizzAnswerButton[i]->Enabled = true; } for(i=keyTotalNr; i< cols; i++){ // we disable suplimentar buttons // we also set their labels to "disabled" // to warn the user about their state if(_quizzAnswerButton[i]->Enabled == true ) _quizzAnswerButton[i]->Enabled = false; _quizzAnswerButton[i]->Caption = "--disabled--"; } }else{ // we have more keys than available buttons // we verify that all buttons are active for(i=0; iEnabled == false ) _quizzAnswerButton[i]->Enabled = true; } } _simpleQuizzButton->Enabled = ( keyTotalNr > 0 ); _simpleQuizzText->Enabled = ( keyTotalNr > 0 ); } void MyLangForm::showQuizz() { int i; int j; int k; MySection *sect; // get the selected lessons VDKArray& selected = _clist->Selections(); int selectedNr = selected.size(); // number of keys from selected lessons int keyTotalNr = 0; int *keyNr; keyNr = new int[(selectedNr?selectedNr:1)]; // compute the total number of keys available // if nothing's selected, than use the first entry for(i=0; i<(selectedNr?selectedNr:1); i++){ sect = _config->Section((char*)_clist->Tuples[(selectedNr?selected[i]:i)][0]); keyNr[i] = sect->Number(); keyTotalNr += keyNr[i]; } // we need to test if there are more buttons than available // keys. In such a case, we must take some precations setActiveButtons( keyTotalNr ); // is this minimum operator portable ?? // it should work with egcs at least !! int cols = keyTotalNr = keyNr[j]; j++) k = k - keyNr[j]; } sect = _config->Section((char*)_clist->Tuples[(selectedNr?selected[j]:j)][0]); key = sect->operator[](k); _quizzAnswerButton[mset[i]] ->Caption = (_setup.sense==0)?key->Get():key->Name(); } i=0; j = 0; // section index (we use the Tuples to get the section name) k = set[i]; // key index // printf("quizz %d: key %d\n", _quizzes, k); // get the section index and the key index in the corresponding section if(selectedNr){ for(; k >= keyNr[j]; j++) k = k - keyNr[j]; } sect = _config->Section((char*)_clist->Tuples[(selectedNr?selected[j]:j)][0]); key = sect->operator[](k); _quizzLabel->Caption = (_setup.sense==0)?key->Name():key->Get(); _goodTag = mset[i]; // set the simple quizz now i=0; j = 0; // section index (we use the Tuples to get the section name) k = set[i]; // key index // get the section index and the key index in the corresponding section if(selectedNr){ for(; k >= keyNr[j]; j++) k = k - keyNr[j]; } sect = _config->Section((char*)_clist->Tuples[(selectedNr?selected[j]:j)][0]); _simpleQuizzKey = sect->operator[](k); _simpleQuizzSense = _setup.sense; _simpleQuizzLabel->Caption = (_simpleQuizzSense==0) ?_simpleQuizzKey->Name() :_simpleQuizzKey->Get(); delete [] mset; delete [] set; delete [] keyNr; } // return codes // -1: the _timerEntry->Text is not valid // 0: the _timerCheck is NOT checked // 1: the _timerCheck IS checked int MyLangForm::useTimer() { if( _timerCheck->Checked == true ){ int temp; temp = atoi(_timerEntry->Text); // there is an error and we signal it if(temp<=0) return -1; _timerCicle = temp*60; _elapsedTime = _timerCicle; _timer->Start(); _timerBar->Value = 0; _timerRunning = true; }else{ _elapsedTime = 0; _timerRunning = false; // the user don't want timer return 0; } // the user want timer return 1; } MyLangForm::MyLangForm(VDKApplication *app, int *argc, char *argv[]) :VDKForm(app,"Language Drills") { // command line args _argc = argc; _argv = argv; // default setup values _setup.name[0]='\0'; _setup.sense = 1; sprintf( _setup.quizzAnswerNr, "10"); sprintf( _setup.wQuizz, "150"); sprintf( _setup.hQuizz, "35"); sprintf( _setup.directSenseName, "Japanese" ); sprintf( _setup.reverseSenseName, "English" ); sprintf( _setup.compatVersion, "00.00.00" ); sprintf( _setup.timer, "10" ); // default to 10 minutes sprintf( _setup.limitedAnswerNr, "25" ); _setup.lessonNr = 0; _setup.limitedAnswers = 1; // we want limited answers _setup.useTimer = 1; // we want to use the timer _setup.hideWindow = 0; // by default we minimize the window _elapsedTime = 0; _timerCicle = 0; _timerRunning = false; _simpleQuizzKey = NULL; _simpleQuizzSense = _setup.sense; _config = NULL; _currentLesson = 0; _clistWordsUpdated = false; }; MyLangForm::~MyLangForm() { // the VDK objects are deleted by the garbage collector // we only need to delete the array of pointer we used internally // aka _quizzAnswerButton delete [] _quizzAnswerButton; delete [] _slot; clearLessons(); }; void MyLangForm::hideOrIconify() { printf("Stop the timer first if you want to exit. \n" "Now we hide app\n"); // code to minimize/hide the app // I would preffer to minimize, but how do I do that ?!? if( _hideCheck->Checked == true ) Hide(); else{ // check the state if( Iconized == false ) Iconized = true; } } bool MyLangForm::CanClose() { // if user wants to use the timer, then do so if( _timerRunning == true ){ printf("_timerRunning %d\n", _timerRunning); hideOrIconify(); } else { switch( useTimer() ){ case -1: return false; case 0: printf("Thanks for using Language Drills.\n"); return true; case 1: hideOrIconify(); break; default: return true; // we close the app by default } } return false; } void MyLangForm::Setup() { VDKRadioButton *button; VDKBox *vbox; VDKFrame *senseFrame; VDKTable *table; ///////////////////////////////// // The menus ///////////////////////////////// VDKMenubar * menubar; VDKMenuItem * menu; VDKMenu *menuContainer; menubar = new VDKMenubar(this); // the File menu menu = new VDKMenuItem(menubar, "File"); menuContainer = new VDKMenu(this); _exitMenu = new VDKMenuItem(menuContainer, "Exit Langdrill"); menu->Add( menuContainer ); // the Help menu menu = new VDKMenuItem(menubar, "Help", NULL, r_justify); menuContainer = new VDKMenu(this); _aboutMenu = new VDKMenuItem(menuContainer, "About"); menu->Add( menuContainer ); Add(menubar, l_justify, false); ///////////////////////////////// // Add a notebook and some pages to it ///////////////////////////////// table = new VDKTable (this, 2, 2); _book = new VDKNotebook(this); // Add the notebook before adding any page to it. // Otherwise you can get sigsegvs at runtime ! Add(table); table->Add(_book,1,2,0,1); // reinitialize the number generator srand(time(NULL)); // search for a setup file // if one is finded, then the values from it are used // keys not found keeps the default values if(!findLangDrillRC()){ _config = new MyConfig( _setup.name ); parseLangDrillRC( _config, _setup ); } ///////////////////////////////// // Solutions Page // Attention ! This assumes that the _clist is already initialized char ** textWords; textWords = new char *[2]; for(int i=0; i<2; i++) textWords[i] = new char[255]; sprintf(textWords[0],_setup.directSenseName); sprintf(textWords[1],_setup.reverseSenseName); // using MULTIPLE we can select more than one line. // the lines selected can be obtained with Slections(). _clistWords = new VDKCustomList( this, 2, textWords, GTK_SELECTION_MULTIPLE); _clistWords->ActiveTitles(false); // Strange, but adding here some Japanese text, makes it not to // be correctly displayed. Therefore we postponed this for the // time the user checks the first time the "Solutions" page // MySection *sect = _config->Section((char*)_clist->Tuples[0][0]); // for(int i=0; iNumber(); i++){ // sprintf(textWords[0],sect->operator[](i)->Name()); // sprintf(textWords[1],sect->operator[](i)->Get()); // _clistWords->AddRow( textWords ); // } // _clistWordsUpdated = true; for(int i=0; i<2; i++) delete [] textWords[i]; delete [] textWords; _book->AddPage( _clistWords, "Words" ); ///////////////////////////////// // Quizzes Page // add the quizz entry and buttons // first initialize the _quizzBox _quizzFrame = new VDKFrame( this, "What's this ?", v_box, shadow_etched_out ); _quizzFrame->Add( _quizzLabel = new VDKLabel(this, " ") ); _quizzBox = new VDKBox(this, v_box); _quizzBox->Add( _quizzFrame ); int nr = atoi(_setup.quizzAnswerNr); int w = atoi(_setup.wQuizz); int h = atoi(_setup.hQuizz); QuizzSetup(nr, -1, w, h ); // start with all butons disabled. // they wil be enabled when starting the quizzes for(int i = 0; i< atoi(_setup.quizzAnswerNr); i++) _quizzAnswerButton[i]->Enabled = false; // normal attachement _book->AddPage( _quizzBox, "Multiple Quizz" ); ///////////////////////////////// // Simple Quizz Page VDKBox *simpleBox = new VDKBox(this); VDKFrame *simpleFrame = new VDKFrame( this, "What's this ?", v_box, shadow_etched_out ); w = atoi(_setup.wQuizz); h= atoi(_setup.wQuizz); simpleFrame->Add( _simpleQuizzLabel = new VDKLabel(this, "")); simpleBox->Add( simpleFrame); simpleBox->Add( _simpleQuizzText = new VDKTextView(this)); _simpleQuizzText->Editable = true; simpleBox->Add( _simpleQuizzButton = new VDKCustomButton(this, "Submit", "Press when you finish " "entering the answer")); // start with the entry and the button disabled _simpleQuizzButton->Enabled = false; _simpleQuizzText->Enabled = false; // The last argument used to be "true". Now it must be "false" ! EventConnect( _simpleQuizzText, "key_press_event", &MyLangForm::QuizzTextKeyPress, false); _book->AddPage( simpleBox, "Simple Quizz" ); ///////////////////////////////// // Timer Page VDKBox *timerBox = new VDKBox(this); timerBox->Add( new VDKLabel(this, "Time Step (minutes)"), l_justify, false); timerBox->Add( _timerEntry = new VDKNumericEntry( this, 0, _setup.timer ), l_justify, false); _timerEntry->Editable = true; timerBox->Add( new VDKLabel(this, "Answer Step"), l_justify, false); timerBox->Add( _answerStepEntry = new VDKNumericEntry( this, 0, _setup.limitedAnswerNr ), l_justify, false); _answerStepEntry->Editable = true; timerBox->Add( _hideCheck = new VDKCheckButton( this, "Hide Window"), l_justify, false); _hideCheck->Checked = _setup.hideWindow; timerBox->Add( _answerStepCheck = new VDKCheckButton( this, "Use Answer Step" ), l_justify, false); _answerStepCheck->Checked = _setup.limitedAnswers; timerBox->Add( _timerCheck = new VDKCheckButton( this, "Use Timer"), l_justify, false); _timerCheck->Checked = _setup.useTimer; timerBox->Add( _timerBar = new VDKProgressBar( this ), l_justify, false); _timerBar->Value = 0.0; _timerBar->PrelightBackground = clNavyBlue; _timerBar->NormalBackground = clIvory; // create a stopped timer wich emits signals at every second _timer = new VDKTimer(this, 1000, false); // we can't do this here. we do it after the window is shown // _timerBar->BarStyle = GTK_PROGRESS_DISCRETE; // _timerBar->BlockCount = 10; _book->AddPage( timerBox, "Timer Setup" ); ///////////////////////////////////////////// // The rest of the main page ///////////////////////////////////////////// // sense frame vbox = new VDKBox(this, v_box); senseFrame = new VDKFrame(this, "Sense", v_box, shadow_etched_out ); _senseGroup = new VDKRadioButtonGroup(this); char * tmpName; tmpName = new char[ strlen(_setup.directSenseName) + strlen(_setup.reverseSenseName) + 4 ]; sprintf(tmpName, "%s > %s", _setup.directSenseName, _setup.reverseSenseName); button = new VDKRadioButton( _senseGroup, tmpName); sprintf(tmpName, "%s > %s", _setup.reverseSenseName, _setup.directSenseName); button = new VDKRadioButton( _senseGroup, tmpName); delete []tmpName; _senseGroup->SetSelected(_setup.sense); senseFrame->Add(_senseGroup); vbox->Add( senseFrame, l_justify, false ); VDKFrame * answersFrame = new VDKFrame( this, "Possible Answers ( < 99 )", v_box, shadow_etched_out ); answersFrame->Add( _quizzAnswerNrEntry = new VDKNumericEntry(this, 2, _setup.quizzAnswerNr ), l_justify, false); _quizzAnswerNrEntry->Editable = true; vbox->Add( answersFrame, l_justify, false); vbox->Add( _reloadButton = new VDKCustomButton( this, "Reload", "Reload the current configuration file."), l_justify, false ); vbox->Add( _loadButton = new VDKCustomButton( this, "Load ...", "Load other configuration file"), l_justify, false ); char *text = new char[255];; sprintf(text,"Lessons"); // using MULTIPLE we can select more than one line. // the lines selected can be obtained with Selections(). _clist = new VDKCustomList( this, 1, &text, GTK_SELECTION_MULTIPLE); _clist->ActiveTitles(false); for(int i=0; i<_setup.lessonNr; i++){ _clist->AddRow( &(_setup.lessonTitle[i]) ); } delete [] text; vbox->Add( _clist ); vbox->Add( _startButton = new VDKCustomButton(this, "Start/Reset", "Start/Restart quizzes ..."), l_justify, false ); // we don't wont this to expand table->AddExt(vbox, 0, 1, 0, 1, GTK_FILL ); table->AddExt(_sbar=new VDKStatusbar(this), 1, 2, 1, 2, GTK_FILL, GTK_FILL); _pbar = new VDKProgressBar(this); _pbar->Value = 1.0; _pbar->PrelightBackground = clNavyBlue; _pbar->NormalBackground = clIvory; // _pbar->BlockCount = 10; table->AddExt( _pbar, 0, 1, 1, 2, GTK_FILL, GTK_FILL ); // check to see if we have at least one valid Section // and enables the start button accordingly. checkSections(); } void MyLangForm::QuizzDestroy( int newNr, int oldNr ) { if(newNr!=oldNr){ for(int i=(oldNr-1); i>=0; i--){ // disconect the buttons SignalDisconnect(_slot[i]); // never use delete for VDK objects _quizzAnswerButton[i]->Destroy(); ///////////////////////// // by mario ///////////////////////// // alternatively you can use VDKObjectContainer::RemoveObject(obj) // _quizzBox->RemoveObject(_quizzAnswerButton[i]); // or VDKObjectContainer::RemoveObjects() // _quizzBox->RemoveObjects(); // not your case since there are other obj's than buttons // into setupFrame. ///////////////////////// } // but here we can use delete // this is a pointer to VDK objects delete [] _quizzAnswerButton; delete [] _slot; } } void MyLangForm::QuizzSetup(int newNr, int oldNr, int w, int h) { if(newNr!=oldNr){ // add dynamically the buttons only if necessary _quizzAnswerButton = new VDKCustomButton *[newNr]; _slot = new int[newNr]; for(int i=0; iSetSize(w,h); _quizzAnswerButton[i]->Tag = i; _quizzBox->Add( _quizzAnswerButton[i]); _slot[i] = SignalConnect(_quizzAnswerButton[i], "clicked", &MyLangForm::QuizzAnswerClicked); } } else{ for(int i=0; iSetSize(w,h); } } _quizzLabel->SetSize(w,h); } bool MyLangForm::AboutClicked( VDKObject*) { Application()-> MessageBox( " Let's talk about Language Drills", " Brought to you by\n" " Ionutz Borcoman\n" " \n" " \n" " \n" " Nothing would have been possible without\n" " Mario Motta's VDK\n" " " "\n", MB_OK | MB_ICONINFORMATION ) ; return true; } bool MyLangForm::ExitClicked( VDKObject*) { // last chance if _timerCheck is set or // if _timer is running if( _timerRunning==true || _timerCheck->Checked==true ){ bool answ = ( Application()-> MessageBox("Language Drill Message", " Are you sure you want to close \n" " the Language Drills ?\n" " The Timer seems to be active !", MB_YESNO) == IDYES ); if( answ == false ){ return true; } else { _timerRunning = false; _timerCheck->Checked = false; } } Close(); return true; } bool MyLangForm::LoadClicked( VDKObject*) { // open a FileSel (classical gtk+) char selection[FILENAME_MAX]; sprintf(selection, "%s/*.drill", DRILL_DIR); VDKFileSel *child = new VDKFileSel(Application()->MainForm, selection, "Choose a lesson please"); child->ShowModal(); if( selection ){ if(access(selection, R_OK)==0){ loadLangDrillRC( true, selection ); // we also change the working directory char *pos = strrchr(selection,'/'); if( selection + FILENAME_MAX > pos ) *pos = '\0'; } } // FileStringArray selections; // VDKFileTreeDialog *child = new VDKFileTreeDialog(Application()->MainForm, // &selections, // "Choose a lesson please"); // child->ShowModal(); // if(selections.size()>0){ // if(access(selections[0], R_OK)==0){ // sprintf( _setup.name, selections[0]); // ReloadClicked(NULL); // printf("Loaded %s.\n", _setup.name); // } // } return true; } bool MyLangForm::QuizzTextKeyPress( VDKObject *obj, GdkEvent *ev) { // printf("debug\n"); if( obj != _simpleQuizzText ) return false; GdkEventKey *event = (GdkEventKey*)ev; if( event->keyval == GDK_Return ){ // by this we stop propagation of RETURN // very cool. we have now a text wich acts like an entry gtk_signal_emit_stop_by_name( GTK_OBJECT(_simpleQuizzText->WrappedWidget()), "key_press_event"); QuizzAnswerClicked( obj ); } return true; } bool MyLangForm::QuizzAnswerClicked( VDKObject* sender) { char message [255]; bool correct; _quizzes++; // first of all we test to see if the answer is for // a simple or for a multiple quizz if( sender == _simpleQuizzButton || sender == _simpleQuizzText ){ // it's simple quizz // printf("Simple quizz\n"); correct = (0 == strcoll((_simpleQuizzSense==0) ?_simpleQuizzKey->Get() :_simpleQuizzKey->Name(), _simpleQuizzText->GetChars(0)) ); } else{ correct = (sender->Tag == _goodTag); } if( correct ){ _goodAnswers++; sprintf(message, "Bravo ! [ %d (%3.2f%%) good from %d ]", _goodAnswers, 100.0*_goodAnswers/_quizzes, _quizzes); _simpleQuizzText->Clear(); showQuizz(); }else{ sprintf(message, "Sorry ! [ %d (%3.2f%%) good from %d ]", _goodAnswers, 100.0*_goodAnswers/_quizzes, _quizzes); } _sbar->Push(message); _pbar->Update(1.0*_goodAnswers/_quizzes); if( _answerStepCheck->Checked==true && _timerCheck->Checked==true ){ int tmp = atoi ( _answerStepEntry->Text ); if( tmp<=0 && tmp>=1000 ) tmp = atoi( _setup.limitedAnswerNr ); if( _goodAnswers%tmp==0 && _goodAnswers>0 ){ // it's time to hide the application Close(); } } return true; } bool MyLangForm::ReloadClicked( VDKObject*) { loadLangDrillRC(false, _setup.name); return true; } bool MyLangForm::SelectRow(VDKObject*) { // check if the page SOLUTIONS_PAGE is visible if(_book->ActivePage == SOLUTIONS_PAGE ){ // delete the old rows _clistWords->Freeze(); _clistWords->Clear(); // load the new rows char ** textWords; textWords = new char *[2]; for(int i=0; i<2; i++) textWords[i] = new char[255]; MySection *sect; // get the selected lessons // first we check that we have at least one Section if( _clist->Tuples.size()>0){ VDKArray& selected = _clist->Selections(); VDKArray selectedNames; int selectedNr = selected.size(); selectedNames.resize(selectedNr); VDKArray realOrder(selectedNr); for(int i=0; iTuples[(selectedNr?selected[i]:i)][0]; } for(int i=0, k=0; i<_clist->Size(); i++){ for(int j=0; jTuples[i][0] == selectedNames[j]){ realOrder[k]=i; k++; break; } } } // compute the total number of keys available // if nothing's selected, than use the first entry bool color = false; // we have to order correctly the Tuples for(int i=0; i<(selectedNr?selectedNr:1); i++){ sect = _config->Section((char*)_clist->Tuples[(selectedNr?realOrder[i]:i)][0]); for(int j=0; j< sect->Number(); j++){ sprintf(textWords[0],sect->operator[](j)->Name()); sprintf(textWords[1],sect->operator[](j)->Get()); // Doesn't work anymore because it changes the whole list color _clistWords->NormalBackground = color ? clIvory : clWhite; _clistWords->AddRow( textWords ); color = !color; } } } _clistWords->Thaw(); for(int i=0; i<2; i++) delete [] textWords[i]; delete [] textWords; _clistWordsUpdated = true; }else{ _clistWordsUpdated = false; } return true; } bool MyLangForm::SenseToggled(VDKObject* s) { VDKRadioButtonGroup* sender = dynamic_cast(s); if(sender==NULL){ _sbar->Push(" was not triggered by a RadioButton !"); return true; } // seccond button (Selected == 1) means "English > Japanese" _setup.sense = sender->Selected; return true; } bool MyLangForm::SwitchPage( VDKObject*) { if( _clistWordsUpdated == false ){ SelectRow(NULL); } return true; } bool MyLangForm::StartClicked( VDKObject*) { _quizzes = 0; _goodAnswers = 0; _sbar->Push("Starting quizzes. All counters set to 0."); _pbar->Update(1.0); if(changeAnswerButtons()) showQuizz(); if(_book->ActivePage != QUIZZES_PAGE && _book->ActivePage != SIMPLEQUIZZ_PAGE ) _book->ActivePage = QUIZZES_PAGE; return true; } bool MyLangForm::TimerTick( VDKObject*) { _elapsedTime--; if( _elapsedTime<=0 ){ _timer->Stop(); _timerBar->Value = 0; // here we should bring to window to top if( _hideCheck->Checked == true ) Show(); else Iconized = false; Raise(); _elapsedTime = 0; _timerRunning = false; }else{ _timerBar->Value = 1 - (float)_elapsedTime/_timerCicle; } return true; } ////////////////////////////// // The VDKApplication ////////////////////////////// class MyLangDrillApp: public VDKApplication { int *_argc; char **_argv; public: MyLangDrillApp(int *argc, char *argv[]) :VDKApplication(argc, argv){ _argc = argc; _argv = argv; // set a 10 sec timed garbage collector SetGarbageCollection(10000); }; ~MyLangDrillApp(){}; void Setup(){ MainForm = new MyLangForm(this, _argc, _argv); MainForm->Setup(); MainForm->Show(); } }; ////////////////////////////// // The main function ////////////////////////////// int main (int argc, char *argv[]) { // These should be set before running the program, not // hardcoded or set by program. // // setenv("LC_CTYPE", "ja_JP.ujis", 1); // setenv("LC_MESSAGES", "C", 1); gtk_set_locale (); // setlocale(LC_CTYPE, "ja_JP.ujis"); // setlocale(LC_MESSAGES, "C"); MyLangDrillApp app(&argc, argv); app.Run(); return 0; } langdrill-0.3/src/main.hh0100644000175000017500000001103107670651550013512 0ustar samsam/* * =========================== * langdrill: Language Drills * Version 0.1.7 * 1/1999 * =========================== * * Copyright (C) 1998, Ionutz Borcoman * Developed by Ionutz Borcoman , * * Many thanks to Mario Motta for the help given * during developing this program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __main_hh__ #define __main_hh__ #include #include #include #include #include "config.hh" #define ESC 27 #define MAX_TITLE_LEN 255 #define MAX_FONT_LEN 255 #define MAX_SENSE_NAME 255 typedef VDKCustomButton * PVDKCustomButton; typedef struct { char name[PATH_MAX]; int sense; // sense of translation (eng->jap/jap->eng) char directSenseName[MAX_SENSE_NAME]; char reverseSenseName[MAX_SENSE_NAME]; char quizzAnswerNr[3]; // number of possible answers char hQuizz[4]; char wQuizz[4]; int lessonNr; char **lessonTitle; char compatVersion[10]; char timer[4]; char limitedAnswerNr[4]; int limitedAnswers; int useTimer; int hideWindow; } MyLangSetup; ////////////////////////////// // The Main Form ////////////////////////////// class MyLangForm: public VDKForm { VDKBox *_quizzBox; VDKCustomList *_clist; VDKCustomList *_clistWords; VDKColor *_backgroundWords; bool _clistWordsUpdated; VDKNumericEntry *_quizzAnswerNrEntry; VDKFrame *_quizzFrame; VDKLabel *_quizzLabel; // shows the quizz VDKCustomButton *_loadButton; VDKCustomButton *_reloadButton; VDKCustomButton *_startButton; VDKCustomButton **_quizzAnswerButton; // shows the answers int *_slot; // store handles of dynamic added signals VDKNotebook *_book; VDKProgressBar *_pbar; VDKRadioButtonGroup *_senseGroup; VDKStatusbar *_sbar; VDKTimer *_timer; VDKNumericEntry *_timerEntry; VDKProgressBar *_timerBar; int _elapsedTime; int _timerCicle; bool _timerRunning; VDKNumericEntry *_answerStepEntry; VDKCheckButton *_answerStepCheck; VDKCheckButton *_hideCheck; VDKCheckButton *_timerCheck; VDKFrame *_simpleQuizzFrame; VDKTextView *_simpleQuizzText; VDKLabel *_simpleQuizzLabel; VDKCustomButton *_simpleQuizzButton; MyKey *_simpleQuizzKey; int _simpleQuizzSense; // Menus entries VDKMenuItem *_exitMenu; VDKMenuItem *_aboutMenu; MyLangSetup _setup; MyConfig *_config; // configuration tree int *_argc; char **_argv; int _currentLesson; int _goodAnswers; int _goodTag; int _quizzes; bool changeAnswerButtons(); void checkSections(); void clearLessons(); void distribute(int *array, int nr, int nr_avail); bool findLangDrillRC(); void hideOrIconify(); void loadLangDrillRC(bool isNew, char *tempFile); void newRandowSet(int rows, int cols, int *set); bool parseLangDrillRC( MyConfig *tempConfig, MyLangSetup &tempSetup ); void setActiveButtons(int keyTotalNr); void showQuizz(); int useTimer(); public: MyLangForm(VDKApplication *app, int *argc, char *argv[]); ~MyLangForm(); // predefined VDK functions bool CanClose(); void Setup(); // convenience functions void QuizzDestroy(int newNr, int oldNr); void QuizzSetup(int newNr, int oldNr, int w, int h); // GUI functions (interaction with user) bool AboutClicked( VDKObject* ); bool ExitClicked( VDKObject* ); bool LoadClicked( VDKObject* ); bool QuizzAnswerClicked( VDKObject* ); bool QuizzTextKeyPress( VDKObject *, GdkEvent *); bool ReloadClicked( VDKObject* ); bool SelectRow( VDKObject* ); bool SenseToggled( VDKObject* ); bool SwitchPage( VDKObject* ); bool StartClicked( VDKObject* ); bool TimerClicked( VDKObject* ); bool TimerTick( VDKObject* ); DECLARE_SIGNAL_MAP(MyLangForm); DECLARE_SIGNAL_LIST(MyLangForm); DECLARE_EVENT_LIST(MyLangForm); // DECLARE_EVENT_MAP(MyLangForm); }; #endif langdrill-0.3/src/romaji.drill0100644000175000017500000000207607670631703014565 0ustar samsam[Application] sense=0 directSenseName=Romaji reverseSenseName=English quizzAnswerNr=5 hQuizz=40 wQuizz=120 [Words: Lesson 1] watashi=I watashi-tachi=we anata=you ano hito=that person, he, she minasan=ladies and gentlemen, all of you sensee=teacher, instructor kenshuusee=trainee ~san=Mr. Mrs. Miss dare, donata=who hai=yes iie=no denki=electricity, electric light kikai=machinery jidoosha=automobile, car kompyuutaa=computer senmon=speciality, specialization of study -sai=~years old nan-sai, o-ikutsu=how old Nihon=Japan Indo=India Indoneshia=Indonesia Kankoku=Korea Chuugoku=China Firipin=Philippines Tai=Thailand Mareeshia=Malaysia ~jin=a national of ~ Ohayoo gozaimasu.=Good morning. Hajimemashite.=How do you do ? Doozo yoroshiku.=Nice to meet you. [Words: Lesson 2] kore=this (thing here) sore=that (thing near you) are=that (thing over there) kono~=this~ (here) sono~=that~ (near you) ano~=that~ (over there) hon=book zasshi=magazine jisho=dictionary nooto=notebook kami=paper shinbun=newspaper tegami=letter boorupen=ballpoint pen shaapu-penshiru=propelling pencil langdrill-0.3/src/langdrill0100755000175000017500000031204307711473300014141 0ustar samsamELF跌4:4 (444   \4544HH((( Ptd```/lib/ld-linux.so.2GNU2R!Y3rZv:kPi0BF; 7$gTW)NpGmxqKh8wU}'@,+PaS~zm`>X ^36"4lM I j?|/'Z-MVcy7D<8}]Jesb|qhfOrQjctno1f#HEuX ,D(Oe:Ca#]6F=G^kWsuLUHKo!z$ );>p&1_"[d`y%Y9 I +nb@gER.l/<4{A 5v2.9VL(%Q\AB* iNw\STt0 x?*~={dC[5& -J_k}" j %,x9< QLd2f+" rB` n\yd" l1| , B6 J寂g " J 問!V樞a " :pr Mn !^]9" n趙O" y z2 D *^!" S*m\" sm+" a " !G4 0 !S J  6R `pqJ pp3 " d" KXd@" <,u!<ImB" `" LX\ ^D" ol;6; |_Qd^1"  i\" a" 7QXo" {弱,悶_ " rS) (,f" iH`" h;" +" ,d+" , 槭!i;" \gv" x6n+" 跂 l" c4" 0wi  p!*nF,7a<t0a " L4z *^D" \De` " ~HL !a " a=" l" ,|T+" (l" @  Da " y)kp AX " pQ, ]" j F" I+" 惹CjI p  Da " e " G" d" 紋樔:3r  趾Ejp" d"" #a " Z `} u x h9" W"  YM"  u4 / B!" GN T" r NF" dD" Lp( ,! F( !`." >hG" !-!2 " X! !j!tp 4Po}" T<4! fLI! !D" !G "Lsi ."Z " Na " \Elq:a " E"dM& P,!p"e:" i;" [" "2]," "q: "p  #k E#!1|fV#9!#k #c4" #!$ !.$m" J$!~$`1!$w $oS $!%+" I\@3跌 e9%!n%  !%w  % } 主C門%LE" 槫%Rk9" &:eZ" D& " _&B_1" 趺    &^F" ' YN" &bn9" 'j9" ,='簾 ; <|]'LW" ' " !'@" 'l\" 'p3 Z LQ (\" (^fZ" h(!z \(ri (頤U (vg " ly)O" |2?)" [)! a  !  LZ" ).r  U~ )N" ) x)Vo" E 取j hG" *c" 匁 a " 樊 跏*" 7*,  bR*mB"  C}*!*],"  ,y**n" +f:" . < F+VJ  噺,!v+f M LR+| +@8!c \r l3 +!,"" ,_" &a " ~|,(,!;,P O,h"  !  %7,肬e ," \=" o !7,9 - a " 5- " U-幎5 4 守N-q: -!-MK H 也 e !-n" -]!" ."" V樒_v &c" 跚??+.jt h=.@   x.Pg" a " .XV" .!"  .e" , ,,/.!A/TQ M a " x a" <)g/ !x/8jp" /X" /n" L\ 0 " l+08r7 <0X" ]0(! !|T0 0<G" T\0_." j0|j 1&qJ v($!手*1t_F" O冶C|1!櫁y1$p( 1F!跖WEG }1rN 2}  Hla" 2g " 72s I2]9" ,O<\2t 2w  $2|  ~a " 2f2" L5Xa" 83Rf " RiN" \~3L( Ql#}|'3@ !3Li" 3 " 4$g+" L4bg"  4 0!4bxi 4nG6 W4>f" ;5" S5e2" 5_" o,5 # 朱AP!V夜5 " t 樣c5珠S libvdk2.so.2_ZN8VDKArrayIiEeqERS0__ZN9VDKStringC1EPKc_ZN7VDKMenuC1EP7VDKForm_ZN8VDKFrameC1EP7VDKFormPcii_ZN9VDKObject16VDKEventUnitPipeEP10_GtkWidgetP9_GdkEventPv_ZN14VDKApplication20SetGarbageCollectionEjgtk_object_get_type_ZN9VDKStringD1Ev_ZN7VDKForm9OnIconizeEPS__ZN9VDKObject20VDKEventUnitResponseEP10_GtkWidgetPcP9_GdkEventPv_ZN9VDKObject6SetTipEPc_ZN7VDKForm8OnResizeEPS_R8VDKPoint_ZN7VDKForm14WindozeMessageEijm_ZN9VDKObject13SetForegroundE6VDKRgb12GtkStateType_ZN9VDKObject17VDKSignalUnitPipeEP10_GtkWidgetPv_DYNAMIC_ZN9VDKCustom12ActiveTitlesEb_ZN15VDKCustomButtonC1EP7VDKFormPKcS3_j15GtkPositionType_ZTS8VDKArrayI9VDKStringEgtk_statusbar_get_type_ZN9VDKObject23VDKObjectSignalResponseEP10_GtkWidgetiPvb_ZN14VDKApplication3RunEvgtk_signal_connect_full_ZN7VDKListI14VDKRadioButtonE5fetchEi_ZN7VDKForm9OnRestoreEPS__ZN7VDKForm9ShowModalE17GtkWindowPosition_ZN7VDKForm4HideEv_ZN11VDKMenuItemC1EP7VDKMenuPKcPPcjhb_ZN7VDKForm6OnShowEPS__ZN8VDKArrayI9VDKStringED0Ev_ZN10VDKMenubarC1EP7VDKForm_ZN19VDKRadioButtonGroupC1EP7VDKFormig_signal_handler_disconnect_ZN14VDKApplication10MessageBoxEPcS0_iS0_S0_j_ZN9VDKObject17ObjectEventDetachE8VDKEvent_ZN11VDKMenuItemC1EP10VDKMenubarPKcPPcijhb_ZN14VDKProgressBarC1EP7VDKFormdd_ZN9VDKObject18ObjectSignalDetachEii_ZN8VDKTimerC1EP7VDKFormjb_ZN6VDKBoxC1EP7VDKFormi_ZN9VDKObject22FindSignalAtClassLevelEPS_Pc_ZN19VDKRadioButtonGroup11SetSelectedEi_ZN9VDKObject6WidgetEv_ZN9VDKObject32VDKObjectSignalResponseTableSizeEv_ZN11VDKTextViewC1EP7VDKFormP13VDKTextBufferi_ZN8VDKTimer4StopEv_ZN9VDKObject21VDKSignalUnitResponseEP10_GtkWidgetPcPv_initgtk_signal_emit_stop_by_namegtk_clist_thaw_ZN9VDKObject13SetBackgroundE6VDKRgb12GtkStateType_ZN7VDKForm11OnConfigureEPS__ZTI8VDKArrayIiE_ZN7VDKListI19VDKObjectSignalUnitE4findEPS0__ZTV8VDKArrayI9VDKStringE_ZN8VDKArrayI9VDKStringEeqERS1__ZN9VDKStringC1Ev_ZN13VDKTextBuffer5ClearEv_ZN9VDKObject31VDKObjectEventResponseTableSizeEv_ZN9VDKObject7DestroyEv_ZN9VDKObject17ObjectEventAttachEi_ZN12VDKValueListI5TupleE5fetchEi_ZN8VDKArrayI9VDKStringE6resizeEi_ZN14VDKApplicationD2Ev_ZN8VDKTableC1EP7VDKFormiii_ZN7VDKForm14OnChildClosingEPS__ZN13VDKCustomList9SelectRowEii_ZN9VDKObject7SetFontEP7VDKFont_ZN18ActivePagePropertycviEv_ZN15VDKNumericEntryC1EP7VDKFormiPc_ZN10VDKFileSelC1EP7VDKFormPcS2__ZN8VDKArrayIiED1Ev_ZN13VDKTextBuffer8GetCharsEii_ZN7VDKForm3AddEP9VDKObjectiiii_ZN7VDKForm9OnRealizeEPS__ZN8VDKTable6AddExtEP9VDKObjectiiiiiiii_ZN11VDKMenuItem3AddEP7VDKMenu_ZTS8VDKArrayIiE_ZN7VDKForm4ShowE17GtkWindowPosition_ZN8VDKArrayIiEaSERKS0__ZN9VDKObject10ShowWidgetEb_ZN14VDKCheckButtonC1EP7VDKFormPcS2__ZN7VDKListI18VDKObjectEventUnitE4findEPS0__ZN9VDKObject11EventAttachEi_ZN7VDKForm6OnMoveEPS__ZN8VDKTimer5StartEv_ZN7VDKFormD2Ev_ZN9VDKStringaSERKS_gtk_clist_get_type_ZN9VDKObject6EnableEb_ZN9VDKObject13WrappedWidgetEv_ZNK9VDKStringeqERKS_gtk_set_locale_ZN9VDKStringaSEPKc_ZN9VDKObject18ObjectSignalAttachEi_ZTI7VDKForm_fini_ZN12VDKValueListI5TupleEixEi_ZN7VDKForm5CloseEv_ZTI8VDKArrayI9VDKStringE_ZN9VDKObject21FindEventAtClassLevelEPS_Pc_ZN7VDKForm5RaiseEv_ZN11VDKNotebookC1EP7VDKForm_ZTV8VDKArrayIiE_ZN8VDKArrayI9VDKStringED1Ev_ZN7VDKForm8OnExposeEPS_13_GdkRectangle_ZN8VDKLabelC1EP7VDKFormPKc16GtkJustification_ZN9VDKObject11EventDetachEPS_8VDKEventg_type_check_instance_is_a_ZN13VDKCustomList10SelectionsEv_ZN9VDKObject25VDKEventResponseTableSizeEv_ZN9VDKObject22VDKObjectEventResponseEP10_GtkWidgetP9_GdkEventPvb_ZN14VDKProgressBar6UpdateEd_ZN11VDKNotebook7AddPageEP9VDKObjectPKcPPcS5__ZTI19VDKRadioButtonGroup_ZN13VDKCustomListC1EP7VDKFormiPPc16GtkSelectionMode_GLOBAL_OFFSET_TABLE__ZN14VDKApplicationC2EPiPPcS1_b_ZN7VDKForm14OnFormActivateEPS_bgtk_clist_freeze_ZN7VDKFormC2EP14VDKApplicationPci13GtkWindowType_ZN13VDKCustomList6AddRowEPPcS1_i_ZN9VDKObject16VDKEventResponseEP10_GtkWidgetP9_GdkEventPvS4_b_ZN14VDKRadioButtonC1EP19VDKRadioButtonGroupPc_ZN7VDKForm3isAEv_ZN9VDKObject17VDKSignalResponseEP10_GtkWidgetiPvS2_b_ZN8VDKArrayIiED0Evg_type_check_instance_cast_ZTI9VDKObject_Jv_RegisterClassesgtk_widget_get_typegtk_widget_set_usize_ZTI14VDKApplication_ZN12VDKStatusbarC1EP7VDKForm__gmon_start___ZN9VDKObject16ConnectingWidgetEvlibgtk-x11-2.0.so.0gtk_statusbar_pushlibgdk-x11-2.0.so.0libatk-1.0.so.0libgdk_pixbuf-2.0.so.0libpangoxft-1.0.so.0libpangox-1.0.so.0libpango-1.0.so.0libgobject-2.0.so.0libgmodule-2.0.so.0libdl.so.2libglib-2.0.so.0libpthread.so.0libstdc++.so.5_Znaj_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode_ZTVN10__cxxabiv119__pointer_type_infoE_ZTVN10__cxxabiv120__si_class_type_infoE_ZdlPv_ZNSi7getlineEPci_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv__cxa_end_catch__gxx_personality_v0_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE_ZTVN10__cxxabiv117__class_type_infoE__cxa_throw_ZdaPv_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev__cxa_begin_catch__cxa_allocate_exception_Znwj_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv__dynamic_castlibm.so.6libgcc_s.so.1_Unwind_Resumelibc.so.6memcpyiconv_openstrrchrstrcollstrncpymemsetsrandtime__assert_failstrcmpgetcwdsprintficonvaccessatoi_IO_stdin_used__libc_start_mainstrlenstrchr_edata__bss_start_end_ZN10MyLangForm22FindEventAtParentLevelEP9VDKObjectPc_ZN10MyLangForm11_STEntries_E_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZN10MyLangForm9showQuizzEv_ZN8MyConfigixEi_ZN10MyLangFormC1EP14VDKApplicationPiPPc_ZN10MyLangFormD2Ev_ZN7VDKListI5MyKeyE4HeadEv_ZN10MyLangForm13checkSectionsEv_ZTV15VDKListiteratorI9MySectionE_ZN5MyKey6GetIntEv_ZN10MyLangForm20VDKEventUnitResponseEP10_GtkWidgetPcP9_GdkEventPv_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZN7VDKListI5MyKeyE2atEPS0__ZN8MyConfigD1Ev_ZN8MyConfig3AddEPc_ZN10MyLangForm12QuizzDestroyEii_ZN7VDKItemI18VDKObjectEventUnitEC1EPS0__ZN7VDKListI9MySectionE5fetchEi_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEED0Ev_ZTIP11MyException_ZTI15VDKListiteratorI9MySectionE_ZN10MyLangForm12StartClickedEP9VDKObject_ZN10MyLangForm16setActiveButtonsEi_ZN10MyLangForm12SenseToggledEP9VDKObject_ZN5MyKeyC1EPci_ZN5MyKeyC1EPcS0__ZN15VDKListiteratorI5MyKeyEcviEv_ZN9MySectionixEi_ZN12VDKStatusbar4PushEPc_ZN15_VDK_Event_UnitI10MyLangFormEeqERS1__ZN7VDKListI19VDKObjectSignalUnitE9addToTailEP7VDKItemIS0_E_ZN10MyLangForm8useTimerEv_ZN12VDKValueItemI16_VDK_Signal_UnitI10MyLangFormEEC1ERKS2__fp_hw_ZN7VDKForm11ApplicationEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE3addERKS2__ZN9VDKStringcvPcEv_ZN10MyLangForm10SwitchPageEP9VDKObject_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEcviEv_ZN9VDKObject7SetSizeEii_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE5fetchEi_ZN15VDKListiteratorI9MySectionED1Ev_ZN9VDKCustom4SizeEv_ZN10MyLangFormC2EP14VDKApplicationPiPPc_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE5fetchEi_ZN14MyLangDrillAppC1EPiPPc_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEED0Ev_ZN9VDKCustom4ThawEv_ZN8MyConfigC2EPc_ZTV12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE_ZN8MyConfig7SectionEPc_ZN7VDKListI18VDKObjectEventUnitE9addToTailEP7VDKItemIS0_E_ZN9VDKObject6ParentEPS__ZN10MyLangForm11LoadClickedEP9VDKObject_ZTV15VDKListiteratorI5MyKeyE_ZN8VDKArrayI9VDKStringEC1Ei_ZN15VDKListiteratorI5MyKeyEppEi_ZN15VDKListiteratorI9MySectionED0Ev_ZN7VDKListI5MyKeyEixEi_ZN10MyLangForm12SignalDetachEP9VDKObjecti_ZN11MyExceptionD1Ev_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE4sizeEv_ZN10MyLangForm19changeAnswerButtonsEv_ZN7VDKListI14VDKRadioButtonEixEi_ZN10MyLangFormD0Ev_ZN15VDKListiteratorI9MySectionEC1ER7VDKListIS0_E_ZN15VDKListiteratorI5MyKeyED1Ev_ZN10MyLangForm17QuizzTextKeyPressEP9VDKObjectP9_GdkEvent_ZN11MyException5ValueEv_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE4sizeEv_ZN7VDKListI9MySectionE4findEPS0__ZN11VDKTextView5ClearEv_ZNK5MyKey4NameEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE5flushEv_ZN11VDKTextView8GetCharsEii_ZN9MySection3KeyEPc_ZN8MyConfigD2Ev_ZN14MyLangDrillAppD1Ev_ZN7VDKListI18VDKObjectEventUnitE3addEPS0__ZN8VDKArrayIiEC1Ei_ZN9MySection3AddEPc_ZN7VDKItemI9MySectionEC1EPS0__ZN7VDKListI9MySectionE6removeEPS0__ZN15VDKListiteratorI5MyKeyEC1ER7VDKListIS0_E_ZN7VDKListI9MySectionE9addToTailEP7VDKItemIS0_E_ZN11MyExceptionC1EiPc_ZN10MyLangForm15EventDisconnectEi_ZN18VDKObjectEventUnitC1EPvS0_Pc_ZN15VDKListiteratorI9MySectionE7currentEv_ZTS11MyException_ZN11MyExceptionD2Ev_ZN10MyLangForm10distributeEPiii_ZN10MyLangForm15loadLangDrillRCEbPc_ZN7VDKListI5MyKeyE9addToTailEP7VDKItemIS0_E_ZN10MyLangForm11ExitClickedEP9VDKObject_ZN9MySectionC1EPc_ZN8VDKArrayIiE4sizeEv_ZN10MyLangForm13ReloadClickedEP9VDKObject_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE4findERS2__ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEEC1Ev_ZN5MyKeyD1Ev_ZNK11MyException7MessageEv_ZN10MyLangForm21FindEventAtClassLevelEP9VDKObjectPc_ZTV10MyLangForm_ZTS20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE_ZN10MyLangForm22FindSignalAtClassLevelEP9VDKObjectPc_ZN9VDKCustom6FreezeEv_ZTI20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE_ZTS10MyLangForm_ZN7VDKListI9MySectionEixEi_ZTI12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE_ZTS12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZN9MySection6RemoveEPc_Z10strdup_newPc_ZTI20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE_ZN15VDKListiteratorI5MyKeyED0Ev_ZTI12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZTI14MyLangDrillApp_ZN9MySection6NumberEv_ZN8MyConfig4ReadEv_ZN10MyLangForm10QuizzSetupEiiii_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEED0Ev_ZN16_VDK_Signal_UnitI10MyLangFormEC1EP9VDKObjectPcMS0_FbS3_E_ZN7VDKListI5MyKeyE4TailEv_ZN12VDKValueItemI15_VDK_Event_UnitI10MyLangFormEEC1ERKS2__ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE9addToTailEP12VDKValueItemIS2_E_ZN14MyLangDrillAppD0Ev_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEED0Ev_ZN10MyLangForm12clearLessonsEv_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE6unlinkEi_ZN7VDKListI9MySectionE4TailEv_ZN15VDKListiteratorI9MySectionEppEi_ZN7VDKListI5MyKeyE5fetchEi_ZN5MyKeyC2EPcS0__ZN8VDKArrayIiEixEi_ZN15_VDK_Event_UnitI10MyLangFormEC1EP9VDKObjectPcMS0_FbS3_P9_GdkEventE_ZTI15VDKListiteratorI5MyKeyE_ZN9MySectionC2EPc_ZN10MyLangForm12EventConnectEP9VDKObjectPcMS_FbS1_P9_GdkEventEb_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE7currentEv_ZN7VDKListI9MySectionE2atEPS0__ZN7VDKListI9MySectionED1Ev_ZTV20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE_ZNK5MyKey3GetEv_ZN7VDKItemI9MySectionED1Ev_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE3addERKS2__ZN8VDKArrayI9VDKStringEixEi_ZN7VDKItemI5MyKeyED1Ev_ZN10MyLangForm8CanCloseEv_ZN16_VDK_Signal_UnitI10MyLangFormEeqERS1__ZTV12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEEC1Ev_ZN7VDKListI9MySectionE5flushEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE4findERS2__ZN10MyLangForm18QuizzAnswerClickedEP9VDKObject_ZN10MyLangForm15findLangDrillRCEv_ZN8MyConfig6RemoveEPc_ZTS20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE_ZTV14MyLangDrillApp_ZN7VDKListI5MyKeyEC1Ev_ZN6VDKRgbD1Ev_ZTSP11MyException_ZN10MyLangFormD1Ev_ZN12VDKValueItemI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZN10MyLangForm13SignalConnectEP9VDKObjectPcMS_FbS1_Ebb_ZN7VDKListI5MyKeyE3addEPS0__ZN10MyLangForm17VDKSignalResponseEP10_GtkWidgetiPvS2_b_ZN10MyLangForm13hideOrIconifyEv_ZN7VDKListI5MyKeyE6removeEPS0__ZN10MyLangForm26VDKSignalResponseTableSizeEv_ZN5MyKeyD2Ev_ZTI11MyException_ZN10MyLangForm9SelectRowEP9VDKObject_ZN14MyLangDrillApp5SetupEv_ZN7VDKItemI19VDKObjectSignalUnitEC1EPS0__ZN7VDKListI9MySectionEC1Ev_ZN9MySectionD1Ev_ZN10MyLangForm16parseLangDrillRCEP8MyConfigR11MyLangSetup_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEcviEv_ZN7VDKListI19VDKObjectSignalUnitE3addEPS0__ZN7VDKItemI5MyKeyEC1EPS0__ZN10MyLangForm25VDKSignalResponseListSizeEv_ZTS14MyLangDrillApp_ZN10MyLangForm9TimerTickEP9VDKObject_ZTI10MyLangForm_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE5flushEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE6unlinkEi_ZN7VDKListI5MyKeyE5flushEv_ZN7VDKListI9MySectionE4HeadEv_ZN5MyKey3SetEPc_ZN7VDKListI9MySectionE3addEPS0__ZTS15VDKListiteratorI9MySectionE_ZN10MyLangForm12newRandowSetEiiPi_ZN7VDKListI5MyKeyE4findEPS0__ZN19VDKObjectSignalUnitC1EPvS0_Pc_ZN10MyLangForm23FindSignalAtParentLevelEP9VDKObjectPc_ZN5MyKeyC2EPci_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE9addToTailEP12VDKValueItemIS2_E_ZTV20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE_ZN11MyExceptionC2EiPc_ZTS15VDKListiteratorI5MyKeyE_ZN5MyKey6SetIntEi_ZNK8MyConfig4NameEv_ZN12VDKValueListI5TupleE4sizeEv_ZN9MySectionD2Ev_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEED1Ev_ZN10MyLangForm21VDKSignalUnitResponseEP10_GtkWidgetPcPv_ZNK9MySection4NameEv_ZN8MyConfig6NumberEv_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEC1ERK12VDKValueListIS2_E_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE7currentEv_ZN10MyLangForm16SignalDisconnectEi__data_start_ZN12VDKValueItemI15_VDK_Event_UnitI10MyLangFormEED1Ev_ZN15VDKListiteratorI5MyKeyE7currentEv_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEED1Ev_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEppEi_ZTS12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE_ZN8MyConfigC1EPc_ZN10MyLangForm12AboutClickedEP9VDKObject_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEppEi_ZN7VDKListI5MyKeyED1Ev_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEC1ERK12VDKValueListIS2_E_ZN6VDKRgbC1Eiii_ZN10MyLangForm5SetupEv_ZN15VDKListiteratorI9MySectionEcviEv_ZN10MyLangForm12SignalAttachEiGCC_3.0GLIBC_2.1GLIBC_2.0GLIBCPP_3.2CXXABI_1.2 P&y 60ii 6ii (6r)26勵k>6噺!Vb@Pざ╋ 斡 感 原雫清超閥牟亢垓(惷*楸3犇5箒7莇:豢;雍=?@EFHI RVY[] ^$_(a,d0j4l8q<s@uD{HLPTX\`dhlptx|し┠扱慣厳七牲跳鳩矛亰垠愀楫 犒 箏莊豬襍#')/3 8:;=C E$J(O,P0R4X8^<a@cDdHfLhPkTlXm\p`udvh}lptx|Ul菁秒5%%h蛟%h蚩%ざh蘋%╋h薜%h %斡h(%感h0%原h8p%雫h@`%清hHP%超hP@%閥hX0%牟h` %亢hh%垓hp%惷hx蜷%楸h蛟%犇h蚩%箒h蘋%莇h薜%豢h%雍h%h%hp%h`%hP%h@%h0% h %h%h%h蜷%h蛟% h蚩%$h蘋%(h薜%,h %0h(%4h0%8h8p%<h@`%@hHP%DhP@%HhX0%Lh` %Phh%Thp%Xhx蜷%\h蛟%`h蚩%dh蘋%hh薜%lh%ph%th%xhp%|h`%hP%h@%h0%h %h%h%h蜷%h蛟%h蚩%しh蘋%┠h薜%h %扱h(%慣h0%厳h8p%七h@`%牲hHP%跳hP@%鳩hX0%矛h` %亰hh%垠hp%愀hx蜷%楫h蛟%犒h蚩%箏h蘋%莊h薜%豬h%襍h%h%hp%h`%hP%h@%h0% h %h%h%h蜷%h蛟% h蚩%$h蘋%(h薜%,h %0h(%4h0%8h8p%<h@`%@hHP%DhP@%HhX0%Lh` %Phh%Thp%Xhx蜷%\h蛟%`h蚩%dh蘋%hh薜%lh%ph%th%xhp%|h`%hP%h@%h0%h 1^粽PTRhhQVhU菴US[tt]秒U=Xu)t辧u詁X秒Utt hk秒U(EEEEEEEE汰 u蘚U仭仭 EEE;EU仭仭$;Eu|E汰0tbU仭仭,(EUEtEE憺EUEHEuEEPU<uEE}t E"EPuuuu us EE槁UEE汰 uE諫E秒U EE汰 u{U仭仭 EEE;E uNU仭仭$;Eu6E汰0tU仭仭0EEEiEE秒U} x; Ehu9E !E 汰0EEE秒Ux RPuu EPv EPEDPHvt Euu u;r鏡EE秒UjuEqE}u=Etuu ut EjuqE觧EE秒UEUEUEU EU酘E j 茹EEuu uu莠oEE蓚@xx|}t u.|x x莟uEP萇e uuuu EPt wE tEPuu u%E xEPuu uwwE}}}tGjjjujh u HPu PP* pEjjjujh u Pu EP莠P蓊 ppE夐! EDPDs存)HE u 蓴t+Pu 萼PLl llEEPEDPdE塢UWVSEEDPEPZs EP荅su EP莊sh日蒼E;E uI}~uu取PuEDPid EPsdejEP/sE[ EP葷rd/`` EP莟r` `萋de[^_秒UWVS讙EEEEDPEP/r EP~ru蚯 EPrh日蒼h;EhuPmus}tmEU`d`t`XdU`HXudEPX<uEjEP莊q}t EP_q\\uuu u葩l EP.q\/TT EP qT T \e[^_秒Ux RPuu EP q EPETPbqt Euu u;l鏡EE秒Uju;kE}u=E|uu ut Eju蔕jE觧EE秒UEUEUEE鐺E j 茖EEuu uu蒿iEE蓚@xx|}t u*|x x茘uEPka uuuu EP莪o wE |EPuu u%E EPuu uwwE}}tGjjjujh\u NPu P P0 pEjjjujh\u Pu KP菎P蓍 ppE夐! ETP荳`存)HE u 蔔t+Pu 葮PRl llEEPETPQ`E塢UWVSEETPEPn EP葭nu EP葹nh日蒼E;E uI}~uu取VuETP!` EP8ndejEPYnE[ EPnd/`` EP葮m` `萍de[^_秒UWVS讙EEEETPEPYm EP荐mu蚰 EP莇mh日蒼h;EhuPsuv}tpEU`d`t`XdU`HXuudEPX<uEjEP葆l}t EPl\b uuuu u蔕f EPOl\/TT EP,lT T\e[^_秒U ExpExpP P蓊EE P萍EE P莎E}%h@E阿莚hEE PsEuuu莠H uuuuuRI ExpExpPPEPAEE貮U Eh0Pk0E< jE<P.E< jE<P秒UEUE;|AME<t! ME4JE覩Et E#E(t.E(E}t u | u 秒U E操P莚EE操PjuEE;E|EEE;E|_EE<tCEE ;Eu)EEE U E EEEr}t u 秒U(EE,粹巡巡tGjE00%uDEE00EPEPho蝙E00h_jh茘uREhh蓖PI PhEPEPho蔔xjhEu8EhEP萃EPho茫* hhhh@E秒UWVS賍E EuPR jDCuD xDF88EEE^uuuuu uuuEE;E |tEE;E|\EE;E|DEE;Eu(EE;EuE UE E覯EE}t u蓙K}t u粫7e[^秒US$ u 荳sEt u琥吹 u琥4E u)gP蒻 hx蒭EE}t u樊f u樊腿ZEdE]琥C] u琥5hzu -pE}hu蔟jE}t%j u蓚gPEP莊hu莇jE}t] u蓆ghujE}t(hutgPEP@hu?jE}t(hu0gPEP蕣hu蕀iE}t%ju蓖fPEP荵hu荳iE}t%ju莅fPE"PzhuyiE}t%jumfPE&P9hu8iE}t] upf,huiE}t] u=f4hu菻hE}t] u f0] u ypHE] E操PEE u %p9E|`uu XEE;Et4 u蓙jP菘bMEEEEEE]秒USE P蒭EE ;EEE;E | ME<ME<PuHME< jME<PEWE EE;E| ME<ME<P<uHME< jME<PME hMEPE EE;E| ME<ME<PuHME< jME<PEWE< } 鏡PE<PE< } 鏡PE<P]秒USt Eh菻E u蓙JE簀E }tEE帝EE珍P莪E槐E}t E;E|藝}~薇 j }tuu蓙KE宣UUuEh0P菲KPRP菫NPE(iE u跏fEE EEEE3uu萋E P茲EEEU9U~EEUUEE E愾PE E愾PjEuuuuuuuu{EE;E|zEEEE}t3E UE; }EEE)E詬 j }tuu蓙0JE企EEuEh0PJP蓐PPMPE(SgEuu跏QEMEE EE乞uu疲^Eu疲~_EuMEEPUEyEEEEE}t3E UE; }EEE)E詬 j }tuu蓙HEEEuEh0PHPkOPKPE(菻eEuu跏`PEEx EE乞uu疲*^Eu疲o]EuExPUMEE<EEEEE}t3E UE; }EEE)E詬 j }tuu蓙SGEEEuEh0P>GPNP4JPE(vdE]uu跏OUEEx EE娯uE萎莪\EE萎蓖[EuExPU}t u匁}t u俶耡}t u樊參]秒U EEP< EpEpP P+E} E薇MU佰仭UE E姶Eh RPEhPE EEEEE秒US jjhu u蒡 E EDPE ETPkEUE,UE0EEhEPh"EP蓆h&EP萼h)EP莠h2EP茖h:EPhEPqhCEPXEEE E$EEEEUEE(E4EtAE] EDPC]E] u] u']秒US jjhu u萃 E EDP蓁B ETP?CUE,UE0EEhEP葮h"EP菎h&EP荅h)EPh2EPwh:EP^hEPEhCEP,EEE E$EEEEUEE(E4EtAE] EDPWA]E] u蒂] u蕀]秒USEEt E Et E蓍 u=E] ETPA] ETP蕈@E] EDP|@] EDPc@"E] u蓚] u u莽t uE]秒USEEt E蓖Et E莽 u#E] ETP蕘?] ETP葢?E] EDPb?] EDPI?"E] u蔆] u蒡 u莎t u+]秒USEEt E萼Et E莎 u E] ETP蓊>] ETP菠>E] EDPH>] EDP/>"E] u莊] u蕚 ut u]秒U h`蒹 EEP<u EuF EEPu"E jEP秒UE玄u+EPh& u h u.E}t}}t :}t$2E9 h萸E u菫 EEE秒UVS h|萋EEuu蓆EE粳.EEE}t uYUU u蒹 hhEEjjhjjhuu蔆 EE琺4EE|}t u蓍|U ur h\蔘xwuxTxE樣:EEpwt xspU u蕣El hvhgjjhjhuhe hl:EE`gt h葮`U uduu琥凝 h蕚\[jjhjjhu\6 \E琺:EET[t \ETU u萠 h\QPOuP莪PE樣:EEHOt P莽HU uXED h菻@?jjhjhu@菫 @D:EE8?t @78U u萓uu琥E(jjjjuu h43 jjju4荵 4E蓚:EE,3t 4,U uE( h$#u$|$(:EE#t $U uE(jjjjuu E(jjjjEu j茫P萵 u^E jEPR(:EE t  U uトEPE(u jE愬E}~'E4] hU3E誄EPE0bEPE0FE h@m juju l:EEt 葮U udjElAE}~5EE<t EE4TE訝}t u懈9 jjhElE E hJ龠 jjhu渠莪 |:EE蹊藷t 渠莇蹊U u?E|(蕈jjjjE紆h珱燼jhu朽菎燼珱紆PE|蕈 :EE戛淳t 朽蒻戛U usE奩 hX蓁傲ju黍傲奩d:EE美熟t 黍`美U u蓍Ed(jjjjE|Ed E P莇EE PEE PE uujuu| EE PQ9E|OME< jME<PE jjhEdE hXE逓寵ju議萵逓E秘:EU周獣t 議菫周E uJ h萢向捲 jjhu妓3 向U帝:EE蔭酬t 妓B蔭U u菲E P菠EE P莖EE(jjjjEh蕈jh'u気&Pu :EE州t 気TU u葩E(jjjjuu E(jjjjEhjju Pu :EEt wU uE jEPE(jjjjEh83|{jjh@hju|w{|Pu :EEt{t |tU uE< jE<PE< jE<P湖IjRPhqE惟uO jjhuE茫 hX蓚pojuppE宣:EUhot pghE u蒡E(djjjjhZ`_jhu`_`Pud :EEX_t `莠XU uEE(TjjjjEPh荀LKEPjuL菠KLPPuT :EEDKt L蔕DU uE jEPE(@jjjjh莉<;jhu<蒹;kEEPEPhRuよv h荀uE蕣E:EEt U u茲EPEPhRuよ娟 huE[E:EE|t z|U u}t uよ2E稲EUE(jjjjEu E(jjjjuu hxw jjhuxu xE:EUpwt xpE u E(ljjjjUhhndcEPjudcdhxPul :EE\ct d萓\U uIEx jExPE(jjjjuu E(XjjjjETh8\POjjhh'uPOPTPuX :EEHOt P莅HU u7E(DjjjjE@h8<;jjh.hLu<蒂;<@PuD :EE4;t <蒻4U us hEhUuE0 h@菁,+ jEPju,^ ,0h:EE$+t ,4$U u莉jEhEUE;|,jjUE操PEh^E訥}t uE(jjjjEhu E( jjjjEh8jjh]hwu莽Pu  :EEt 葩U ufjjjjjjjjuu蓙0jjjjjjjjE h|茗u Pu蓙0:EEt U uE h ?RPRPu鋸{ :EE顫女t 鋸q顫U u蓼Eh ?RPEhPE, hjjEP'EPE,P#E] EP] uY EP蕀E hhhEP荅EPEP#E] EP] u葮 EP}jjjjjjjjEu蓙茖0 u荼e[^秒UE ;EEHE}yLME4un ME4]E覓Et EFEt E&秒US$E ;E] E 操P葮] E 操P萓EE;E |薤EU曹UE h8蔡E貽Ejjhhuu跏; EUM.EEE}t u跏pUU u琥uuME4蔗MEEEd(jjjjME4Ed VJjjRPhME4u蕀 MEEEE;E |.uuME4E詒uuE萵]秒Ujjjj@hh`u?P 秒UE玄t2 EEP<tyjjjjhhu菲P E}u EVEE jEP EuEE秒U(hhP蕚 h跫謠hPu蓴p旧.跫F瑙瑙粹暑t 旧d粹瑙 朽蒟j渠jPguMPjuvj/P竟;竟v 竟秒UUE ;t EdEEEx uKhq zPE惟P/P萋u uEE秒U(E@UE ;tUE ;tjjE惟蹊E娯u E萎j'蕈 E萎蔬'蕈旧笈E U;<女tyE8E@E8淺E@漿d$$E8h@P蔔 E惟 uLE@E8淺E@漿d$$E8hP PE阿JE8E@漿d$$E EEP< EEP< EpEpP P_顰署&署~E P0顰E8顰紆紆9u#E8~ Eu秒UEPju秒UVSp EhPC  El ElEl jVEE}~'E4] h'3E誄 Eh0P9 Eh菁EjEPo u跏m EuEPd uEP EE;E| j }tuu跏 EEEuEh0P萢 PP菽P uEPP3ErEE Eh菁9E|EE;E|ruEP P j uEh0P# P蔗Pt uEP蓍 EEEEUEE}t E;E|蜃}~蛔 j }tuEP~ EUUuEh0Pi P:P_PE(茵)E霰E u韆7'9E|( uu韆 P"PE0 uu韆P+!PE0hEl E}t hhhEPkhhhEPKEPElPUE] EP9]D EP%jjuElOE0E蘋E E] EP] EP蓆#E] EP] u蔗 EP萵 ElE}~5EE<t EE4蒄E訝}t u莠Et Ete[^秒USE E}u Ejhh@u跏FEEE}u"hE阿*E0] E`E`PEE]秒UEtuju蔔秒UE@E8hE阿?RPEZ ut u0 EhP萓tM EhP茵t.Eh jEhP秒UEE鹸 E姶4Eh RPEhP EEP<uEju"E jEP uQEEKEh EE漿揶渝d$$EhP秒US4粽)呈lu EPEP EPj EP蓊E#E] EP菘] u俶E]秒Uu u菻ugj <EEu uiEuuy.EEE}t u萋EE u韆R秒Uj`萢EEu u`Euu.EEE}t uWEE u韆秒Uu u&E}u EEx\tEP\E@XBX EURXPExXtEPXE@\B\ EUR\PEH EE}t u葹 uEE秒Uu u莇ugj EEu u茵Euu莟.EEE}t u EE u韆秒UE@ 秒Uj`EEu uEuu茗.EEE}t u茱EE u韆1秒Uu u蕈E}u EEx\tEP\E@XBX EURXPExXtEPXE@\B\ EUR\PEH EE}t u莵 u蓚EE秒UEUE BEE} t E 操PiEEEUB秒UEExtExt Ep?t uE秒UVSE;E ExtExt Ep蓐UE @B] E@操P荐CEEU;P|+UE4ZM EA3E詒Ee[^秒UE@秒UH E EE菫P.EEEUBEUUEEEHE}tk u蓊EE}u瘠JEEE}t3E+E霑UUmE9Eum u懈謔UU樣EE/UU}t EPEE u樊P蒹秒U萬PE阿 @d秒Uu EX 萃PEL菻P秒U EX秒Uuu EXk秒Uu EP荐秒Uu EP秒UE@ 秒U EDP葩秒UEUEUUE MEUADQHE@LE@Pj?uEPE@C秒UE@E}t u u莽u E@XE諍E秒UEUE @BUE @BUE @B 秒UEt uf秒UEx 鏡秒UUE@ @XB 秒UE@ 秒UEUEUUE MEUADQHE@LE@Pj?uEP`E@C秒UE@E}t u uu E@XE諍E秒UEUE @BUE @BUE @B 秒UEt uB秒UEx 鏡秒UUE@ @XB 秒UE@ 秒UE@ 秒US jjuu u萵 EUE BUEBh'u|"E] u] u-]秒UE u^t uT~秒UEE}tE;E u E@E諠}t EEEE秒UEE@E}tE;E |EE@XE諤E秒U緝UEE}tE;E u E@E諠}t EEEE秒UEE@E}tE;E |EE@XE諤E秒U緝UEExtExt Ep蓚t u蔡|秒UEE@E}tE;E |EE@E諤E秒U EUE ;B}} x E.EE}tE;E |EE@E諤EEE秒UE@E}u9E@XEEE}t uS u|EE訖EUB@E@ 秒UE uvt u莪{秒UE@E}u9E@XEEE}t u3 ue{EE訖EUB@E@ 秒UE uvt u{秒USEU @;Bt EWEEU;P}3uu蕣uu 蓍;tE訛EU;P鏡EE]秒UEExtXExtOUE@操RUEU9Pum uLx諧 E@P蔘~t u蕀y秒Uu u秒U EUE ;B}} x E.EE}tE;E |EE@E諤EEE秒Uu u秒U EUE ;B}} x E.EE}tE;E |EE@E諤EEE秒UEE UPR菽wuEU ;uEE秒UEt ux秒UEE UPRUwuEU ;uEE秒UEt u0x秒UE uyt u蔬w秒UEE hd}EEEpEpuu4EUB.EEE}t uwUU u跏| E@,EpE@jEp秒UEU @;Bt E[EEU;P}7uu %P uuP茲yuE訃EU;P鏡EE秒UE}t; ux@E E@PJ{EE@PuuqyE秒USEU ] uC]秒USEU ] ugC]秒U Epv秒U Ep蒻u秒UE秒UE@秒US] u 蕘C] u蓍]秒US] u 萇C] u莎]秒US] u C] j 蕈yuhE0z]秒US] u KC] j 茣yuhE0菠y]秒UExt EpyE8t E0}y秒UExt Ep[yE8t E0Cy秒UE秒USE8t E0y] u k]秒UE 0莵w秒USE8t E0菷x] j xu hE0莅x]秒UE@秒US EP莪E@EE u 荳U&E] EP] u蒿w]秒US EPFE@EE u PU&E] EP+] u|w]秒U(E8t E0wEPEPg EP葯uG EP葩E}t u粫哈 u粫\rjEP莎襪 EPX EPf秒U(E8t E0蒟vEPEP莖 EP,uG EP)E}t u粫 u粫qjEP襪 EP茲 EP莢秒US4EPEP EPu] EPE uiu P蒡ou] EP]夐)jEPN EP蔡EE]秒US4EPEPh EP葹uZ EP葆E u荵u PBou EPm藏jEP茖 jZuE堝Eju u壽EE%EEE}t u壽oEE秘 uEP E@#E] EP莽] u疲@t EP莢]秒U8EPEP5 EP莅u EP荐E uu P nuTuEPEE}t u壽a u壽nEH EP蔗%jEP-K EP萢秒UE@秒UE秒US EP葢E@EE u 茲U&E] EP萇] u萸r]秒US EPzE@EE u :U&E] EP_] ufr]秒U(E8t E0rEPEP EPuG EPE}t u粫2 u粫FmjEP蓍襪 EP EP秒U(E8t E0蔆qEPEP蒟 EP`uG EP]E}t u粫~ u粫ljEP5襪 EP葷 EP蒿 秒US4EPEPJ EP菽u] EP萓E uku P蒭ju] EPL]夐)jEP EP%EE]秒US4EPEP  EPuZ EPE u莉u P,ju EP茵 藉jEP蒄  jDpE堝Eu u壽寿EE%EEE}t u壽jEE秘 uEPE@#E] EP ] u疲,o EP蓙 ]秒U8EPEPk  EP葢 u EP葆 E uu P蔕huTuEP菁 EE}t u壽苧 u壽iEH EP* %jEPc K EP 秒UE@秒UE秒UWSE蕀初込鶫奢傀jE0P蔔lh蕈PPiE処#t処;t処[;蕈j]Pg糴巡tQ蕈@9糴vB糴蕈@Ph蕀P}m蕀Pu萠juE0h戉PGm jzm戉Pj蓊 jf=||t 菻g|蚌jhh蕈j=P荼j糴巡|蕈@9糴i糴蕀h2P2fz蕈h3Pfu#糴@PhBWf奢蕈hHP萼eu#糴@PhBf傀蘚蕈糴@峻蕀hXPqe蕘 気萸g PPPP虐j jjjj虐zj 蕘出蕀hXP莟d蕣 g PPPP黍葭i jjjj黍荳i 蕣気 蕀Pu菴PN 気 蕀PuPpP蘿uE0h戉P茲i j蒄ixw戉Pjx@x j]bpp=||lwt x/dl|0jhp蒿d PBet P茗b P萸auE0h戉Ph j菴hhg戉Pjh(h jEa``:||\gt hc\|jh`蔆c|| P荀a| |_ge[_秒Uu uTugj 萓gEEu u菲Euu葮.EEE}t uJbEE u韆f秒Uu uugj %sLoaded drill file: %s O ApplicationcompatVersionsensedirectSenseNamereverseSenseNamequizzAnswerNrtimerlimitedAnswerNrlimitedAnswershideWindowuseTimer--disabled--Language Drills1015035JapaneseEnglish00.00.0025Stop the timer first if you want to exit. Now we hide app _timerRunning %d Thanks for using Language Drills. FileExit LangdrillHelpAboutWordsWhat's this ? Multiple QuizzPress when you finish entering the answerSubmitkey_press_eventSimple QuizzTime Step (minutes)Answer StepHide WindowUse Answer StepUse TimerTimer SetupSensePossible Answers ( < 99 )Reload the current configuration file.ReloadLoad other configuration fileLoad ...LessonsStart/Restart quizzes ...Start/ResetClick to choose thisclicked Brought to you by Ionutz Borcoman Nothing would have been possible without Mario Motta's VDK Let's talk about Language Drills Are you sure you want to close the Language Drills ? The Timer seems to be active !Language Drill Message%s/*.drillChoose a lesson pleaseBravo ! [ %d (%3.2f%%) good from %d ]Sorry ! [ %d (%3.2f%%) good from %d ]Y@ was not triggered by a RadioButton !Starting quizzes. All counters set to 0.T& VDKValueList::operator[](int) [with T = Tuple]/usr/include/vdk2/vdk/value_sem_list.hn>?@/AAOB*BCCDD:EEEFFFF _ -e{P),   %3SBq #8T} #?h #8T} #?hToB EOl 5Hq=/>_/>_/>_/>_?Rp     6    #8T} #8T}/AUit  H張 I6  餅@oLoo4"2BRbr≫俄鯛吮矮鰾"2BRbr√峨代吶矼鱚"2BRbr∽我台吩砌鱠"2BRbr∝牙大吝砒鱧"2BRbr∵画第呎礦鱶"2BRbr∫臥醍咏砠鱸"2BRbr∬芽題呵礪鳧"2BRbr蛾鷹咎硅GCC: (GNU) 3.2.3 20030407 (Debian prerelease)GCC: (GNU) 3.2.3 20030407 (Debian prerelease)GCC: (GNU) 3.3.1 20030722 (Debian prerelease)GCC: (GNU) 3.3.1 20030722 (Debian prerelease)GCC: (GNU) 3.3.1 20030722 (Debian prerelease)GCC: (GNU) 3.3.1 20030722 (Debian prerelease)GCC: (GNU) 3.2.3 20030407 (Debian prerelease).symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame_hdr.data.eh_frame.gcc_except_table.dynamic.ctors.dtors.jcr.got.bss.comment#(( 1HH 7  ?張%I6Go\<ToLL_c 餅_@l   ` ucp  d{跌k   @ ``  !DTT0445H||666688I9X?0 (\7(H張L餅    跌  `T4| |*8EIXU4 kp wP @5k}" ,?j u,x< Ldf+" B` 8\ysd" l1| , BL6 `Jr寂g " J 問!樞a " Upr hn !^]9" 趙BO" ^y oz2 D ^!" *m\" m+" -a " M!`G4 0 !S J  =R gpqJ wp3 " d" KXd@" ,.!H<I_mB" `" L\ ^D" U l;g ; |_  d^1"  i\"  a" 8 R | Xo" 弱 悶 _ " rS)  ,f" _ H`" x h;" +" ,d+" ,  槭= i;" x gv" 6n+" 跂 l"  c4"  08 wi J pp ! n ,7 <0a " 2L]4z u^D" \D` " HL !2a " Wa=" tl" |T+" l"   0a " \)pp AX " Q, -]" Oj cF" +" 惹CI p  Da " Re " G" d" 紋樔:r  趾.jp" id"" a "   u x h9" -W" XYM" lu4 B!" GT" NF" %dD" VLp( m,!F( `." >hG" !'2 " R !dtp yPo}" <4 LI D" 9G bLsi uZ " Na " \lq:a " dM& ;,!qe:" i;" [" 2]," +q: 9p  Uk !|f9!k &c4" =!z !m" !`1!w (oS 9!u+" @跌 !  !3w  J } ^主C~門LE" 槫Rk9" /:eZ" m " B_1" 趺   7^F" YN" bn9" j9" , 簾 *<|ILW"  " !@"  l\" " p3 4 LQT \" h ^fZ" ! \ ri 頤U f" 6" 6e2" 6_" 6o7&7 # >7朱Q7P!f7夜7 " 7 7樣c7珠S call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxmain.cc_ZZN12VDKValueListI5TupleEixEiE19__PRETTY_FUNCTION__config.cc__dso_handle_ZN8VDKArrayIiEeqERS0_gtk_statusbar_push_ZN10MyLangForm22FindEventAtParentLevelEP9VDKObjectPc_ZN9VDKStringC1EPKc_ZN7VDKMenuC1EP7VDKForm_ZN10MyLangForm11_STEntries_E_ZN8VDKFrameC1EP7VDKFormPcii_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZN10MyLangForm9showQuizzEv_ZN9VDKObject16VDKEventUnitPipeEP10_GtkWidgetP9_GdkEventPv_ZN8MyConfigixEi_ZN14VDKApplication20SetGarbageCollectionEj__cxa_allocate_exception@@CXXABI_1.2_ZN10MyLangFormC1EP14VDKApplicationPiPPcgtk_object_get_type_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCPP_3.2_ZN10MyLangFormD2Ev_ZN9VDKStringD1Evstrchr@@GLIBC_2.0_ZN7VDKListI5MyKeyE4HeadEv_ZN10MyLangForm13checkSectionsEv_ZN7VDKForm9OnIconizeEPS__ZTV15VDKListiteratorI9MySectionE_ZN9VDKObject6SetTipEPc_ZN9VDKObject20VDKEventUnitResponseEP10_GtkWidgetPcP9_GdkEventPv_ZN5MyKey6GetIntEv_ZN10MyLangForm20VDKEventUnitResponseEP10_GtkWidgetPcP9_GdkEventPv_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZN7VDKForm8OnResizeEPS_R8VDKPoint_ZN7VDKListI5MyKeyE2atEPS0__ZN8MyConfigD1Ev_ZN8MyConfig3AddEPc_ZN10MyLangForm12QuizzDestroyEii_ZN7VDKItemI18VDKObjectEventUnitEC1EPS0__ZN7VDKListI9MySectionE5fetchEi_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEED0Ev_ZN7VDKForm14WindozeMessageEijm_ZTIP11MyException_ZN9VDKObject13SetForegroundE6VDKRgb12GtkStateType_DYNAMIC_ZN9VDKObject17VDKSignalUnitPipeEP10_GtkWidgetPv_ZTI15VDKListiteratorI9MySectionE_ZN10MyLangForm12StartClickedEP9VDKObject_ZN10MyLangForm16setActiveButtonsEi_ZN10MyLangForm12SenseToggledEP9VDKObject_ZN5MyKeyC1EPci_ZN5MyKeyC1EPcS0__ZN15VDKListiteratorI5MyKeyEcviEv_ZN9MySectionixEi_ZN9VDKCustom12ActiveTitlesEb_ZN12VDKStatusbar4PushEPc_ZN15VDKCustomButtonC1EP7VDKFormPKcS3_j15GtkPositionType_ZTS8VDKArrayI9VDKStringEgtk_statusbar_get_type_ZN15_VDK_Event_UnitI10MyLangFormEeqERS1__ZN9VDKObject23VDKObjectSignalResponseEP10_GtkWidgetiPvb__dynamic_cast@@CXXABI_1.2_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCPP_3.2_ZN7VDKListI19VDKObjectSignalUnitE9addToTailEP7VDKItemIS0_Estrcmp@@GLIBC_2.0_ZN10MyLangForm8useTimerEv_ZN14VDKApplication3RunEvgtk_signal_connect_full_ZN12VDKValueItemI16_VDK_Signal_UnitI10MyLangFormEEC1ERKS2__fp_hw_ZN7VDKListI14VDKRadioButtonE5fetchEi_ZN7VDKForm11ApplicationEv_ZN7VDKForm9OnRestoreEPS__ZN7VDKForm9ShowModalE17GtkWindowPosition_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE3addERKS2__ZN7VDKForm4HideEviconv_open@@GLIBC_2.1_ZN9VDKStringcvPcEv_ZN10MyLangForm10SwitchPageEP9VDKObject_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEcviEv_ZN9VDKObject7SetSizeEii_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE5fetchEi_ZN15VDKListiteratorI9MySectionED1Ev_ZN9VDKCustom4SizeEv_ZN10MyLangFormC2EP14VDKApplicationPiPPc_ZN11VDKMenuItemC1EP7VDKMenuPKcPPcjhb_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE5fetchEi_ZN14MyLangDrillAppC1EPiPPc_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEED0Ev_ZN7VDKForm6OnShowEPS__ZN8VDKArrayI9VDKStringED0Ev_ZN9VDKCustom4ThawEv_ZN10VDKMenubarC1EP7VDKForm_ZN8MyConfigC2EPc_ZN19VDKRadioButtonGroupC1EP7VDKFormi_ZTV12VDKValueListI15_VDK_Event_UnitI10MyLangFormEEg_signal_handler_disconnect_ZN14VDKApplication10MessageBoxEPcS0_iS0_S0_j__assert_fail@@GLIBC_2.0_ZN9VDKObject17ObjectEventDetachE8VDKEvent_ZN11VDKMenuItemC1EP10VDKMenubarPKcPPcijhb_ZN8MyConfig7SectionEPc_ZN7VDKListI18VDKObjectEventUnitE9addToTailEP7VDKItemIS0_E_ZN14VDKProgressBarC1EP7VDKFormdd_ZN9VDKObject6ParentEPS__ZN10MyLangForm11LoadClickedEP9VDKObject_ZTV15VDKListiteratorI5MyKeyE_ZN9VDKObject18ObjectSignalDetachEii_ZN8VDKArrayI9VDKStringEC1Ei_ZN8VDKTimerC1EP7VDKFormjb_ZN15VDKListiteratorI5MyKeyEppEi_ZN6VDKBoxC1EP7VDKFormi_ZN15VDKListiteratorI9MySectionED0Ev_ZN7VDKListI5MyKeyEixEi_ZN10MyLangForm12SignalDetachEP9VDKObjecti_ZN9VDKObject22FindSignalAtClassLevelEPS_Pc_ZdlPv@@GLIBCPP_3.2_ZN11MyExceptionD1Ev_ZNSi7getlineEPci@@GLIBCPP_3.2_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE4sizeEv_ZN19VDKRadioButtonGroup11SetSelectedEi_ZN10MyLangForm19changeAnswerButtonsEv_ZN7VDKListI14VDKRadioButtonEixEi_ZN10MyLangFormD0Ev_ZN15VDKListiteratorI9MySectionEC1ER7VDKListIS0_E_ZN15VDKListiteratorI5MyKeyED1Ev_ZN9VDKObject6WidgetEv_ZN10MyLangForm17QuizzTextKeyPressEP9VDKObjectP9_GdkEvent_ZN11MyException5ValueEv_ZN9VDKObject32VDKObjectSignalResponseTableSizeEv_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE4sizeEv_ZN7VDKListI9MySectionE4findEPS0__ZN11VDKTextView5ClearEv_ZN11VDKTextViewC1EP7VDKFormP13VDKTextBufferiaccess@@GLIBC_2.0_ZNK5MyKey4NameEv_ZN8VDKTimer4StopEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE5flushEv_ZN11VDKTextView8GetCharsEii_ZN9VDKObject21VDKSignalUnitResponseEP10_GtkWidgetPcPv_initgtk_signal_emit_stop_by_namegtk_clist_thaw_ZN9MySection3KeyEPc_ZN8MyConfigD2Ev_ZN14MyLangDrillAppD1Ev_ZN7VDKListI18VDKObjectEventUnitE3addEPS0__ZN8VDKArrayIiEC1Ei_ZN9MySection3AddEPc_ZN7VDKItemI9MySectionEC1EPS0__ZN9VDKObject13SetBackgroundE6VDKRgb12GtkStateType_ZN7VDKListI9MySectionE6removeEPS0__ZN15VDKListiteratorI5MyKeyEC1ER7VDKListIS0_E_ZN7VDKListI9MySectionE9addToTailEP7VDKItemIS0_E_ZN11MyExceptionC1EiPc_ZN7VDKForm11OnConfigureEPS__ZTI8VDKArrayIiE_ZN10MyLangForm15EventDisconnectEi_ZN18VDKObjectEventUnitC1EPvS0_Pc_ZN7VDKListI19VDKObjectSignalUnitE4findEPS0__ZTV8VDKArrayI9VDKStringE_ZN15VDKListiteratorI9MySectionE7currentEv_ZTS11MyException_ZN11MyExceptionD2Ev_ZN8VDKArrayI9VDKStringEeqERS1__ZN9VDKStringC1Ev_ZN10MyLangForm10distributeEPiii_ZN13VDKTextBuffer5ClearEv_ZN10MyLangForm15loadLangDrillRCEbPc_ZN7VDKListI5MyKeyE9addToTailEP7VDKItemIS0_E_ZN10MyLangForm11ExitClickedEP9VDKObject_ZN9MySectionC1EPc_ZN8VDKArrayIiE4sizeEv_ZN9VDKObject31VDKObjectEventResponseTableSizeEv_ZN9VDKObject7DestroyEv__cxa_throw@@CXXABI_1.2_ZN9VDKObject17ObjectEventAttachEi_ZN10MyLangForm13ReloadClickedEP9VDKObject_ZTVN10__cxxabiv120__si_class_type_infoE@@GLIBCPP_3.2_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE4findERS2__ZN12VDKValueListI5TupleE5fetchEi_ZN8VDKArrayI9VDKStringE6resizeEi_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEEC1Ev_ZN5MyKeyD1Ev_ZNK11MyException7MessageEv_ZN10MyLangForm21FindEventAtClassLevelEP9VDKObjectPc_ZTV10MyLangForm_ZN14VDKApplicationD2Ev_ZTS20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE_ZN10MyLangForm22FindSignalAtClassLevelEP9VDKObjectPc_ZN9VDKCustom6FreezeEv_ZTI20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE_ZTS10MyLangForm_ZN7VDKListI9MySectionEixEi_ZTI12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE_ZTS12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZN9MySection6RemoveEPc_Z10strdup_newPc_ZTI20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE_ZN15VDKListiteratorI5MyKeyED0Ev_ZN8VDKTableC1EP7VDKFormiiitime@@GLIBC_2.0_start_ZN7VDKForm14OnChildClosingEPS__ZTI12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZTI14MyLangDrillApp_ZN9MySection6NumberEv_ZN8MyConfig4ReadEv_ZN13VDKCustomList9SelectRowEii_ZN9VDKObject7SetFontEP7VDKFont_ZN10MyLangForm10QuizzSetupEiiii_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCPP_3.2_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEED0Ev_ZN16_VDK_Signal_UnitI10MyLangFormEC1EP9VDKObjectPcMS0_FbS3_E_ZN7VDKListI5MyKeyE4TailEv_ZN12VDKValueItemI15_VDK_Event_UnitI10MyLangFormEEC1ERKS2__ZN18ActivePagePropertycviEvstrlen@@GLIBC_2.0_ZN15VDKNumericEntryC1EP7VDKFormiPc_ZN10VDKFileSelC1EP7VDKFormPcS2__ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE9addToTailEP12VDKValueItemIS2_E_ZN8VDKArrayIiED1Ev_ZN14MyLangDrillAppD0Ev_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEED0Ev__cxa_end_catch@@CXXABI_1.2_ZN10MyLangForm12clearLessonsEv_ZN13VDKTextBuffer8GetCharsEii_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE6unlinkEi_ZN7VDKListI9MySectionE4TailEv_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE_ZN15VDKListiteratorI9MySectionEppEi_ZN7VDKListI5MyKeyE5fetchEi_ZN5MyKeyC2EPcS0__ZN7VDKForm3AddEP9VDKObjectiiii_ZN8VDKArrayIiEixEi_ZN15_VDK_Event_UnitI10MyLangFormEC1EP9VDKObjectPcMS0_FbS3_P9_GdkEventE_ZTI15VDKListiteratorI5MyKeyE_ZN7VDKForm9OnRealizeEPS__ZN9MySectionC2EPc_ZN10MyLangForm12EventConnectEP9VDKObjectPcMS_FbS1_P9_GdkEventEb_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE7currentEv_ZN8VDKTable6AddExtEP9VDKObjectiiiiiiii_ZN7VDKListI9MySectionE2atEPS0___gxx_personality_v0@@CXXABI_1.2_ZN7VDKListI9MySectionED1Ev_ZTV20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEE_ZN11VDKMenuItem3AddEP7VDKMenu_ZTS8VDKArrayIiE_ZN7VDKForm4ShowE17GtkWindowPosition__bss_start_ZN8VDKArrayIiEaSERKS0__ZNK5MyKey3GetEvmain_ZN7VDKItemI9MySectionED1Ev_ZN9VDKObject10ShowWidgetEb_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE3addERKS2__ZN14VDKCheckButtonC1EP7VDKFormPcS2__ZN7VDKListI18VDKObjectEventUnitE4findEPS0__ZN8VDKArrayI9VDKStringEixEi__libc_start_main@@GLIBC_2.0_ZN9VDKObject11EventAttachEi_ZN7VDKForm6OnMoveEPS__ZN8VDKTimer5StartEv_ZN7VDKItemI5MyKeyED1Ev_ZN7VDKFormD2Ev_ZN10MyLangForm8CanCloseEv_ZN9VDKStringaSERKS__ZN16_VDK_Signal_UnitI10MyLangFormEeqERS1_gtk_clist_get_type_ZTV12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEEC1Ev_ZN9VDKObject6EnableEb_ZN7VDKListI9MySectionE5flushEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE4findERS2__ZN9VDKObject13WrappedWidgetEv_ZN10MyLangForm18QuizzAnswerClickedEP9VDKObject_ZTVN10__cxxabiv117__class_type_infoE@@GLIBCPP_3.2_ZN10MyLangForm15findLangDrillRCEv_ZNK9VDKStringeqERKS__ZN8MyConfig6RemoveEPc_ZTS20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEgtk_set_locale_ZN9VDKStringaSEPKcdata_start_ZTV14MyLangDrillApp_ZN7VDKListI5MyKeyEC1Ev_ZN6VDKRgbD1Ev_ZN9VDKObject18ObjectSignalAttachEiprintf@@GLIBC_2.0_ZTSP11MyException_ZN10MyLangFormD1Ev_ZN12VDKValueItemI16_VDK_Signal_UnitI10MyLangFormEED1Ev_ZTI7VDKForm_finimemcpy@@GLIBC_2.0_ZN10MyLangForm13SignalConnectEP9VDKObjectPcMS_FbS1_Ebb_ZN7VDKListI5MyKeyE3addEPS0__ZN12VDKValueListI5TupleEixEi_ZN7VDKForm5CloseEv_ZTI8VDKArrayI9VDKStringEstrrchr@@GLIBC_2.0_ZN10MyLangForm17VDKSignalResponseEP10_GtkWidgetiPvS2_b_ZN10MyLangForm13hideOrIconifyEv_ZN9VDKObject21FindEventAtClassLevelEPS_Pc_ZN7VDKListI5MyKeyE6removeEPS0__ZN10MyLangForm26VDKSignalResponseTableSizeEv_ZN7VDKForm5RaiseEv_ZN5MyKeyD2Ev_ZTI11MyException_ZN10MyLangForm9SelectRowEP9VDKObject_ZN11VDKNotebookC1EP7VDKForm_ZTV8VDKArrayIiE_ZN14MyLangDrillApp5SetupEv_ZN7VDKItemI19VDKObjectSignalUnitEC1EPS0__ZN7VDKListI9MySectionEC1Evsrand@@GLIBC_2.0_ZN8VDKArrayI9VDKStringED1Ev_ZN7VDKForm8OnExposeEPS_13_GdkRectanglestrcoll@@GLIBC_2.0_ZN9MySectionD1Ev_ZN8VDKLabelC1EP7VDKFormPKc16GtkJustification_ZN10MyLangForm16parseLangDrillRCEP8MyConfigR11MyLangSetup_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEcviEv_ZN9VDKObject11EventDetachEPS_8VDKEvent_ZN7VDKListI19VDKObjectSignalUnitE3addEPS0__ZN7VDKItemI5MyKeyEC1EPS0_g_type_check_instance_is_a_ZN10MyLangForm25VDKSignalResponseListSizeEv_ZN13VDKCustomList10SelectionsEv_ZTS14MyLangDrillApp_ZN10MyLangForm9TimerTickEP9VDKObject_ZN9VDKObject25VDKEventResponseTableSizeEv_ZN9VDKObject22VDKObjectEventResponseEP10_GtkWidgetP9_GdkEventPvbatoi@@GLIBC_2.0_ZTI10MyLangForm_ZN12VDKValueListI16_VDK_Signal_UnitI10MyLangFormEE5flushEv_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE6unlinkEi_ZN7VDKListI5MyKeyE5flushEv_ZN14VDKProgressBar6UpdateEd_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCPP_3.2_ZN7VDKListI9MySectionE4HeadEv_ZN11VDKNotebook7AddPageEP9VDKObjectPKcPPcS5__ZN5MyKey3SetEPc_ZN7VDKListI9MySectionE3addEPS0__ZTS15VDKListiteratorI9MySectionE_ZTI19VDKRadioButtonGroup_edata_ZN13VDKCustomListC1EP7VDKFormiPPc16GtkSelectionMode_ZN10MyLangForm12newRandowSetEiiPi_ZN7VDKListI5MyKeyE4findEPS0__GLOBAL_OFFSET_TABLE__end_ZN19VDKObjectSignalUnitC1EPvS0_Pc_ZN14VDKApplicationC2EPiPPcS1_b_ZN10MyLangForm23FindSignalAtParentLevelEP9VDKObjectPc_ZN5MyKeyC2EPcigetcwd@@GLIBC_2.0_ZTVN10__cxxabiv119__pointer_type_infoE@@GLIBCPP_3.2__cxa_begin_catch@@CXXABI_1.2_ZN7VDKForm14OnFormActivateEPS_b_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE9addToTailEP12VDKValueItemIS2_Ememset@@GLIBC_2.0_ZTV20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEgtk_clist_freeze_ZN11MyExceptionC2EiPc_ZTS15VDKListiteratorI5MyKeyE_ZN7VDKFormC2EP14VDKApplicationPci13GtkWindowTypeiconv@@GLIBC_2.1strncpy@@GLIBC_2.0_ZN5MyKey6SetIntEi_ZNK8MyConfig4NameEv_ZN13VDKCustomList6AddRowEPPcS1_i_ZN9VDKObject16VDKEventResponseEP10_GtkWidgetP9_GdkEventPvS4_b_ZN12VDKValueListI5TupleE4sizeEv_ZN9MySectionD2Ev_ZN12VDKValueListI15_VDK_Event_UnitI10MyLangFormEED1Ev_Unwind_Resume@@GCC_3.0_ZN14VDKRadioButtonC1EP19VDKRadioButtonGroupPc_ZN10MyLangForm21VDKSignalUnitResponseEP10_GtkWidgetPcPv_ZNK9MySection4NameEv_IO_stdin_used_ZN8MyConfig6NumberEv_ZN7VDKForm3isAEv_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEC1ERK12VDKValueListIS2_E_Znaj@@GLIBCPP_3.2_ZN9VDKObject17VDKSignalResponseEP10_GtkWidgetiPvS2_b_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEE7currentEv_ZN8VDKArrayIiED0Evg_type_check_instance_cast_ZN10MyLangForm16SignalDisconnectEi_ZdaPv@@GLIBCPP_3.2sprintf@@GLIBC_2.0__data_start_ZTI9VDKObject_ZN12VDKValueItemI15_VDK_Event_UnitI10MyLangFormEED1Ev_ZN15VDKListiteratorI5MyKeyE7currentEv_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEED1Ev_ZN20VDKValueListIteratorI15_VDK_Event_UnitI10MyLangFormEEppEi_Jv_RegisterClasses_ZTS12VDKValueListI15_VDK_Event_UnitI10MyLangFormEE_ZN8MyConfigC1EPc_ZN10MyLangForm12AboutClickedEP9VDKObjectrand@@GLIBC_2.0_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEppEi_ZN7VDKListI5MyKeyED1Ev_ZN20VDKValueListIteratorI16_VDK_Signal_UnitI10MyLangFormEEC1ERK12VDKValueListIS2_E_ZN6VDKRgbC1Eiiigtk_widget_get_typegtk_widget_set_usize_ZN10MyLangForm5SetupEv_Znwj@@GLIBCPP_3.2_ZTI14VDKApplication_ZN12VDKStatusbarC1EP7VDKForm_ZN15VDKListiteratorI9MySectionEcviEv__gmon_start___ZN9VDKObject16ConnectingWidgetEv_ZN10MyLangForm12SignalAttachEilangdrill-0.3/src/french.drill0100644000175000017500000000371707670657774014574 0ustar samsam[Application] sense=0 directSenseName=French reverseSenseName=English # UTF-8 is the default encoding directEncoding=ISO-8859-1 reverseEncoding=UTF-8 quizzAnswerNr=8 hQuizz=40 wQuizz=300 # the timer value is given in minutes. # it represents the time between the automatical # activation of the langdrill. timer=10 # use this to set how many good answers the langdrill # waits till hides by itself. limitedAnswer must be 1 # for this to take effect limitedAnswerNr=25 limitedAnswers=1 # set to 1 if you want the window to be hidden when you # try to close it and the useTimer is 1 hideWindow=0 useTimer=1 [Numbers] zro=zero un=one deux=two trois=three quatre=four cinq=five six=six sept=seven huit=eight neuf=nine dix=ten onze=eleven douze=twelve treize=thirteen quatorze=fourteen quinze=fifteen seize=sixteen dix-sept=seventeen dix-huit=eighteen dix-neuf=nineteen vingt=twenty vingt et un=twenty-one vingt deux=twenty-two vingt trois=twenty-three vingt quatre=twenty-four vingt cinq=twenty-five vingt six=twenty-six vingt sept=twenty-seve vingt huit=twenty-eight vingt neuf=twenty-nine trente=thirty quarante=forty cinquante=fifty soixante=sixty soixante-dix=seventy quatre-vingt=eighty quatre-vingt-dix=ninety cent=one hundred deux cents=two hundred trois cents=three hundred quatre cents=four hundred cinq cents=five hundred six cents=six hundred sept cents=seven hundred huit cents=eight hundred neuf cents=nine hundred mille=one thousand deux mille=two thousand trois mille=three thousand quatre mille=four thousand cinq mille=five thousand six mille=six thousand sept mille=seven thousand huit mille=eight thousand neuf mille=nine thousand dix mille=ten thousand [Time: Days of the week] lundi=Monday mardi=Tuesday mercredi=Wednesday jeudi=Thursday vendredi=Friday samedi=Saturday dimanche=Sunday [Time: Months] janvier=January fvrier=February mars=March avril=April mai=May juin=June juillet=July aot=August septembre=September octobre=October novembre=November dcembre=December