SGF Syntax Checker & Converter: SGFC V1.13b =========================================== SGFC Copyright (C) 1996-1997 by Arno Hollosi SGFC is free software and is published under the terms of the GNU General Public License. Read 'COPYING' if you don't know the GPL by heart yet. Contents: ========= 1 ... What is it? 2 ... List of files 3 ... Installing / Building 4 ... Invoking SGFC 4.1 ... Option summary (alphabetical) 4.2 ... Examples 4.3 ... Detailed description 5 ... Output 5.1 ... Exit codes 5.2 ... Status line 5.3 ... Error messages Appendix A: The supplied test file: test.sgf Appendix B: History Appendix C: Known properties Appendix D: List of error codes and possible causes 1. What is it? ============== SGF is the 'Smart Game Format' fileformat for storing game records. It's a text only, tree based format. The specification of the SGF format can be found at: http://www.cis.tu-graz.ac.at/home/hollosi/sgf/ or ftp://igs.nuri.net/Go/info/sgf4_spec.tar.gz SGFC is a command line tool for checking SGF files for correctness and correcting any errors. It also converts FF[1]-FF[3] files to FF[4]. SGFC is THE reference implementation for the SGF FF[4] standard. If this tool differs from the specification then the specification is right and SGFC has a bug - in that case please contact me immediatly! SGFC is intended to be a tool for SGF experts, coders and maintainers of large SGF archives. You ought to have quite some knowledge of SGF to use SGFC efficiently. SGFC was written primarily for Go/WeiQi/Baduk (GM[1]) files. It can't handle other games yet, i.e. it doesn't check any game-specific properties and values of other games than Go. It may even save errornous game-specific properties of other games! Use SGFC for other games with care. The latest version of SGFC can be downloaded from: http://www.cis.tu-graz.ac.at/home/hollosi/sgf/sgfc/ or ftp://igs.nuri.net/Go/prog/sgfc_vXXX.tar.gz If you've any suggestions, problems, criticism or found a bug then send an email to . Please include: - the version number of SGFC (just invoke 'sgfc' without parameters) - which operating system you're using - a short SGF file, where the error occurs 2. List of files: ================= all.h general include file with all structures and defines protos.h contains all function prototypes and 'extern' variables main.c contains main() and argument parsing load.c contains all routines necessary for loading the SGF file and building up a tree structure save.c just the opposite to load.c properties.c contains the array sgf_token[] which defines all properties and their features parse.c contains syntax and semantic checks for property values parse2.c contains parsing of node and property structure gameinfo.c contains parsing and correcting of game-info properties. (includes functions for interactive mode) execute.c contains routines that actually execute the properties, e.g. play the game on a board capture stones etc. This is used to detect more sophisticated errors and to do necessary transformations util.c misc. functions; error messages test.sgf a SGF file to test all messages of SGFC Makefile Makefile as used for gcc on my Amiga and on an AIX Unix system README this file COPYING the GNU General Public License I use tab size of 4 (instead the usual 8) in my sources. You've to set the tab size of your editor accordingly to get a readable source with reasonable indentions. 3. Installing / Building: ========================= If you've an ANSI compliant C compiler on your system just type 'make'. The include files have to be ANSI compliant too! If your system doesn't fit these requirements then ask a local system guru to help you. Note: on some machines, you may have to specify a shell and the processor type in the Makefile -- in that case you have to edit the Makefile. Right now it doesn't specify either in order to be machine independet. See additional defines below too. If your compiler doesn't know the ANSI function strerror(), but is otherwise ANSI compliant, then you can define NO_STRERROR in the file util.c in order to get rid of this compiler error. If you're compiling SGFC manually then just compile each file to get the object files and link those object files together (using a proper link library). There are various defines in all.h to customize SGFC: EOLCHAR: -------- You can define the character used to indicate the end of line. This is only used when SGFC writes a file, because SGFC automatically detects any kind of linebreak during reading. This define is useful if you want SGFC to write SGF files using the linebreak-code specific to your machine (e.g. Mac or MsDos). DIRTY_FREE: ----------- SGFC calls malloc()/free() for every structure or value (nodes, properties, etc.) - thus an average file causes 2000-5000 calls to free(), large files up to 50000-150000 calls. On most systems free() is awfully slow, thus SGFC uses most of its time to free the structures it has allocated. But almost all compilers/OS systems clean up on program exit anyway - which is MUCH faster (up to 10 times!). Therefore DIRTY_FREE is defined at the head of 'all.h' which inhibits calls to free() on exit. If you're losing memory (about 3 times the file size) then your OS/compiler doesn't clean up and you've to remove this define to avoid memory loss. SGFC will get slower though. VERSION_UNIX, _MAC, _MSDOS: --------------------------- This is might be necessary for SGFC to compile on your machine. Right now only _MAC does something special. So if you compile SGFC on a Macintosh set the VERSION_MAC define. VERSION_NO_MAIN: ---------------- In case you've written a new main() function, e.g. a nice GUI, you can use this define, so that main() doesn't get compiled. 4. Invoking SGFC: ================= Usage: 'sgfc [options] infile [outfile]' Option arguments have to be preceeded by a '-'. If the 'outfile' is missing, SGFC just checks the 'infile'. Conversion to FF[4] takes place only if you specify the 'outfile'. 'outfile' may be the same as 'infile'. 4.1 Option summary (alphabetical): ---------------------------------- -h ... print a short help message -bx ... Beginning of SGF data is detected by\n" 1 - advanced search algorithm (default) 2 - first occurence of '(;' 3 - first occurence of '(' -c ... write file even if a critical error occurs -dn ... n = number : disable message number -n- -e ... expand compressed point lists -g ... print game signature (Go GM[1] games only) -i ... interactive mode (faulty game-info values only) -k ... keep header in front of SGF data -lx ... x = 1,2,3: a hard linebreak is 1 - any linebreak encountered (default) 2 - any linebreak not preceeded by a space (MGT) 3 - two linebreaks in a row 4 - paragraph style (ISHI format, MFGO) -n ... delete empty nodes -o ... delete obsolete properties -p ... write pass moves as '[tt]' if possible -s ... split game collection into single files -t ... don't insert any soft linebreaks into text values -u ... delete unknown properties -v ... correct variation level and root moves -w ... disable warning messages -yP ... delete property P (P = property id) 4.2 Examples: ------------- 'sgfc -h' ... prints help message 'sgfc game.sgf' ... check 'game.sgf' for correctness 'sgfc -pet game.sgf game.sgf' ... Check and overwrite 'game.sgf' with expanded point lists, '[tt]' pass moves and no soft linebreaks - writing FF[4] files like this is the most compatible way for old (FF[3]) applications 'sgfc -wd20d12el2 game.sgf game2.sgf' ... disable all warnings and messages #20, #12; expand compressed point lists and apply linebreakstyle 2. The outputfile is saved to 'game2.sgf'. 'sgfc -w -d20 -d12 -e -l2 game.sgf game2.sgf' ... same as above 'sgfc game.sgf game.sgf' ... check and overwrite 'game.sgf' 4.3 Detailed description: ------------------------- Option -b: ---------- Select method for searching the beginning of SGF data. SGF files may be preceeded by plain text. In most cases this is an email header which hasn't been removed. In order to find the SGF data SGFC searches for '(;' which marks the beginning. But some errornous files mark the beginning only with '('. To detect such files SGFC uses a more sophisticated search. However this search might go wrong (in seldom cases). In that case specify -b2 ... the first '(;' is searched. Note: missing ';' at the beginning can't be detected -b3 ... the first '(' is searched. Note: This is the best choice if the SGF data isn't preceeded by plain text. If there's text in front of the SGF data then it's likely that problems will occur. Option -c: ---------- Write file even if a critical error occurs. Critical errors indicate that the SGF file may be severly damaged and that information may be lost during the conversion. Treat critical warnings/errors with care! Have a look at the 'List of error codes' to see which critical errors may occur. Option -dn: ----------- Disable message number -n-. SGFC is a rather pedantic syntax checker. If you want to limit the number of messages you get then specify this option. With '-d' it's possible to disable specific messages. Fatal error messages can't be disabled. Hint: there are messages which can be printed up to 100 times, but which aren't really critical. This messages are Warning 24: removed empty value (e.g. 'C[]') Warning 29: deleted property (when specifying -o or -yXX) Warning 40: property not part of FF[x] (e.g. FF[3] file without FF[] property) To disable these messages specify: -d24d29d40 Option -e: ---------- Expand compressed point lists FF[4] provides a compressed format to store long point lists. However this compressed format is TOTALLY incompatible to old applications. If you are concerned about compatibility to old applications you should avoid the new format and specify this option. The new format only affects point lists and not single moves (e.g. like in B or W). Option -g: ---------- Print game signature (works for Go GM[1] games only) The game signature consists of two parts: a primary and a secondary part. The primary signature consists of moves 20, 40 and 60. The secondary signature consists of moves 31,51 and 71. The chosen moves make it very unlikely that different games have the same signature - thus the signature may serve as unique ID e.g. within databases. For more information on signatures have a look at Dave Dyer's web pages. The output looks like: "Game signature - tree 1: 'onqsrq lporke'" (ear reddening move game) or "Game signature - tree 2: contains GM[12] - can't calculate signature" Option -i: ---------- Interactive mode (faulty game-info values only). Asks user to correct faulty game info values. Right now following properties may be queried: DT, RE, KM and TM. Have a look at the SGF specification for a format description. If you want to keep the faulty value or use the suggested value then just type . If you want to delete the value then type 'd'. Otherwise just type in the new value. Your input is checked for correctness and rejected if there are any syntax errors. Note: no trailing or preceeding spaces, case sensitive check. To make it a little easier for you, SGFC tries to correct your input and if successful provides it as default value the next time your asked. Hint: this can be (mis-)used to input values the way you're used to, e.g.: date: "14 apr 97" result: "black wins by resignation" time: "9 hours" komi: "five and a half points" Option -k: ---------- Keep header in front of SGF data. SGF files may be preceeded by plain text. In most cases this is an email header which hasn't been removed. By default SGFC removes this header as it contains no SGF relevant information. Option -l: ---------- Define the way SGFC treats linebreaks within texts. FF[4] distinguishes two types of linebreaks: hard and soft ones. Hard linebreaks are linebreaks that are displayed. Soft linebreaks are not displayed by the application. This is useful for limiting line lengths for mailing/posting SGF files. SGFC offers 4 different styles for reading in text. Text is ALWAYS written in a FF[4] compatible way. During reading, a hard linebreak is 1 - any linebreak encountered (default) 2 - any linebreak not preceeded by a space (MGT) 3 - two linebreaks in a row 4 - paragraph style (ISHI format, MFGO) Option -n: ---------- Delete empty nodes. Removes nodes which contain no properties. There are empty nodes which can't be deleted. These nodes are: - root node if it has more than one child - a node which has siblings and has more than one child Option -o /-u: -------------- Delete obsolete/unknown properties. SGFC knows all FF[4] properties (general ones and Go specific ones) and all FF[1]-FF[3] properties defined by the specifications of Anders Kierulf and Martin Müller (it doen't know all SGB properties though). I.e. any unknown property encountered is likely to be a private property of the application used to write this file. Obsolete properties are properties which are not part of FF[4], E.g. 'RG' a markup property was defined for FF[1]-FF[3] but not for FF[4]. Note: two obsolete properties are not deleted but converted to their FF[4] counterpart. These properties are: 'M' and 'L'. Have a look at Appendix C for properties known to SGFC. Option -p: ---------- Write pass moves as '[tt]' if possible. FF[4] allows writing pass moves as '[]'. Older appplications can't deal with this value. If you are concerned about compatibility to old applications you should avoid the new format and specify this option. '[tt]' pass moves are only possible for boards <19x19. If the board is bigger than 19x19 this option is ignored. Option -s: ---------- Split game collection into single files. SGF allows to store more than one game in a file. But not all applications can deal with game collections. If you set this option SGFC writes each game into a separate file. Naming convention: 'outfile_xxx.sgf' where 'outfile' is the name you specified as output file and 'xxx' is a number starting from '001'. Example: 'sgfc -s in.sgf out' produces 'out_001.sgf', 'out_002.sgf' etc. Option -t: ---------- Don't insert soft linebreaks into text. FF[4] specifies two types of linebreaks: hard and soft ones. Soft linebreaks are linebreaks which are not displayed. By default SGFC inserts soft linebreaks wherever necessary to limit the line length to 76 chars. However old applications can't deal with soft linebreaks. If you are concerned about compatibility to old applications you should avoid soft linebreaks and specify this option. Option -v: ---------- Correct variation level and root moves. It's bad style to have alternativ moves at different tree levels. Some applications chose that way to represent variations as siblings instead of children - they added a child node, removed the latest move by using an AE property and put the alternativ move into the node. Example: >>(;GM[1];B[aa](;W[bb])(;AE[aa]B[cc])(;AE[aa]B[dd]))<< Correct: >>(;GM[1](;B[aa];W[bb])(;B[cc])(;B[dd]))<< When -v is specified SGFC tries to correct such variations (this works only for Go GM[1] games). And it corrects another bad style: root nodes containing the first move (this works for all kind of games). Example: >>(;GM[1]C[first move in root node]GC[bad style]B[aa])<< Correct: >>(;GM[1]GC[good style];B[aa]C[first move not in root node])<< Option -w: ---------- Disable warning messages. SGFC is a rather pedenatic syntax checker. If you want to limit the number of messages you get specify this option. Use this option with care! Option -y: ---------- Delete property. This option allows you to delete specific properties. You have to add the property id as listed in 'Appendix C: Known Properties'. Right now only properties known to SGFC may be deleted by using this option. 5. Output: ========== SGFC prints error (warning) messages during parsing the input file and a status line after completing. 5.1 Exit codes: --------------- Upon finishing SGFC returns 0 ... if everything was ok (note: ignored messages may occur) 5 ... if there were warnings 10 ... if there were errors 20 ... if a fatal error occured 5.2 Status line: ---------------- "file: [x error(s)] [x warning(s)] [(critical:x)] [(x message(s) ignored)]" Where 'file' is the name of the input file and 'x' is the number of errors, warnings, critical & ignored messages. If no message was issued then SGFC prints "file: OK [(x message(s) ignored)]" 5.3 Error messages: ------------------- "[Line:x Col:x - ] Message type and number [(critical)]: message text" Where 'x' is the number of the line and column of the cause for the message. Message type is either: 'Error', 'Warning' or 'Fatal error' A fatal error stops execution and SGFC exits. Messages can be critical, which by default forbids saving the file. Critical messages indicate possible loss of information. A property identifier within the message text is enclosed by '<' and '>'. Examples: Line:2 Col:56 - Error 8 (critical): illegal char(s) found: "fsgdf" Line:35 Col:1 - Warning 35: unknown property found Fatal error 2: unknown command line option 'x' Appendix A: The supplied test file: test.sgf ============================================ test.sgf compromises almost all errors known to SGFC. Invoking SGFC without any parameters and input file test.sgf should yield: 50 errors and 18 warnings - 11 messages are critical. Invoking SGFC with 'sgfc -oun test.sgf' should yield 12 warnings more. Following errors can't be tested from within the test file: Fatal error 1: error in commandline: e.g. 'sgfc in.sgf out.sgf foo' Fatal error 2: error in commandline: e.g. 'sgfc -x in.sgf' Fatal error 3: couldn't open source file Fatal error 4: couldn't read source file Fatal error 5: not enough memory Fatal error 7: no SGF data found: e.g. 'sgfc COPYING' Error 9: variation nesting incomplete: add ']' to the end of test.sgf Fatal error 26: couldn't open destination file Fatal error 27: couldn't write destination file Error 34: critical file not saved: e.g. 'sgfc test.sgf out.sgf' Fatal error 46: unknown file format: create a file consisting of "(;FF[5])" Fatal error 48: no source file specified: e.g. 'sgfc -u' Fatal error 49: error in commandline: e.g. 'sgfc -ld' Fatal error 53: destination file name too long (max: 480 chars) Warning 29: invoke sgfc with -o option; warning 29 on line 40 (SC property) Warning 55: invoke sgfc with -n option; warning 55 on line 55 Every line yields one or more errors/warnings. test.sgf is compiled in a way that error/warning x occurs in line x, e.g. error 12 occurs in line 12. Exceptions from this rule: - error 10 occurs at end of file - line 19 yields warning 19 & 45 - line 31 yields error 31 & 35 If you want to test how robust your own application is, then try to read in this file :-) Appendix B: History =================== V1.13b (1998-01-20) ------------------- - BUGFIX: game signatures of multiple games within one file were wrong (thanks to Guido Adam) V1.13 (1997-11-23) ------------------ - renamed options: help is now -h (instead of -?) and 'keep header' is now -k (instead of -h) -- done, because '?' causes problems with some shells. - new property recognized: KI (integer komi) - this property is private to SGB - it gets converted to the regular komi property KM - bug fix: trailing '0' in float values get removed again - beautified output: game-info entries are written on seperate lines and are sorted according to a suggestion of Jan van der Steen V1.12 (1997-06-17) ------------------ - new options: -v ... correct variation level -y ... delete specific properties V1.10 (1997-06-08) ------------------ - new options: -n ... delete empty nodes -g ... print game signature - speeded SGFC up: 2-3 times faster now (up to !20 times! faster on large files if DIRTY_FREE is specified) - added DIRTY_FREE define in all.h (see section building) - fixed bug: strnccmp() ignored length argument - fixed bug in board position calculation - could result in removing wrong AB/AW/AE values V1.03 (1997-06-03) ------------------ - fixed bug: MSDOS linebreaks (CR/LF) were sometimes transformed to two linebreaks V1.02 (1997-05-26) ------------------ - fixed 'split node' bug (root & game-info properties must stay in first node too) V1.01 (1997-05-25) ------------------ - fixed parsing VW property (FF4 def. in older FF caused loss of information) V1.0 (1997-05-23) ----------------- - added PM property, updated parsing of FG property (according to spec) - added (obsolete) FF1 properties EL, EX V0.6 (1997-05) -------------- - added missing FF[1] & FF[3] properties - check property vs. fileformat added - new options: -o (remove obsolete properties) -i (interactive mode) -b (now 3 search modes for SGF data) - extended README (description of options, property list) - compiled test file: test.sgf - SGFC exit codes (0/5/10/20): ok/warn/error/fatal error - extended date/result/time/komi correction (SGFC fixes up to 90% of all bad values now) - faulty game-info property values don't get moved to GC any longer - bug fixes (as always :) V0.5 (1997-04) -------------- - FindStart got more sophisticated (checking for missing ';') - added LN, HO properties - saving FF[3] option removed - added pass '[tt]' option instead - updated soft linebreak handling according to draft - added linebreak style 4: ISHI format, MFGO - some bug fixes V0.4 (1997-02) -------------- - reformatted message output; added status line - some messages give more informaion now (e.g. which property caused error) - rewritten argument parsing - improved ParseText: removes trailing spaces and unnecessary escapings '\'; applies given linebreak style - added better date and result parsing (DT, RE) - added handling of boards bigger than 19x19 (upto 52x52 now) - added compressed point lists - many minor bug fixes, new error cases (messages) added V0.3 (1996-10) -------------- first public release (early beta version) Appendix C: Known properties ============================ ID Fileformat Type Value -- ---------- --------------- ------------------------- AB 1234 setup list of stone AE 1234 setup list of point AN --34 game-info text AP ---4 root text : text AR ---4 - list of (point : point) AW 1234 setup list of stone B 1234 move move BL 1234 move real BM 1234 move double BR 1234 game-info text BS 123- game-info number BT --34 game-info text C 1234 - text CA ---4 root text CH 123- - double CP --34 game-info text CR --34 - list of point DD ---4 - (inherit) list of point DM --34 - double DO --34 move none DT 1234 game-info text EL 12-- - number EV 1234 game-info text EX 12-- - move FF 1234 root number FG 1234 - none | (number : text) GB 1234 - double GC 1234 game-info text GM 1234 root number GN 1234 game-info text GW 1234 - double HA 1234 game-info (Go) number HO --34 - double ID --3- game-info text IT --34 move none KM 1234 game-info (Go) real KI SGB game-info (Go) number KO --34 move none L 12-- - list of point LB --34 - list of (point : text) LN ---4 - list of (point : point) LT --3- - none M 12-- - list of point MA --34 - list of point MN --34 move number N 1234 - text OB --34 move number OM --3- - number ON --34 game-info text OP --3- - real OT ---4 game-info text OV --3- - real OW --34 move number PB 1234 game-info text PC 1234 game-info text PL 1234 setup Color PM ---4 - (inherit) number PW 1234 game-info text RE 1234 game-info text RG 123- - list of point RO 1234 game-info text RU --34 game-info text SC 123- - list of point SE --3- - list of point SI --3- - double SL 1234 - list of point SO 1234 game-info text SQ ---4 - list of point ST ---4 root number SZ 1234 root number | (number : number) TB 1234 - (Go) elist of point TC --3- - (Go) number TE 1234 move double TM 1234 game-info real TR --34 - list of point TW 1234 - (Go) elist of point UC --34 - double US 1234 game-info text V 1234 - real VW 1234 - (inherit) elist of point W 1234 move move WL 1234 move real WR 1234 game-info text WS 123- game-info number WT --34 game-info text Appendix D: List of error codes and possible causes =================================================== Classes: FE ... fatal error (program halts execution and exits) E ... error W ... warning E4 ... error if source file is FF[4], warning if FF[3] or less C ... critical (by default forbids saving the file) 1:FE "unknown command '%s' (-? for help)" Example: 'sgfc in.sgf out.sgf foo' 2:FE "unknown command line option '%c' (-? for help)" Example: 'sgfc -x in.sgf' 3:FE "couldn't open source file '%s'" 4:FE "couldn't read source file '%s'" 5:FE "couldn't allocate %s (not enough memory)" 6:W-C "possible SGF data found in front of game-tree (before '(;')" Example: >>bla[aa] (;GM[1];B[cc];)<< Note: searches for '[(lc)(lc)]' 7:FE "couldn't find start mark '(;' - no SGF data found" Example: simple text file 8:E-C "illegal char(s) found: " Example: >>(;B[cc] gfhf;W[kk] ];<< 9:E-C "variation nesting incomplete (missing ')')" Example: >>(;B[cc](;W[kk])<< Note: may indicate illegal nested variations - have a look at the output file to see if variations are ok 10:E-C "unexpected end of file" Example: >>(;B[cc<< 11:E-C "property identifier too long - more than 100 chars (deleted)" Note: indicates that file isn't a SGF file 12:E "empty variation found (ignored)" Example: >>(;B[cc]())<< 13:E-C "property <%s> may have only ONE value (other values skipped)" Example: >>(;B[cc][dd])<< or >>(;B[cc;AW[dd][ee])<< 14:E "illegal <%s> deleted: " (i.e. illegal property value) Example: >>(;B[111];PL[r])<< 15:E/E4 "illegal <%s> corrected; new value: [%s], old value: " Example: >>(;B[a a];DM[1 kk]BL[30.])<< 16:E "lowercase char not allowed in property identifier" Note: only for FF[4] Example: >>(;FF[4];Black[cc];White[dd])<< 17:W/E "empty <%s> value %s (deleted)" (found/not allowed) Example: >>(;PL[]AB[];C[])<< 18:E "illegal root property <%s> found (%s)" (action taken) Example: >>(;FF[four]GM[Go]SZ[-12])<< 19:W-C "game stored in tree %d is not Go. Can't check move & position type" " -> errors won't get corrected!" Example: >>(;GM[12])<< 20:E-C "property <%s> without any values (ignored)" Example: >>(;B[cc]PL;W[aa];AB)<< or >>(;B[aa] B L[321.0])<< Note: the second case ('BL' -> 'B L') causes loss of timing information 21:E-C "illegal variation start found (ignored)" Example: >>(;B[cc]((;W[dd])<< 22:W "$00 byte deleted - binary file?" Note: SGFC can't handle $00 bytes in property values 23:E "property <%s> expects compose type value (value deleted): " Example: >>(;LB[aa][bb][çc])<< 24:W "move in root node found (splitted node into two)" Example: >>(;GM[1]B[dd])<< 25:E "illegal <%s> corrected; new value: [%s:%s], old value: " Example: >>(;LB[a a: text])<< 26:FE "couldn't open destination file '%s'" 27:FE "couldn't write destination file '%s'" 28:E "property <%s> already exists %s" (merged/deleted) Example: >>(;C[text1][text2]LB[aa:1]LB[bb:2];W[aa]W[bb])<< 29:W "property <%s> deleted" Example: >>(;FF[1]BS[1]RG[aa][cc])<< - invoke SGFC with option '-o' 30:E4 "setup and move properties mixed within a node %s" Example: >>(;B[cc]AW[dd])<< or >>(;B[cc]PL[B])<< 31:W "property identifier consists of more than 2 uppercase letters: <%s>" Example: >>(;PIW[])<< 32:E "root property <%s> outside root node (deleted)" Example: >>(;B[aa];GM[1])<< 33:E4 "gameinfo property <%s> has illegal format %s - value: " Example: >>(;RE[Black wins by 12 points])<< 34:E "file not saved (because of critical errors)" Note: This is done because of possible loss of information during the conversion. May be overruled by '-c' option. 35:W "unknown property <%s> %s" (found/deleted) Example: >>(;KK[txt])<< 36:E-C "missing semicolon at start of game-tree" Example: >>( GM[1]FF[3][SZ[19])<< Note: Detection might be wrong (use option -b2 in that case) 37:E "black and white move within a node (split into two nodes)" Example: >>(;B[cc]W[dd])<< 38:E "%s <%s> position not unique ([partially] deleted) - value: " Example: >>(;AB[aa][aa];MA[kk]TR[kk])<< 39:W "AddStone <%s> has no effect (deleted) - value: " Example: >>(;B[cc];AB[cc])<< 40:W "property <%s> isn't defined in FF[%d] (%s)" (ok/converted/deleted) Example: >>(;FF[4];L[aa][bb][cc])BS[1])<< 41:E "annotation property <%s> contradicts previous property (deleted)" Example: >>(;GB[2]GW[1])<< 42:E4 "combination of <%s> found (converted to <%s>)" Note: combinations of TE & BM get converted to DO & IT Example: >>(;B[cc]TE[1]BM[1];W[dd]BM[1]TE[1])<< 43:E "move annotation <%s> without a move in the node (deleted)" Example: >>(;TE[2])<< 44:E4 "game info entry <%s> outside game-info node (line:%d col:%d) (deleted)" Example: >>(;GN[test];HA[4])<< 45:W "different %s stored in one file (may cause troubles with some applications)" Example: >>(;GN[1]) (;FF[3]GN[2])<< 46:FE "unknown file format (only able to handle files up to FF[4])" Example: >>(;FF[5])<< 47:E "square board size in rectangular definition (corrected)" Example: >>(;SZ[19:19])<< 48:FE "no source file specified (-? for help)" Example: 'sgfc -u' 49:FE "bad command line option parameter '%s'" Example: 'sgfc -lr' 50:E "board size too big (corrected to %dx%d)" Example: >>(;SZ[1000])<< or >>(;FF[4]SZ[10:53])<< 51:E-C "used feature isn't defined in FF[%d] (parsing done anyway)" Example: >>(;FF[2]SZ[13:9])<< or >>(;FF[3];AB[aa:ee])<< 52:E " property: %s (%s)" (various error cases for FF[3],FF[4]) (action) Example: >>(;VW[][aa])<< or >>(;FF[3]VW[aj][ak][al][am])<< 53:FE "destination file name too long (max. length: 480 chars)" Example: type in more than 480 chars :-) 54:E-C "values without property id found (deleted)" Example: >>(;[ab][ac])<< 55:W "empty node deleted" Example: >>(;;;C[empty])<< and invoke sgfc with option '-n' 56:W "possible incorrect variation level can't be corrected" Example: >>(;B[dd];W[aa](;B[bb])(;AE[aa];W[ba])(;AE[dd][aa];B[ef]))<< 57:W "variation level corrected" Example: >>(;GM[1];W[aa](;B[bb])(;AE[aa];W[ba])(;AE[aa];W[ef]))<< 58:W "forbidden move found (played on a point occupied by another stone)" Example: >>(;GM[1];B[aa];W[aa])<< 59:W "obsolete property found: %s" (converted / deleted) Example: >>(;(;KI[11])(;KM[3.5]KI[7]))<<