qxw-20200708/0000775000175000017500000000000013701320335010404 5ustar momoqxw-20200708/icon.png0000664000175000017500000003503613674704262012067 0ustar momoPNG  IHDRXXfsRGBbKGD pHYs B(xtIME |4d IDATxyxTd%$$M@ !a(EdDvA,ZP*)ZVD&Ap!!İE{3ܳ^.|d>9sP,.:?pIaI:H{\ΫXy   @l&#XV%$$98@ `@ `@ `@ `X `X `X `X `X,X,X,X,XWw%8qB:u{{{aÆj֬4i0y{{$ŋڻw٣(99Y.\p5jԨm۪} 233$%&&*11QYYYvm۸qc9s&\NYY }ڼy~~AЁ{b{?~^ u!]r<… O?T۷oW^^^ֳlڷoۧ3fԌ3F.aoUAAx]V|vڥṛP^uwӼyDrgMc)??_V^m۶eVVV^zIk֬ѲetmUTThZx3ϸO:XٳeX53讻իW X?}"`P˫r̺u#\kp pI馛t-sΊN2@.]ݻsNرC\R[ݺu5x` :T k ),,Lcƌfӎ;K/iӦM4Yf)66Vmڴ!`ypEGG+::Zޚ={6MZjiĈ{տ8;u-,~iϞ=0a?kkҤIڳgSK.ܹ:w(n_nv- hӦNq}ZKЄ ж_|6nܨCM@@ S;wVV*%jYf;{N#((H~~a-]ԡm͛GruرO_EGG릛nR`` xkΜ9޽S[,:{ǧtܙ媲G#ƭު wN{=iF.\{e˖9a+@u2ydݻ%Տj׮ 8͖-[ r,=*wy;V-Z{ctiĉ,_2x`;r-ڷo;ԪU+~MF[PP@5ۑ@UTTdXGHVvvcCCC Xfȑ#voٲ% +77PY6nhX___uڕK>c| "`%$$=> T;-f{O9'OߩS'oߞsz)=~Μ9 `jc׮]裏߾}{ >tګ DO<'O=~Ȑ!4h5"`7xZh5#`;͋/-Z]AA>ڽM~_W]H7n[W}]Y,5k֭[gx____^M6,q,Y^xmΝ=zTJ}(˖-#<ƌٳgWXc,]T'NTEEZ|u_wEgʕoЙ{G+VG[jƏЙAiʕ[[~x۽jU\\dN,6nܨQFmu+ EniӦM9rJJJ&::Z[nUppp΍Ν;Wڵ͛R#`kȐ!*..{mݺU72GpԈ#TTTd65͛u7' j*''m7n?\-[4:Wpyg65Ν;բE %`vQOvoS^=mٲEZrʜ XekxO>Q6opI)))ѣ233&44TvRnݜ:wp9'NPllΟ?o6jҦMԩS'ϟ\.\voO?Tݻww} `qIԩSvo?X={t ` W5jկ_?pt8tA֭[Õju(\hժU0`K 8MFFg~ W#Fp"`8s奿9rK 8%\~[ƍs#`Ξ=;vm,,Y &>K+IZh&M6IFUZZC۽zj_ Xʝ;wNvj޼y1c/ T+&&F}C=3zgr XլY?mۇ7ɓJLLIMM{lqq֬Ys55h JKK5d>$M6ԩS|nUaÆWY\tMJzΑ l6pK.C=o8qPV?sssQks5hW!@%#`X,X,؅;;<{=`x>ծ]>bxܝ    @@@Leff*##CU~~._<竴T%%%*,,k֬)($$D!!!]0Yfj֬իGxB8p@Çdegg_^|١uQTTڵk(uA fcǎiꫯ~ݻ{Zj.]k׮ծ]; sj֭ڲenݪt{EERSS+WJ4iXj a%kf.]7jݺuڶm=r?#F;TÆ Y|TVU m 8T.];vsΚ2eƌ5krPK6 tϟ-[jԨQھ}{ WzHzuY,;zƍƍkΜ9i??^?6mC믿)X~ޱc4vX|zTRRBS~FEEu뭷ꮻҡCh /55UFR֭rJֺut7JLL)X@uVPP'xB7t֬YEi֭~*'' `IEE^y^Pii)M޾曊+7Z@PN>AieB>}V?NCOd+uڲe 1dϞ=С.\,,\|Y#GUTTDC 4k, 4Hϟ!X/ԡC]f8֭[աC  `fi…Z:s q8pf͚UmRM2EfV.~G~ `… ӧ~m>r-̤XJKKS^_ 7q![*-*r9{{{+22RQQQj޼ռysիWO 4P _-,,ŋuegg+##CJOOWJJLYVm޼Y]v`@\7|Cի>}o߾ٳڵkkz@*<<=zTSBB\ 999߿>ٓuJzΑ xe޽8p]r~۷װa4l0uU^^ι2f׆ \AAAڸqV+7j*!!X,x(&&Fyyy.5oQG֘1cԡC]ZZ}{JOOwժUG,\ .rumT۵aeffj….$UV7oN<ݻwkȐ!X\\+)) 0%33SÆ SnnĶ{ڲemۦC:kkիW/mܸQ{Q~\bN:tN<T< |4}tz'//M4IǎӔ)S:;vhر\D ToV_/ڵkՠAj-YD˗/ٛzj-^7PYvޭitAM6e~igڸq㔜['̜9S9o,zeggk̘1N{K~{niӦگEXXvءÇ;~YYƌlXl7n233RܸqڴiBCCY T\\NNҸq  Vo>SԞ5k-[&???x{{^RO?oB `JNN֌3̿)k矯[駟֊+c3fp:RVVɓ'իk N;V0zUM2E,`ŋ/4^sɓ`uۧ^{@~͹s4w\uNꔺ'{u}Y;w@~c=|5 W_}_/5jњ>}:@~NBBlѢ/_.//ގb護R۶m]fX,UTThƌFoTfM[Nua*Ipp֮]k:6M3gXX{dᆱJ֦MFY{ `?z 'L`zdذa4iњsUII @c{FFzaaazi|{饗a^zz|M7V[i~ ʕ+mg|To˗/WVVz'NTϞ=i!zLbޅ b Tssd~kQRRH>}HShh(7(??_mڴ1vCЦM<j:|>] gP^Xy 88X3VԩSZf X@d9r۷7UՃ>o#-,e|W믍_jbk;///7xT/K.5Vw0`Mw2ժn#1,rssg27]jh:@UVH^z)&&޽{jUXXUVtTe{bL  `BZZvmV֭5l0bl!۟h:@<ۇ~h֤IdXh 2 իWpx6SvF?ᘉ'{Pd#ڵktUV-u]Fj%''+==,3}Gj?8kvZϴ~z#u6mj􆖸6}QDDG{XQڷoZ#Go/WgXtwo>n: ϳsNe\?SL;w e 7ܠ=zp7ѵkW5jH;vpx]vsw;=@x3׏S?HHNNVVV Xgػwl6G}Xf޽{i8@<7|cNDD4iBLÆ ժU+#kW_ӷo_L `,߿_4 `ɓnاOzeN^^N8ALziӦj޼9 wS͚5SxxZ po2Rcǎ4uɣI,9rHvl7gj MXmۖf9Skhkk,JTTT,8q؃JwY]zX,"ڵw)--ӧi8@Szz:͚5SPP ws5j0KPS&b2##f,=ZΜ9cNÆ i0\u\r-ϟ?O@"`@*]VV ,,?Xk 6,\zUU^bA4Cԭ[FMX@r励d___!fS(Pi N:u `nwvF4ØZS`,:;@"`1 T"#ui1Q,Ҕ,cjMMX@)++3R3X,Xna XQ,>8yL)gvˍԚ:FJcq'g!<5  p;>>>F\zf{~H^X0Th&`,c,,3Xk$vj֬ig<_ `?#88H`y"@~FPP:<֔,ԪUH`L߾}ڰa wׯ7R'00Pz+ Xgiܸn&#V^M݄ӧi8@<ϝwiΑ#Gt⒓}KFa֊+h3F^^^i8@tUVVFjCM6 LEÇ7Rܲ_^gΜ1R7 Xg7nZ/. l]tQ IDAT˖-/tAb=nS:uh:@Y,#֭[Ǐt8#BBB pc-)//?O]… UVVfDP}] gP5lX/_֔)Sh!?p%+,@O?@c>;4XBׯ7Vm۶=z4@$QFz'֜:u[_ERRR#?Y4 ̙3u 7?WQQͯd5j ޽N+((Hg6Zѣzh~%{'lbqHXyGխ[75~m-XWEoњ&MjX}CxyiѢEXdΜ9gӶmOY^=X/ѣz!5uwk˖-,5ڳgNwU^= 5ӟ԰aC5KJJ_^Tu]n#ժ￟@Qn]-Yx\~JLLdtO/^4Zf͚z7 aÆiҤIfggo߾ڶm+ݫ^zٳkjݺ584ibnaa8gl޼YTnn{ƍ" `עvZjS-WTTQFq_СCovDDS>@>^zkcԻwopϟ:@*b;Cv9miii[pBWl6ԩ5R||96vX.1+Whj޼x }jo߾ڵfYY]vi׮]***r5nX}ڴiA ZJHHph>] gJ3Ϩf͚9szmӯ|}}նm[EEE)**J͛7Wxx7oڵk+ -..V^^222t(99YGիWb õuVlْ p?GСC:t~~~]ٮPn~I>}{ `SLQTTF*))QVVmۖf5jhʕZ`  pK3\PÆ i&=f `^zڼy^~e1vX*&&f `bӆ jժZbBBBh 4M2f8' ,Ԯ][K,ч~,=嗵qF5lؐ `{QJJ&O,//ނUbh„ JMMc=ƯnݺZtԳgORzꥤ$;hP|JHHлᆱr[o)!!A;v!X@uرcժU+N:iÆ :q&M׮XϛKs>wyGڵ)M6Zbk :`i„ JNNƍeZeXh$;V>>}ZϟשSt%%%%?GjRHHO_M֪U_={VΝ36M'NThh `0+,,Laaa:@k֬)_ݻ?nlJKK5j(mݺp:.r_)44?kJ6l]v)<<蜋4p@%&&X<ύ7ިm۶+W4`XY,Wk֬Q>}֭رce ƍmnII.ݻE@yyfihݢ"yJIIaxk۶m 3Z~,ӤIm۶M 40Z߿X,e˖WZ=v옆 s x]jQѺ|N[3h1ZwǎT^^" `<Æ ;#bu4m4 g;v^yu|M͝;@}Q=Λ7O/2 3͟?_=3fY,饗^o~5m6&OO?@b 4hR9R_|*..N{6Z=zE@yqFuhK.)66V,_C mذAGVaasom&XP4i! @ @ @ @ `@ `@ `@ `@ `@ `@ `@ `@ `X `X `X `X `X,X,X,X,X,X,X,X, , qyE8j<¡CކAbqyԗX,X,X,XUUK>f`Z6|`X,X,X,X,X,X,X,X, , , , ,;46MNRZZ\IRppBBBTNlRaaam `B|e%''خmԲeKjݻh*U]dff*11QIIIJLLTbbڶq:sG#77Wo^{5eff^kȑ#:r-Z:uhʔ):u4iA `y u!]rH*..?ER_;''G ,Ћ/x@?իG,wS~mOi&M6MUZTo֮] h4@rUMc<ӦMҥKє)Sa\R!!!,jTTTD#PPP{G7oveZoE"WN W?:xVΝ;XpOo>5l0@WpYO>iۀK]tQxxBCC%IyyygϞke5abPC\\^ykѢfϞ#G*88jݺuZ`9PkW^Y,+B^>l6&NJ5f`,7hEGG[g}9sC8իWO֭S^MiӦG6lw/--գ>ݻwU!եKuY;wVTTZnٳO>G}dujΝj߾u׎VBBkw/l2M0@r%)LuYZofӬYoXWJQddԻwoٵͳ>ѣGhY|}}ձcǟ拎M7ݤjߛ͛7+99ӦMwQ޽?瞳kӧzj;@r,t =Yfw3<8>|خ_4fHWC)!!>l>d `Uwߵ{l˖-5~*գG* Reee?a3gfΜi؏>H,(۵k[fM=܆  5P6mbA,8ߺu;dȐXUȑ#d_,l߾{9R>s?PӕfX???{Pfee|B εk.vMj2>Gooo} ,yKvmNgLLLT$vi֭[TRE#I;wv\;ud÷322 0իW[~}5jisQZliC@;zc[n:2G @*MFFc[h:2tXyc#"">_GHxJsI6iudTӧO=np|6lhSN@ζ{3Aƍ=ҥK`Ƚԩ֭[es=f͚N%X9F.1oGA`TAA[*G .|=cs])`9pJKK*gX\#ÑPCPmq @*f rԑ8p[\\2.**}ȯ#a,(w=ET, %>[U&td,4s֭xWБG .jr ,(Ţڵk=>//sͭJ;}!$$D>>>,24iVܹsvmڴ) ,0 X!<<`^DDcO<:2HXy9v7o 0Ev=q7 47|P~~Z^^#G=K.,0զMVTTNkjj ۨQ#5hЀ;v{6Ϥ*'gj3\IENDB`qxw-20200708/qxwplugin.h0000664000175000017500000000734013674705417012640 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include typedef unsigned int uchar; #define ICC_DASH 61 // internal character code for `-' #define MXSZ 63 // maximum grid dimension #define MXLE 250 // maximum entries in light extern int treatedanswer(const char*light); extern int treatedanswerU(const uchar*light); extern int treatedanswerICC(const char*light); extern int isword(const char*light); extern int iswordU(const uchar*light); extern int iswordICC(const char*light); extern int ICCtoclass(char c); extern char uchartoICC(int c); extern uchar ICCtouchar(char c); extern void printU(uchar c); extern void printUs(const uchar*s); extern void printICC(char c); extern void printICCs(const char*s); #ifdef _WIN32 __declspec(dllexport) void init(); __declspec(dllexport) void finit(); __declspec(dllexport) int treat(const char*answer); __declspec(dllimport) int clueorderindex; __declspec(dllimport) int gridorderindex[]; __declspec(dllimport) int checking[]; __declspec(dllimport) int lightlength; __declspec(dllimport) int lightx; __declspec(dllimport) int lighty; __declspec(dllimport) int lightdir; __declspec(dllimport) char *treatmessage[]; __declspec(dllimport) uchar*treatmessageU[]; __declspec(dllimport) char *treatmessageICC[]; __declspec(dllimport) char *treatmessageICCAZ[]; __declspec(dllimport) char *treatmessageICCAZ09[]; __declspec(dllimport) uchar*treatmessageUAZ[]; __declspec(dllimport) uchar*treatmessageUAZ09[]; __declspec(dllimport) char *treatmessageAZ[]; __declspec(dllimport) char *treatmessageAZ09[]; __declspec(dllimport) char msgchar[]; __declspec(dllimport) uchar msgcharU[]; __declspec(dllimport) uchar msgcharUAZ[]; __declspec(dllimport) uchar msgcharUAZ09[]; __declspec(dllimport) char msgcharICC[]; __declspec(dllimport) char msgcharICCAZ[]; __declspec(dllimport) char msgcharICCAZ09[]; __declspec(dllimport) char msgcharAZ[]; __declspec(dllimport) char msgcharAZ09[]; __declspec(dllimport) char *answerICC; __declspec(dllimport) uchar*answerU; #else extern int clueorderindex; extern int*gridorderindex; extern int*checking; extern int lightlength; extern int lightx; extern int lighty; extern int lightdir; extern char *treatmessage[]; extern uchar*treatmessageU[]; extern char *treatmessageICC[]; extern char* treatmessageICCAZ[]; extern char* treatmessageICCAZ09[]; extern uchar*treatmessageUAZ[]; extern uchar*treatmessageUAZ09[]; extern char *treatmessageAZ[]; extern char *treatmessageAZ09[]; extern char msgchar[]; extern uchar msgcharU[]; extern uchar msgcharUAZ[]; extern uchar msgcharUAZ09[]; extern char msgcharICC[]; extern char msgcharICCAZ[]; extern char msgcharICCAZ09[]; extern char msgcharAZ[]; extern char msgcharAZ09[]; extern const char *answerICC; extern const uchar*answerU; #endif static char light [MXLE+1]; static uchar lightU[MXLE+1]; qxw-20200708/treatment.h0000664000175000017500000000214413674705417012602 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __TREATMENT_H__ #define __TREATMENT_H__ extern int getinitflist(int**l,int*ll,struct lprop*lp,int wlen); extern int pregetinitflist(void); extern int postgetinitflist(void); extern char*loadtpi(void); extern void unloadtpi(void); extern void reloadtpi(void); #endif qxw-20200708/icon-96x96.png0000664000175000017500000000406113674704262012664 0ustar momoPNG  IHDR``w8bKGD pHYs B(xtIME 61IDATx_HSoǿkεKR1"M3 M$J@UEPBuURVJZisRwQ9g8=>9aaf!Dzr@@ _10At!"\.`Xt:󑝝Obɒ%ӺNvSzz:iZjDQ$VKΜ9`;ᑑ$V>,ZΟ?ODD3B ,_r 1aKr׋߭F^ק:100dT8,؝˜ _b``mmmrR\d2!99y^v~7nܠիWZ5$''Saa!9&"07LbLSYYI^7Dvv6([~=JKKQttt߿W\/_b1 z D}r\A ŢoÆ M,EQwM:Abc,T8r nnng*촴痢KJVSS3c{(MѼիL={LQ 5<&| Ν;òfdeeIUUUl|ć$vSNI?~?rZZZ>bZuyxݺu l"-[?x ȏ?"f[@NRRR>!VȑOطEvOOiKLLd&;u\NW(:e@AA\cccv/]$9NIIOP ]jśq\\l&~D=C{e=SMOx<cڵ /G/{왱CIg+**j1/NNYYNWWOLr._L~ޡ!ڿDD\ SFF‰999tݠ;wFcǎqVLpOdZbPnnnAGrf\8let:z&F.$<%͹1*lݎ>$$$vӒP^^y85ʕ+M<-26 w q(Q[[m۶jVտj,;,ݼyS2@Ds~r^ bLU, , 0,"d(000rː"`3b>б8E;f&4 p:15@ G+\Ǐ6CYQЌx>}Ʉ{ PT(..ÇYLӣH*** b L)V%Db((++Cmm`~p8p8luLCpP||<رCQ'iՀ[|>)xׯ&IQ @ Az{{8c|o߾b|@A|! &R,@tvv|xB?&6dm/IENDB`qxw-20200708/draw.c0000664000175000017500000015511213674705417011533 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "qxw.h" #include "draw.h" #include "gui.h" #include "dicts.h" int bawdpx,hbawdpx; static int sfcxoff=0,sfcyoff=0; static double sdirdx[NGTYPE][MAXNDIR]={{1,0},{ 1.2,1.2,0 },{1.4,0.7,-0.7},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{1,0}}; static double sdirdy[NGTYPE][MAXNDIR]={{0,1},{-0.7,0.7,1.4},{0 ,1.2, 1.2},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}}; char*dname[NGTYPE][MAXNDIR]={{"Across","Down"},{"Northeast","Southeast","South"},{"East","Southeast","Southwest"},{"Ring","Radial"},{"Ring","Radial"}, {"Across","Down"},{"Across","Down"},{"Across","Down"},{"Across","Down"},{"Across","Down"}, {"Across","Down"},{"Across","Down"},{"Across","Down"} }; double gscale=1; // global scaling for cairo operations // GERNERAL DRAWING void moveto(cairo_t*cc,double x,double y) {cairo_move_to(cc,x*gscale,y*gscale);} void lineto(cairo_t*cc,double x,double y) {cairo_line_to(cc,x*gscale,y*gscale);} void rmoveto(cairo_t*cc,double x,double y) {cairo_rel_move_to(cc,x*gscale,y*gscale);} void rlineto(cairo_t*cc,double x,double y) {cairo_rel_line_to(cc,x*gscale,y*gscale);} void setlinewidth(cairo_t*cc,double w) {cairo_set_line_width(cc,w*gscale);} void setlinecap(cairo_t*cc,int c) {cairo_set_line_cap(cc,c);} void closepath(cairo_t*cc) {cairo_close_path(cc);} void fill(cairo_t*cc) {cairo_fill(cc);} void stroke(cairo_t*cc) {cairo_stroke(cc);} void strokepreserve(cairo_t*cc) {cairo_stroke_preserve(cc);} void clip(cairo_t*cc) {cairo_clip(cc);} void gsave(cairo_t*cc) {cairo_save(cc);} void grestore(cairo_t*cc) {cairo_restore(cc);} void setrgbcolor(cairo_t*cc,double r,double g, double b) {cairo_set_source_rgb(cc,r,g,b);} void setrgbacolor(cairo_t*cc,double r,double g, double b,double a) {cairo_set_source_rgba(cc,r,g,b,a);} static PangoLayout*playout; static PangoFontDescription*fdesc; static double bheight; void settext(cairo_t*cc,char*s,double h,int fs) { static cairo_t*occ=0; static int ofs=-1; static double oh=-1; h*=gscale; if(cc!=occ) { if(playout) g_object_unref(playout); playout=pango_cairo_create_layout(cc); occ=cc; ofs=-1; oh=-1; } DEB_RF printf("settext(%s,%g,%d)\n",s,h,fs); if(!fdesc) fdesc=pango_font_description_from_string("Sans"); if(h!=oh) { pango_font_description_set_absolute_size(fdesc,(int)(h*PANGO_SCALE+.5)); pango_layout_set_font_description(playout,fdesc); oh=h; } if(fs!=ofs) { pango_font_description_set_weight(fdesc,(fs&1)?PANGO_WEIGHT_BOLD :PANGO_WEIGHT_NORMAL); pango_font_description_set_style (fdesc,(fs&2)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL); pango_layout_set_font_description(playout,fdesc); ofs=fs; } pango_layout_set_text(playout,s,-1); pango_cairo_update_layout(cc,playout); bheight=(double)pango_layout_get_baseline(playout)/PANGO_SCALE/gscale; } void showtext(cairo_t*cc) { rmoveto(cc,0,-bheight); pango_cairo_show_layout(cc,playout); } double textwidth(cairo_t*cc) { int x,y; // PangoRectangle ir,lr; pango_layout_get_size(playout,&x,&y); // seems that this doesn't work rounds to multiples of 1024=PANGO_SCALE in some versions of Pango; hence need for gscale everywhere DEB_RF printf(" (x=%d y=%d)\n",x,y); // pango_layout_get_extents(playout,&ir,&lr); //DEB_RF printf(" (PANGO_SCALE=%d ir=[%d %d %d %d] lr=[%d %d %d %d])\n",PANGO_SCALE, ir.x,ir.y,ir.width,ir.height, lr.x,lr.y,lr.width,lr.height ); return (double)x/PANGO_SCALE/gscale; // return (double)ir.width/PANGO_SCALE/gscale; } void ltext(cairo_t*cc,char*s,double h,int fs) { moveto(cc,0,0); settext(cc,s,h,fs); showtext(cc); } // Centered text. If ocm==0, print normally spaced; if ocm==1, print one character at a time, regularly spaced void ctext(cairo_t*cc,char*s,double x,double y,double h,int fs,int ocm) { int i,l,m; char*p,t[SLEN+1]; double u; DEB_RF printf("ctext(..,<%s>,x=%f,y=%f,h=%f,fs=%d,ocm=%d)\n",s,x,y,h,fs,ocm); if(!ocm) { settext(cc,s,h,fs); u=x-textwidth(cc)/2.0; DEB_RF printf(" tw=%f,u=%f\n",textwidth(cc),u); moveto(cc,u,y); showtext(cc); return; } for(l=0,p=s;*p;l++) { m=q_mblen(p); if(m<1) break; p+=m; } for(i=0,p=s;*p;i++) { m=q_mblen(p); if(m<1) return; strncpy(t,p,m); t[m]=0; settext(cc,t,h,fs); u=x-textwidth(cc)/2.0+(i+i+1-l)*h*.4; moveto(cc,u,y); showtext(cc); p+=m; } } // Cairo's arc drawing does not seem to work well as part of a path, so we do our own void arc(cairo_t*cc,double x,double y,double r,double t0,double t1) {double u; if(t11.0/pxsq) { // error of approx 1/4 px? u=(t0+t1)/2; arc(cc,x,y,r,t0,u); arc(cc,x,y,r, u,t1); } else lineto(cc,x+r*cos(t1),y+r*sin(t1)); } void arcn(cairo_t*cc,double x,double y,double r,double t0,double t1) {double u; if(t01.0/pxsq) { // error of approx 1/4 px? u=(t0+t1)/2; arcn(cc,x,y,r,t0,u); arcn(cc,x,y,r, u,t1); } else lineto(cc,x+r*cos(t1),y+r*sin(t1)); } static void setrgbcolor24(cairo_t*cc,int c) {setrgbcolor(cc,((c>>16)&255)/255.0,((c>>8)&255)/255.0,(c&255)/255.0);} static void setrgbcolor24a(cairo_t*cc,int c,double a) {setrgbacolor(cc,((c>>16)&255)/255.0,((c>>8)&255)/255.0,(c&255)/255.0,a);} // GRID GEOMETRY static void vxcoords(double*x0,double*y0,double x,double y,int d) {double t; switch(gshape[gtype]) { case 0: *x0=x; *y0=y; switch(d) { case 3: break; case 0:*x0+=1.0; break; case 1:*x0+=1.0;*y0+=1.0;break; case 2: *y0+=1.0;break; default:assert(0);break; } break; case 1: *x0=x*1.2+.4; *y0=y*1.4+((int)floor(x)&1)*.7; switch(d) { case 5: break; case 0:*x0+=0.8; break; case 1:*x0+=1.2;*y0+=0.7;break; case 2:*x0+=0.8;*y0+=1.4;break; case 3: *y0+=1.4;break; case 4:*x0-=0.4;*y0+=0.7;break; default:assert(0);break; } break; case 2: *y0=y*1.2+.4; *x0=x*1.4+((int)floor(y)&1)*.7; switch(d) { case 4: break; case 3:*y0+=0.8; break; case 2:*y0+=1.2;*x0+=0.7;break; case 1:*y0+=0.8;*x0+=1.4;break; case 0: *x0+=1.4;break; case 5:*y0-=0.4;*x0+=0.7;break; default:assert(0);break; } break; case 3:case 4: switch(d) { case 3: break; case 0:x+=1.0; break; case 1:x+=1.0;y+=1.0;break; case 2: y+=1.0;break; } t=2*PI*((gshape[gtype]==4)?x-0.5:x)/width; *x0= (height-y)*sin(t)+height; *y0=-(height-y)*cos(t)+height; break; } } void edgecoords(double*x0,double*y0,double*x1,double*y1,int x,int y,int d) { vxcoords(x0,y0,(double)x,(double)y,d); vxcoords(x1,y1,(double)x,(double)y,(d+1)%(ndir[gtype]*2)); } // find centre coordinates for merge group containing x,y void mgcentre(double*u,double*v,int x,int y,int d,int l) { double x0=0,y0=0,x1=0,y1=0; if(gshape[gtype]==3||gshape[gtype]==4) { if(EVEN(d)) vxcoords(u,v,x+l/2.0,y+0.5,3); else vxcoords(u,v,x+0.5,y+l/2.0,3); return; } if(gtype>4) { // we are on a square-format grid but there is potential for wrap-around while(l>2) stepforw(&x,&y,d),l-=2; if((d==0&&x==width -1)||(d==1&&y==height-1)) l=1; } vxcoords(&x0,&y0,(double)x,(double)y,0); vxcoords(&x1,&y1,(double)x,(double)y,ndir[gtype]); *u=(x0+x1)/2+sdirdx[gtype][d]*(l-1)/2.0; *v=(y0+y1)/2+sdirdy[gtype][d]*(l-1)/2.0; } static void addvxcoordsbbox(double*x0,double*y0,double*x1,double*y1,double x,double y,int d) {double vx=0,vy=0; vxcoords(&vx,&vy,x,y,d); if(vx<*x0) *x0=vx; if(vx>*x1) *x1=vx; if(vy<*y0) *y0=vy; if(vy>*y1) *y1=vy; } static void addsqbbox(double*x0,double*y0,double*x1,double*y1,int x,int y) {int d; double vx=0,vy=0; mgcentre(&vx,&vy,x,y,0,1); if(vx-0.5<*x0) *x0=vx-0.5; // include a 1x1 square centred in the middle of the merge group for the letter if(vx+0.5>*x1) *x1=vx+0.5; if(vy-0.5<*y0) *y0=vy-0.5; if(vy+0.5>*y1) *y1=vy+0.5; for(d=0;d1) s=1; return s; } static void movetoorig(cairo_t*cc,int x,int y) {double x0=0,y0=0; switch(gshape[gtype]) { case 0: vxcoords(&x0,&y0,(double)x,(double)y,3);break; case 1: vxcoords(&x0,&y0,(double)x,(double)y,5);break; case 2: vxcoords(&x0,&y0,(double)x,(double)y,4);break; case 3:case 4: vxcoords(&x0,&y0,(double)x,(double)y,1); break; } moveto(cc,x0,y0); } static void movetomgcentre(cairo_t*cc,int x,int y,int d,int l) {double u=0,v=0; mgcentre(&u,&v,x,y,d,l); moveto(cc,u,v); } // draw path for edges with bits set in mask b static void edges(cairo_t*cc,int x,int y,int b) {int f,g,i,j,n,o;double x0=0,y0=0,x1=0,y1=0,t; n=ndir[gtype]*2; b&=(1<>o)&1)==0) break; // find a place to start drawing f=0;g=0; for(i=0;i>j)&1) { edgecoords(&x0,&y0,&x1,&y1,x,y,j); if(f==0) moveto(cc,x0,y0); if((gshape[gtype]==3||gshape[gtype]==4)) { if(j&1) { t=2*PI*((gshape[gtype]==4)?x-0.5:x)/width-PI/2; if(j==1) arcn(cc,(double)height,(double)height,height-y-.999, t+2*PI/width,t); else arc (cc,(double)height,(double)height,height-y ,t,t+2*PI/width); } else lineto(cc,x1,y1); } else { // the following is to defeat this bug: // https://bugs.freedesktop.org/show_bug.cgi?id=39551 lineto(cc,(x0+x1)/2,(y0+y1)/2); moveto(cc,(x0+x1)/2,(y0+y1)/2); lineto(cc,x1,y1); } f=1; } else f=0,g=1; } if(g==0) closepath(cc); } // draw path for outline of a `square' static void sqpath(cairo_t*cc,int x,int y) {int i;double x0=0,y0=0,t; vxcoords(&x0,&y0,(double)x,(double)y,0); moveto(cc,x0,y0); switch(gshape[gtype]) { case 0: case 1: case 2: for(i=1;igx1) gx1=sx1; if(sy1>gy1) gy1=sy1; sfq[x][y]=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,sx1-sx0,sy1-sy0); } DEB_RF printf("Overall bbox = (%d,%d)-(%d,%d)\n",gx0,gy0,gx1,gy1); sfb=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,gx1,gy1); // take top left as (0,0) sfc=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,pxsq,pxsq); sfs=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,gx1+hbawdpx-1,gy1+hbawdpx-1); sfh=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,gx1,gy1); sfn=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,gx1,gy1); } // Refresh drawing area: called here with clip already set on cr, so we can // just repaint everything. void repaint(cairo_t*cc) {int i,j; assert(sfb); cairo_set_source_surface(cc,sfb,bawdpx,bawdpx); // paint background cairo_paint(cc); cairo_set_source_surface(cc,sfc,sfcxoff,sfcyoff); // paint cursor cairo_paint(cc); cairo_set_source_surface(cc,sfh,bawdpx,bawdpx); // paint hints cairo_paint(cc); for(j=0;jctlen[i]>l) l=sq->ctlen[i]; // find longest contents string h=0.7/nd; if(h>1.0/l) h=1.0/l; for(i=0;ictbm[i],sq->ctlen[i]); if(dots) for(j=0;s[j];j++) if(s[j]==' ') s[j]='.'; ctext(cc,s,u,v+((i-(nd-1.0)/2.0)*h+0.42*h)*sc,h*sc,getfstyle(xr,yr),ocm); } } else { s[0]=0; l=0; for(i=0;ictlen[i]; // total content length for(i=0;ictbm[i],sq->ctlen[i]); // printf("drawct: %016llx >%s< l=%d\n",sq->ctbm[0][0],s,l); if(dots&&l>1) for(i=0;s[i];i++) if(s[i]==' ') s[i]='.'; h=0.7; if(l>1) h=1.0/l; ctext(cc,s,u,v+0.42*h*sc,h*sc,getfstyle(xr,yr),ocm); } } // draw bars and edges // lf=1 draw entered letter also // ocm flag passed on to ctext static void drawsqfg(cairo_t*cc,int x,int y,int sq,int ba,int lf,int ocm,double textscale) { int b,d,f,m,xr,yr; // edges and bars b=0; for(d=0;d=2); tl=getmergegroupd(0,0,lx[0],ly[0],d); movetomgcentre(cc,lx[0],ly[0],d,tl); mgcentre(&u,&v,lx[0],ly[0],d,tl); for(k=1;k=5) { // potential for wrap-around? if(d==0&&(lx[k]=100 int i,j,l,md,nc,pd[MXSZ][MXSZ],vis[MXSZ][MXSZ],x,y,x0,y0; double sc[MXCL],u,v,xc[MXCL],yc[MXCL]; setlinecap(cc,1); memset(vis,0,sizeof(vis)); for(i=0;i=ndir[gtype]) refreshsel2(cc); cairo_destroy(cc); invaldaall(); gscale=1; } void refreshcur() { double sc,c=0,s=0,u,v; int m,x,y; char t[20]; static int ocx=0,ocy=0; cairo_t*cc; cc=cairo_create(sfc); setrgbacolor(cc,0.0,0.0,0.0,0.0); cairo_set_operator(cc,CAIRO_OPERATOR_SOURCE); cairo_paint(cc); cairo_set_operator(cc,CAIRO_OPERATOR_OVER); sc=getscale(curx,cury,0,1)*pxsq; gscale=1; setrgbacolor(cc,0.6,0.6,0.6,0.8); setlinewidth(cc,2); if(curdir1) { curmux=curmux%m; sprintf(t,"%d",curmux+1); setrgbacolor(cc,0.0,1.0,0.0,1.0); ctext(cc,t,pxsq*0.5,pxsq*0.3,pxsq*0.35,0,0); setrgbacolor(cc,0.6,0.6,0.6,0.8); } } } else { // moveto(cc,pxsq/2+sc/4,pxsq/2); // circle in VL mode // arc(cc,pxsq/2,pxsq/2,sc/4,0,2*PI); // closepath(cc); // fill(cc); } mgcentre(&u,&v,curx,cury,0,1); x=(int)floor(u*pxsq+0.5); y=(int)floor(v*pxsq+0.5); sfcxoff=x-pxsq/2+bawdpx; sfcyoff=y-pxsq/2+bawdpx; invaldarect(sfcxoff,sfcyoff,sfcxoff+pxsq,sfcyoff+pxsq); mgcentre(&u,&v,ocx,ocy,0,1); x=(int)floor(u*pxsq+0.5); y=(int)floor(v*pxsq+0.5); invaldarect(x-pxsq/2+bawdpx,y-pxsq/2+bawdpx,x+pxsq/2+bawdpx,y+pxsq/2+bawdpx); ocx=curx;ocy=cury; cairo_destroy(cc); gscale=1; } static int ismkcirc(int x,int y,int c) {char s[MXMK+1]; getmk(s,x,y,c); return !STRCASECMP(s,"\\o"); } static int isanymkcirc(int x,int y) {int c; for(c=0;c=MAXICC) strcpy(s,"-"); else sprintf(s,"%d",cwperm[i]); } else if(!STRCASECMP(s,"\\#")) { if(f==0) return ""; n=getnumber(x,y); if(n<=0) return ""; sprintf(s,"%d",n); } else if(!STRCASECMP(s,"\\i")) { if(nvl<1) return ""; for(i0=-1,i=0;iflbm; // not already entered? show hints } setrgbcolor(cc,0.75,0.75,0.75); drawct(cc,x,y,&sq,1,1,1.0); } else if(c<0) { // normally checked one-character cell with none/more than one bit set in bitmap if(gsq[x][y].ents[0][0]!=0) m=gsq[x][y].ents[0][0]->flbm; else m=0; k=cbits(m); // any info from filler? if(k==0) strcpy(s,"?"); // no feasible letters else if(k==1) strcpy(s,icctoutf8[abmtoicc(m)]); // unique feasible letter else strcpy(s," "); setrgbcolor(cc,0.75,0.75,0.75); mgcentre(&u,&v,x,y,md,l); ctext(cc,s,u,v+0.3*sc,.7*sc,getfstyle(x,y),1); if(k>1&&k"); if(fs&2) fprintf(fp,""); xmlesc(fp,s); if(fs&2) fprintf(fp,""); if(fs&1) fprintf(fp,""); } // convert light/answer to string form for display void ansform(char*t0,int t0l,int ln,int wlen,unsigned int dmask) { struct answer*a; int em,f,i; em=lts[ln].em; t0[0]=0; if(em>0&&em<4) { // special entry method (but not jumble)? give grid form too for(i=0;lts[ln].s[i];i++) strcat(t0,icctoutf8[(int)lts[ln].s[i]]); strcat(t0,": "); } DEB_EX printf("ansform: t0=<%s> ln=%d dmask=0x%08x\n",t0,ln,dmask); if(lts[ln].ans<0) return; // negative ans values should not occur here a=ansp[lts[ln].ans]; f=0; for(;a;a=a->acf) { DEB_EX printf(" a=%p cfdmask=%08x cf=<%s> acf=%p t0=<%s>\n",(void*)a,a->cfdmask,a->cf,(void*)a->acf,t0); if(a->cfdmask&dmask) { if((int)strlen(t0)+(int)strlen(a->cf)+2>t0l-LEMDESCLEN-10) {strcat(t0,"...");break;} if(f) strcat(t0,", "); strcat(t0,a->cf); f++; DEB_EX printf(" t0=<%s>\n",t0); } } if(em>0) strcat(t0,lemdesc[lts[ln].em]); DEB_EX printf(" done: acf=%p t0=<%s>\n",(void*)a->acf,t0); } // Output answers in direction dir; if dir==-1 do VL:s // html=0: plain text // html=1: block HTML with enumeration // html=2: block HTML // html=3: table HTML // html=4: CCW XML words // html=5: CCW XML clues // cf=1: word lists are valid, can be used for citation forms // wordid: pointer to wordid counter, used for CCW XML output static void panswers(FILE*fp,int dir,int html,int cf,int*wordid) { int d,f,i,j,k,ll,m,m0,m1,n,vlf; char s[SLEN]; char t[MXLE*16+1]; char t0[MXFL*10+100]; struct word*w; vlf=(dir==-1); // doing virtual lights? for(j=0;j<(vlf?1:height);j++) for(i=0;i<(vlf?1:width);i++) for(d=vlf?100:dir;d<(vlf?100+nvl:(dir+1));d++) { // loop over all possible answers if(!vlf&&!isstartoflight(i,j,d)) continue; if(ismux(i,j,d)) {m0=0;m1=getmaxmux(i,j,d);} else {m0=-1;m1=0;} for(m=m0;m0) sprintf(s,"%d",n); else strcpy(s,"-"); // unnumbered light if (html==0) fprintf(fp,"%s ",s); else if(html==1) fprintf(fp,"%s ",s); else if(html==2) fprintf(fp,"%s ",s); else if(html==3) fprintf(fp,"%s\n",s); else if(html==4) { if(dir==0) fprintf(fp,"\n",*wordid,i+1,i+ll,j+1); if(dir==1) fprintf(fp,"\n",*wordid,i+1,j+1,j+ll); } else if(html==5) fprintf(fp,"",*wordid,s,ll); if(html!=4) { if(f) { if(vlf) w=vls[d-100].w; else w=gsq[i][j].w[d][(m<0)?0:m]; } else w=0; if(w&&w->flistlen>0) { for(k=0;kflistlen;k++) { if(k>0) fprintf(fp,"; "); ansform(t0,sizeof(t0),w->flist[k],w->wlen,w->lp->dmask); if(html==0) fprintf(fp,"%s",t0); else xmlesc(fp,t0); } } else xmlesc(fp,t); } if (html==0) fprintf(fp," (%d)\n",ll); else if(html==1) fprintf(fp," (%d)
\n",ll); else if(html==2) fprintf(fp,"\n"); else if(html==3) fprintf(fp," (%d)\n",ll); // answer and length else if(html==5) fprintf(fp,"
\n"); if(wordid) (*wordid)++; } } } // HTML export // f b0: include grid // f b1: include answers in grid // f b2: include numbers in grid // f b3: include answers in table (to be edited into clues) // f b4: include answers in compact format // f b5: include link to grid image (given URL) // Thanks to Paul Boorer for CSS suggestions void a_exportgh(int f,char*url) { int c,cf,d,fl,i,j,i0,j0,k,l,md,u,v,x,y,bg,fg,mk,fs,fh; int de,nd; int hbawd; double textscale; FILE*fp; textscale=((f&6)==6)?0.8:1; // smaller text if we are doing numbers and entries hbawd=hpxsq/8; // a suitable bar width if(hbawd<3) hbawd=3; hbawd|=1; // ensure it is odd DEB_EX printf("export HTML %s\n",filename); fp=q_fopen(filename,"w"); if(!fp) {fserror();return;} cf=!preexport(); // emit header and CSS fprintf(fp, "\n" "\n" "\n" "\n" "",RELEASE); xmlesc(fp,titlebyauthor()); fprintf(fp,"\n"); fprintf(fp,"\n"); if(f&1) { // need the styles for the grid fprintf(fp,"\n"); } fprintf(fp,"\n\n\n"); if(f&1) { fprintf(fp,"
\n"); fprintf(fp,"
\n",width*hpxsq+1,height*hpxsq+1); fprintf(fp,"
\n",width*hpxsq+1,height*hpxsq+1); for(j=0;j
\n",i*hpxsq+1,j*hpxsq+1);continue;} fprintf(fp,"
\n",i*hpxsq+1,j*hpxsq+1,bg,hpxsq); } for(j=0;j
\n",(i+1)*hpxsq-hbawd/2,j*hpxsq); else fprintf(fp,"
\n",(i+1)*hpxsq-hbawd/2,j*hpxsq); } if(isbar(i,j,1)) { if(isbar(i,j,2)) fprintf(fp,"
\n",i*hpxsq-hbawd/2,(j+1)*hpxsq-hbawd/2); else fprintf(fp,"
\n",i*hpxsq,(j+1)*hpxsq-hbawd/2); } if(isbar(i,j,2)) { if(isbar(i,j,3)) fprintf(fp,"
\n",i*hpxsq-hbawd/2,j*hpxsq-hbawd/2); else fprintf(fp,"
\n",i*hpxsq-hbawd/2,j*hpxsq); } if(isbar(i,j,3)) { if(isbar(i,j,0)) fprintf(fp,"
\n",i*hpxsq,j*hpxsq-hbawd/2); else fprintf(fp,"
\n",i*hpxsq,j*hpxsq-hbawd/2); } for(c=0;c<4;c++) { char*p; p=getmktext(i,j,c,!!(f&4)); // pass number-enable flag if(!strcmp(p,"")) continue; mk=getmkcol(i,j); switch(c) { case 0: fprintf(fp,"
",i*hpxsq+4,j*hpxsq+1 ,mk); xmlesc(fp,p); fprintf(fp,"
\n"); break; case 1: fprintf(fp,"
",i*hpxsq+1,j*hpxsq+1 ,mk); xmlesc(fp,p); fprintf(fp,"
\n"); break; case 2: fprintf(fp,"
",i*hpxsq+1,j*hpxsq+hpxsq*2/3-4,mk); xmlesc(fp,p); fprintf(fp,"
\n"); break; case 3: fprintf(fp,"
",i*hpxsq+4,j*hpxsq+hpxsq*2/3-4,mk); xmlesc(fp,p); fprintf(fp,"
\n"); break; } } } for(j=0;j2) stepforw(&i0,&j0,md),l-=2; if((md==0&&i0==width-1)||(md==1&&j0==height-1)) l=1; x=((i0*2+(md==0)*(l-1))*hpxsq)/2+1; y=((j0*2+(md==1)*(l-1))*hpxsq)/2+hpxsq/2; de=getdech(i,j); nd=ndir[gtype]; if(de==0) nd=1,de=1; if(de==2) { l=3; for(k=0;kl) l=gsq[i][j].ctlen[k]; // find longest fh=(int)floor(hpxsq*textscale/l+.5); abmstodispstr(s,gsq[i][j].ctbm[0],gsq[i][j].ctlen[0]); fprintf(fp,"
",x,y-fh,fg,fh); xmlescfs(fp,s,fs); fprintf(fp,"
\n"); abmstodispstr(s,gsq[i][j].ctbm[1],gsq[i][j].ctlen[1]); fprintf(fp,"
",x,y,fg,fh); xmlescfs(fp,s,fs); fprintf(fp,"
\n"); } else { s[0]=0; for(k=0,l=0;k",x,y-fh/2,fg,fh); xmlescfs(fp,s,fs); fprintf(fp,"\n"); } } } for(j=0;j<=height;j++) for(i=0,v=0;i<=width;i++) { if(j==0) u=!ismerge(i,j ,3); else u=!ismerge(i,j-1,1); u&=sqexists(i,j)|sqexists(i,j-1); if(u==0&&v>0) fprintf(fp,"
\n",(i-v)*hpxsq,j*hpxsq,v*hpxsq+1); if(u==0) v=0; else v++; } for(i=0;i<=width;i++) for(j=0,v=0;j<=height;j++) { if(i==0) u=!ismerge(i ,j,2); else u=!ismerge(i-1,j,0); u&=sqexists(i,j)|sqexists(i-1,j); if(u==0&&v>0) fprintf(fp,"
\n",i*hpxsq,(j-v)*hpxsq,v*hpxsq+1); if(u==0) v=0; else v++; } fprintf(fp,"
\n"); } if(f&0x20) { fprintf(fp,"
\n"); fprintf(fp,"\"grid\n",url); fprintf(fp,"
\n"); } if(f&8) { // print table of `clues' fprintf(fp,"
\n"); for(d=0;d%s\n",96/ndir[gtype],dname[gtype][d]); if(d \n"); } fprintf(fp,"\n"); for(d=0;d
\n"); panswers(fp,d,3,cf,0); fprintf(fp,"
\n"); if(d \n"); } fprintf(fp,"\n"); if(nvl>0) { fprintf(fp,"Other\n",ndir[gtype]*2-1); fprintf(fp,"\n",ndir[gtype]*2-1); panswers(fp,-1,2,cf,0); fprintf(fp,"
\n"); } fprintf(fp,"
\n"); } if(f&16) { // print answers in condensed form for(d=0;d%s:\n",dname[gtype][d]); panswers(fp,d,2,cf,0); fprintf(fp,"
\n"); } if(nvl>0) { fprintf(fp,"Other:\n"); panswers(fp,-1,2,cf,0); fprintf(fp,"
\n"); } } fprintf(fp,"\n"); if(ferror(fp)) fserror(); if(fclose(fp)) fserror(); postexport(); } // GRID AS EPS OR PNG static cairo_status_t filewrite(FILE*fp,unsigned char*p,unsigned int n) { return (fwrite(p,1,n,fp)==n)?CAIRO_STATUS_SUCCESS:CAIRO_STATUS_WRITE_ERROR; } // f0 b1: include answers in grid // f0 b2: include numbers and marks in grid // f1: 0=EPS 1=SVG 2=PNG void a_exportg(char*fn,int f0,int f1) { cairo_surface_t*sf=0; cairo_t*cc; int i,j,sq=0,ba,px,py; char s[1000]; double textscale; FILE*fp=0; DEB_EX printf("a_exportg(\"%s\",%d,%d)\n",fn,f0,f1); switch(f1) { case 0: sq=eptsq; break; case 1: sq=eptsq; break; case 2: sq=hpxsq; break; } textscale=((f0&6)==6)?0.8:1; // smaller text if we are doing numbers and entries ba=sq/8; // a suitable bar width if(ba<2) ba=2; px=gwidth(sq,ba); py=gheight(sq,ba); switch(f1) { case 0: fp=q_fopen(fn,"w"); if(!fp) {fserror();return;} sf=cairo_ps_surface_create_for_stream((cairo_write_func_t)filewrite,fp,px,py); cairo_ps_surface_restrict_to_level(sf,CAIRO_PS_LEVEL_2); cairo_ps_surface_set_eps(sf,1); sprintf(s,"%%%%Title: %s generated by Qxw",fn); cairo_ps_surface_dsc_comment(sf,s); break; case 1: fp=q_fopen(fn,"w"); if(!fp) {fserror();return;} sf=cairo_svg_surface_create_for_stream((cairo_write_func_t)filewrite,fp,px,py); cairo_svg_surface_restrict_to_version(sf,CAIRO_SVG_VERSION_1_1); break; case 2: sf=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,px,py); break; } cc=cairo_create(sf); if(f1==2) { cairo_set_source_rgb(cc,1,1,1); // flood PNG to white to avoid nasty transparency effect in merged cells cairo_paint(cc); } cairo_translate(cc,ba-.5,ba-.5); gscale=sq; for(j=0;j\n"); fprintf(fp,"\n"); fprintf(fp,"\n\n\n\n",RELEASE); } for(d=0;d%s
\n\n",dname[gtype][d]); else fprintf(fp,"\n%s\n\n",dname[gtype][d]); panswers(fp,d,f,cf,0); } if(nvl>0) { if(f) fprintf(fp,"\nOther
\n\n"); else fprintf(fp,"\nOther\n\n"); panswers(fp,-1,f,cf,0); } if(f) fprintf(fp,"\n"); if(ferror(fp)) fserror(); if(fclose(fp)) fserror(); postexport(); } // COMBINED HTML AND PNG // f: 0=puzzle, 1=solution // f0: f0 flags for exportg // f1: 1=SVG, 2=PNG void a_exporthp(int f,int f0,int f1) { char url[SLEN+200]; char*base; strcpy(url,filename); strcat(url,"_files"); g_mkdir(url,0777); base=g_path_get_basename(url); strcat(url,f?"/solution":"/grid"); strcat(url,f1==1?".svg":".png"); a_exportg(url,f0,f1); // write out the image strcpy(url,base); strcat(url,f?"/solution":"/grid"); strcat(url,f1==1?".svg":".png"); a_exportgh(f?0x30:0x28,url); // write out the HTML with a link to the image g_free(base); } // Crossword Compiler XML // only the most basic of Qxw's features are represented in this export format void a_exportccwxml(char*fn) { FILE*fp; int cf,d,fl,i,j,n,wordid; if(gshape[gtype]!=0) { // check for basic limitations reperr("Cannot export non-rectangular grids\nto Crossword Compiler XML"); return; } for(j=0;j\n"); fprintf(fp,"\n"); fprintf(fp,"\n\n"); fprintf(fp,"\n"); fprintf(fp,""); xmlesc(fp,gtitle); fprintf(fp,"\n"); fprintf(fp,""); xmlesc(fp,gauthor); fprintf(fp,"\n"); fprintf(fp,"Qxw %s http://www.quinapalus.com\n",RELEASE); fprintf(fp,"\n"); fprintf(fp,"\n"); fprintf(fp,"\n\n"); fprintf(fp,"\n\n"); fprintf(fp,"\n",width,height); fprintf(fp,"\n",hpxsq); for(j=0;j>1)&0x7f7f7f)|0x808080)); else fprintf(fp," background-color=\"#%06X\"", getbgcol(i,j)); if(gsq[i][j].ctlen[0]==1&&onebit(gsq[i][j].ctbm[0][0])) { // only one character allowed fprintf(fp," solution=\""); xmlesc(fp,icctoutf8[abmtoicc(gsq[i][j].ctbm[0][0])]); fprintf(fp,"\""); } n=getnumber(i,j); if(n>0) fprintf(fp," number=\"%d\"",n); if(isbar(i,j,2)) fprintf(fp," left-bar=\"true\""); if(isbar(i,j,3)) fprintf(fp," top-bar=\"true\""); ew0: fprintf(fp,">\n"); } fprintf(fp,"\n\n"); wordid=1; panswers(fp,0,4,cf,&wordid); panswers(fp,1,4,cf,&wordid); wordid=1; for(d=0;d<2;d++) { fprintf(fp,"<b>%s</b>\n",dname[gtype][d]); panswers(fp,d,5,cf,&wordid); fprintf(fp,"\n"); } fprintf(fp,"\n\n"); fprintf(fp,"\n"); fprintf(fp,"\n"); if(ferror(fp)) fserror(); if(fclose(fp)) fserror(); postexport(); } qxw-20200708/gui.h0000664000175000017500000000310313674705417011357 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __GUI_H__ #define __GUI_H__ #define PXEDGE .2 // size of edge of box for clicking bar #define BAWD .139 // width of bar extern int selmode; extern int nsel; extern int pxsq; // pixels per square on display extern void setfilenamebase(char*s); extern void startgtk(void); extern void stopgtk(void); // all externally-callable functions respect the global variable usegui extern void invaldarect(int x0,int y0,int x1,int y1); extern void invaldaall(void); extern void stats_upd(void); extern void syncgui(void); extern void fserror(void); extern void fsgerr(void); extern void reperr(const char*s); extern void repwarn(const char*s); extern void killfipdia(void); extern void setposslabel(char*s); extern void updatefeas(void); #endif qxw-20200708/dicts.c0000664000175000017500000007532413674706224011707 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include // required for string conversion functions #include #include "common.h" #include "qxw.h" #include "gui.h" #include "dicts.h" #include "alphabets.h" // default dictionaries #ifdef _WIN32 // Windows default dictionaries stored in subfolder of {app} folder #define NDEFDICTS 1 char*defdictfn[NDEFDICTS]={ "\\Dictionaries\\UKACD18plus.txt" }; #else #define NDEFDICTS 4 char*defdictfn[NDEFDICTS]={ "/usr/dict/words", "/usr/share/dict/words", "/usr/share/dict/british-english", "/usr/share/dict/american-english"}; #endif // UTILITY FUNCTIONS // utf-8 string to uchar string, printable characters only // there appears to be no efficient cross-platform library function to do this // s points to utf-8 string, ucs to output buffer of length l // return number of output uchars // assumes valid input; output guaranteed 0-terminated if l>1; if l==1 but no recognised utf8 writes 0 int utf8touchars(uchar*ucs,const char*p,int l) { int i,j,l0,n; uchar c; unsigned char*s=(unsigned char*)p; l0=l-1; if(l0==0) l0=1; for(i=0;i=0x20&&*s<0x7f) {ucs[i++]=*s++; continue;} // ASCII-7 printable if(*s<0xc0) {s++; continue;} if(*s<0xe0) {n=1; c=*s&0x1f;} else if(*s<0xf0) {n=2; c=*s&0x0f;} else if(*s<0xf8) {n=3; c=*s&0x07;} else if(*s<0xfc) {n=4; c=*s&0x03;} else if(*s<0xfe) {n=5; c=*s&0x01;} else {s++; continue;} s++; for(j=0;j> 6)+0xc0,n= 0; else if(c< 0x10000U) *q++=(c>>12)+0xe0,n= 1; else if(c< 0x200000U) *q++=(c>>18)+0xf0,n= 2; else if(c< 0x4000000U) *q++=(c>>24)+0xf8,n= 3; else if(c<0x80000000U) *q++=(c>>30)+0xfc,n= 4; else return q; for(;n>=0;n--) *q++=((c>>(n*6))&0x3f)+0x80; *q=0; return q; } // uchar string to utf-8 string, printable characters only; up to 6 bytes per input uchar + zero termination output char*ucharstoutf8(char*q,uchar*s) { *q=0; for(;*s;s++) q=uchartoutf8(q,*s); return q; } // length of a 0-terminated uchar string int ucharslen(uchar*s) { int i; for(i=0;s[i];i++) ; return i; } // number of bytes in UTF-8 char pointed to by p int q_mblen(char*p) { if(*p == '\0') return 0; if(!(*p & 0x80)) return 1; else if((*p & 0xe0) == 0xc0) { if ((*(p+1) & 0xc0) != 0x80) return -1; else return 2; } else if((*p & 0xf0) == 0xe0) { if((*(p+1) & 0xc0) != 0x80) return -1; else if((*(p+2) & 0xc0) != 0x80) return -1; else return 3; } else if((*p & 0xf8) == 0xf0) { if((*(p+1) & 0xc0) != 0x80) return -1; else if((*(p+2) & 0xc0) != 0x80) return -1; else if((*(p+3) & 0xc0) != 0x80) return -1; else return 4; } else if((*p & 0xfc) == 0xf8) { if((*(p+1) & 0xc0) != 0x80) return -1; else if((*(p+2) & 0xc0) != 0x80) return -1; else if((*(p+3) & 0xc0) != 0x80) return -1; else if((*(p+4) & 0xc0) != 0x80) return -1; else return 5; } else if((*p & 0xfe) == 0xfc) { if((*(p+1) & 0xc0) != 0x80) return -1; else if((*(p+2) & 0xc0) != 0x80) return -1; else if((*(p+3) & 0xc0) != 0x80) return -1; else if((*(p+4) & 0xc0) != 0x80) return -1; else if((*(p+5) & 0xc0) != 0x80) return -1; else return 6; } else return -1; } // CHARACTER MAPPING static unsigned char uchartoicctab[MAXUCHAR]; // convert UTF-32 to internal character code uchar icctouchar[MAXICC+1]; // convert internal character code to UTF-32 of canonical representative char icctoutf8[MAXICC+1][16]; // convert internal character code to UTF-8 string of canonical representative, 0-terminated char iccequivs[MAXICC][MAXEQUIV*8+1]; char iccseq[MAXICC+1]; static unsigned char uchartopair[MAXUCHAR]; static uchar pairtouchar[MAXICC][2]; // The following are largely to help with answer treatments etc. // ICCs are divided into three groups: basically alphabetic (0), numeric (1), symbols (2). These occur in that order // in the alphabet specification. Some answer treatments only look at the alphabetic group, or only // (possibly separately) at alphabetic + numeric. int niccused; // number of ICCs actually used char iccused[MAXICC+1]; // list of ICCs actually used int icctousedindex[MAXICC+1]; // convert ICC to index into iccused[] int iccusedtogroup[MAXICC+1]; // convert iccusedindex to group number int icctogroup[MAXICC+1]; // convert ICC to group number, -1 if not used int iccgroupstart[MAXICCGROUP+1]; // starts of groups within iccused[], plus one after the end int iccgroup=0; // in the "pair" case, icctoutf8 contains two characters into which dictionary characters in iccequivs will be expanded uchar ICCtouchar(char c) { // convert internal character code to UTF-32 or 0 if not represented uchar x; if(c<0||c>MAXICC) return 0; if(c==ICC_DASH) return '-'; x=icctouchar[(int)c]; if(x=='?') return 0; return icctouchar[(int)c]; } char uchartoICC(int c) { // convert UTF-32 to internal character code or 0 if not represented if(c<0||c>=MAXUCHAR) return 0; return uchartoicctab[c]; } // convert bitmap to internal character code // return >0: internal character code // -1: bitmap is zero // -2: more than one bit set int abmtoicc(ABM b) { if(b==0) return -1; if(onebit(b)) return logbase2(b)+1; return -2; } int isdisallowed(uchar uc) { if(uc>=MAXUCHAR) return 1; if(!ISUGRAPH(uc)) return 1; if(uc>0x7f) return 0; // all other disallowed characters are 7-bit if(strchr(".-?,[]^\"@#",uc)) return 1; return 0; } ABM abm_vow,abm_con,abm_use; // add an entry to the current alphabet // characters must be added in ascending order of internal code, so that // iccused[] is set correctly for Caesar ciphers etc. // Returns: // 0: OK (including case of empty rep string or bad icc) // 1: disallowed character in rep string (entire entry ignored) // 2: one or more disallowed character(s) in equiv string (character(s) ignored) int addalphamapentry(int icc,char*rep,char*equiv,int vow,int con,int seq) { uchar uc,s0[3],s1[MAXEQUIV+1]; int f,g,i,j; if(icc<1||icc>=MAXICC) return 0; DEB_AL printf("rep=%s equiv=%s\n",rep,equiv); i=utf8touchars(s0,rep,3); // convert rep to UTF-32, up to 2 characters DEB_AL { printf(" rep -> %d char(s):",i); for(j=0;jul,(*(struct answer**)q)->ul); if(u) return u; u=strcmp( (*(struct answer**)p)->cf,(*(struct answer**)q)->cf); return u; } static void clearcounts(int dn) { int i; line=0; dst_lines[dn]=0; dst_lines_f[dn]=0; dst_lines_fa[dn]=0; for(i=0;inext;free(dstrings[d]);dstrings[d]=p;} } void freedicts(void) { // free all memory allocated by loaddicts, even if it aborted mid-load int i; for(i=0;i=MAXUCHAR) continue; c=uchartoICC(u); if(c) { // characters is in basic alphabet; could check for "reject" chars here if(l2>=MXLE) return 0; // too long? strcpy(s1+l1,icctoutf8[c]); l1+=strlen(s1+l1); s2[l2++]=c; continue; } else { c=uchartopair[t[i]]; if(c) { // represents a pair of characters? c0=uchartoICC(pairtouchar[c][0]); if(c0) { if(l2>=MXLE) return 0; // too long? strcpy(s1+l1,icctoutf8[c0]); l1+=strlen(s1+l1); s2[l2++]=c0; } c0=uchartoICC(pairtouchar[c][1]); if(c0) { if(l2>=MXLE) return 0; // too long? strcpy(s1+l1,icctoutf8[c0]); l1+=strlen(s1+l1); s2[l2++]=c0; } } else { if(dst_u_rejline_count[dn][u]++==0) dst_u_rejline[dn][u]=line; // record first instance of rejected Unicode } } } s1[l1]=0; s2[l2]=0; DEB_DV { printf("adddictword: citation=<%s> canonical UTF-8=<%s> canonical ICC=<",s0,s1); printICCs(s2); printf(">\n Unicode:"); for(i=0;s2[i];i++) printf(" U+%06X",icctouchar[(unsigned int)s2[i]]); printf("\n"); } if(l2<1) { // too short? DEB_DV printf(" too short\n"); return 0; } // here s0 contains citation form in UTF-8 // s1 contains canonicalised form in UTF-8, length l1 // s2 contains canonicalised form in internal character code, length l2 1<=l2<=MXLE dst_lines[dn]++; if(sre) { i=pcre_exec(sre,0,s0,l0,0,0,pcreov,120); DEB_DI if(i<-1) printf("PCRE error %d\n",i); if(i<0) { DEB_DV printf(" failed file filter\n"); return 0; // failed match } } dst_lines_f[dn]++; if(are) { i=pcre_exec(are,0,s1,l1,0,0,pcreov,120); DEB_DI if(i<-1) printf("PCRE error %d\n",i); if(i<0) { DEB_DV printf(" failed answer filter\n"); return 0; // failed match } } dst_lines_fa[dn]++; if(memblkp==NULL||memblkl+2+l0+1+l2+1>MEMBLK) { // allocate more memory if needed (this always happens on first pass round loop) q=(struct memblk*)malloc(sizeof(struct memblk)); if(q==NULL) {return -2;} q->next=NULL; if(memblkp==NULL) dstrings[dn]=q; else memblkp->next=q; // link into list memblkp=q; memblkp->ct=0; memblkl=0; } *(memblkp->s+memblkl++)=(char)floor(f*10.0+128.5); // score with rounding *(memblkp->s+memblkl++)=dn; strcpy(memblkp->s+memblkl,s0);memblkl+=l0+1; // citation form, UTF-8 strcpy(memblkp->s+memblkl,s2);memblkl+=l2+1; // canonical form, internal character code memblkp->ct++; // count words in this memblk return 1; } // read n bytes from fp and interpret as little-endian integer static int getint(FILE*fp,int n) { int i,u; for(i=0,u=0;i=0;j--) { // big-endian... p=hnodep[(m>>j)&1]+n; if(*p==-1) { // node does not exist yet if(nhn>=MXHNODES) return -1; *p=nhn; hnodep[0][nhn]=-1; hnodep[1][nhn]=-1; hnodec[nhn]=-1; nhn++; } n=*p; } hnodec[n]=i; return 0; } // Attempt to load a .TSD file. Return number of words >=0 on success, <0 on error. static int loadtsd(FILE*fp,int format,int dn,pcre*sre,pcre*are) { int c,i,j,l,m,ml,n,u,nw; int hoff[MXLE+1]; // file offsets into Huffman coded block int dcount[MXLE+1]; // number of words of each length char s1[SLEN]; GError*error=NULL; gchar*sp=NULL; DEB_DI printf("attempting to load TSD format=0x%x\n",format); clearcounts(dn); if(format!='0'&&format!='1') return -1; // only TSD0 and TSD1 supported if(fseek(fp,4,SEEK_SET)<0) return -1; ml=getint(fp,2); // maximum length if(ml<1) return -1; DEB_DI printf("ml=%d\n",ml); if(format=='1') getint(fp,12*ml+12); // skip some bytes for(i=0;i0) { DEB_DI { printf("%02x %c ",i,isprint(i)?i:'?'); for(j=l-1;j>=0;j--) printf("%d",(m>>j)&1); printf("\n"); } if(addhcode(m,l,i)<0) return -1; } } nw=0; for(l=1;lMXLE) break; if(hoff[l]==0) continue; if(fseek(fp,hoff[l],SEEK_SET)<0) return -1; DEB_DI printf("starting to read length %d at offset %08x; dstrings[%d]=%p memblkp=%p\n",l,hoff[l],dn,(void*)dstrings[dn],(void*)memblkp); j=8; c=0; for(i=0;i>j)&1); n=hnodep[(c>>j)&1][n]; j++; u=hnodec[n]; if(u!=-1) { DEB_DI printf(" %02x %c\n",u,isprint(u)?u:'?'); if((u>=0x01&&u<0x7f)||(u>=0xa0&&u<=0xff)) { s1[m]=u; if(m=0) {at=i; goto exit;} // successfully read } rewind(fp); if(fgets(bom,5,fp)!=NULL) { // re-read BOM at start of file for(i=0; i0) { if(!(memcmp(bom,fenc[i].bom,fenc[i].lbom))) { mode=i; // BOM found so set mode fseek(fp,fenc[i].lbom,SEEK_SET); // and skip past BOM break; } } } // end of for loop if(mode>1) { // Cannot read this file encoding mode sprintf(t,"Dictionary %d\nCannot read file encoding:\ntry UTF-8 or ISO-8859-1 encoding",dn+1); if(!sil) reperr(t); rc=-1; goto exit; } if(mode==-1) rewind(fp); // No BOM, so read words from start of file } retry: at=0; freedstrings(dn); memblkl=0; // number of bytes stored so far in current memory block memblkp=0; // current memblk being filled dstrings[dn]=0; clearcounts(dn); DEB_DI printf("Reading dictionary file %s (in mode %d), owd=%d\n",dfnames[dn],mode,owd); for(;;) { // Loop through dictionary 'words' until EOF if(owd) strcpy(t,dafilters[dn]); else { if(feof(fp)) break; if(fgets(t,SLEN,fp)==NULL) break; line++; } j=strlen(t)-1; if(j<0) goto skipword; while(j>=0&&t[j]>=0&&t[j]<=' ') t[j--]=0; // Strip control characters/white space from end of string while (j>=0&&((t[j]>='0'&&t[j]<='9')||t[j]=='.'||t[j]=='+'||t[j]=='-')) j--; // get score (if any) from end j++; f=0.0; if(j==0||t[j-1]!=' ') j=strlen(t); // all digits, or no space? treat it as a 'word' else { sscanf(t+j,"%f",&f); if(f>= 10.0) f= 10.0; if(f<=-10.0) f=-10.0; t[j--]=0; // rest of input is treated as a 'word' (which may contain spaces) } while(j>=0&&t[j]>=0&&t[j]<=' ') t[j--]=0; // remove trailing white space j++; if(j<1) goto skipword; // t now contains 'word' for conversion; convert it first to UTF-8 for use as citation form if(mode>-1) { // Use encoding mode based on BOM sp=g_convert(t,-1,"UTF-8",fenc[mode].nenc,NULL,&l0,&error); if(error) { sprintf(t,"Dictionary %d\nFile not encoded in accordance with its BOM",dn+1); if(!sil) reperr(t); rc=-1; goto exit; } } else { // try fallback encodings in turn if(mode==-1) sp=g_convert(t,-1,"UTF-8","UTF-8",NULL,&l0,&error); // effectively a check for valid UTF-8 if(mode==-2) sp=g_convert(t,-1,"UTF-8","ISO-8859-1",NULL,&l0,&error); if(error) { DEB_DI { printf("error: %s\n",error->message); for(i=0;t[i];i++) printf(" %02x",t[i]); printf("\n"); } g_clear_error(&error); freedstrings(dn); rewind(fp); mode--; if(mode>-3) goto retry; // go round again and try next encoding // here if none of the encodings worked sprintf(t,"Dictionary %d\nFile does not use a recognised encoding:\ntry UTF-8 or ISO-8859-1",dn+1); if(!sil) reperr(t); rc=-1; goto exit; } } // here we have UTF-8 citation form of string in sp, length in l0 if(l0>=SLEN) goto skipword; strcpy(s0,sp); g_free(sp),sp=0; i=adddictword(s0,dn,sre,are,f); if(i==-2) {rc=-2; goto exit;} if(i==1) at++; skipword: if(sp) g_free(sp),sp=0; g_clear_error(&error); if(owd) break; } // End of 'word' for loop exit: if(sp) g_free(sp),sp=0; if(sre) pcre_free(sre); if(are) pcre_free(are); g_clear_error(&error); if(!owd) if(fp) fclose(fp); if(rc<0) return rc; else return at; } int loaddicts(int sil) { // load (or reload) dictionaries from dfnames[] // sil=1 suppresses error reporting // returns: 0=success; 1=bad file; 2=no words; 4=out of memory // sets dusedmask to list of dictionaries with anything in them struct answer*ap; struct memblk*p; int at,dn,i,j,k,l,rc,u; char t[SLEN]; unsigned int h; freedicts(); at=0; rc=0; dusedmask=0; for(dn=0;dn0) at+=u,dusedmask|=1<ct;i++) { // loop over all words ans[k].score =pow(10.0,((float)(*(unsigned char*)(p->s+l++))-128.0)/10.0); ans[k].cfdmask= ans[k].dmask =1<<*(unsigned char*)(p->s+l++); ans[k].cf =p->s+l; l+=strlen(p->s+l)+1; ans[k].acf =0; ans[k].ul =p->s+l; l+=strlen(p->s+l)+1; // in internal character code ans[k].banned =0; k++; } p=p->next; } } DEB_DI printf("k=%9d\n",k); assert(k==atotal); for(i=0;iul,ansp[i-1]->ul)) {j++;ap=ansp[j]=ansp[i];} else { ansp[j]->dmask|=ansp[i]->dmask; // union masks ansp[j]->score*=ansp[i]->score; // multiply scores over duplicate entries if(strcmp(ansp[i]->cf,ansp[i-1]->cf)) ap->acf=ansp[i],ap=ansp[i]; // different citation forms? link them together else ap->cfdmask|=ansp[i]->cfdmask; // cf:s the same: union masks } } atotal=j+1; for(i=0;iul[j];j++) h=h*113+ansp[i]->ul[j]; h=h%HTABSZ; ansp[i]->ahlink=ahtab[h]; ahtab[h]=i; } for(i=0;iscore>= 1e10) ansp[i]->score= 1e10; // clamp scores if(ansp[i]->score<=-1e10) ansp[i]->score=-1e10; } for(i=0;iacf==0) continue; ap=ansp[i]; do { // printf(" \"%s\"",ap->cf); ap=ap->acf; } while(ap); // printf("\n"); } DEB_DI printf("Total unique answers by entry: %d\n",atotal); return rc; // return 1 if any file failed to load ew4: freedicts(); if(!sil) reperr("Out of memory loading dictionaries"); return 4; } // Run through some likely candidates for default dictionaries // Return // 0: found something // !=0: nothing found int loaddefdicts() {int i; if(startup_dict1[0]) { // do we have a candidate preferred startup dictionary? strcpy(dfnames[0],startup_dict1); strcpy(dsfilters[0],startup_ff1); strcpy(dafilters[0],startup_af1); loaddicts(1); DEB_DI printf("read preferences default, atotal=%d\n",atotal); if(atotal!=0) return 0; // happy if we found any words at all } for(i=0;iul)) return !!(ansp[p]->dmask&dm); p=ansp[p]->ahlink; } return 0; } qxw-20200708/changelog.gz0000664000175000017500000000063413701320335012700 0ustar momo_changelog_k0|{idl2(=+-Ȏlͷd@Г8Gh8B$S>ͪdWl?0qBk6Ǔ Km`}Lkн-'OA9nBqRiJdySl4NW{IS@"9%G [v JRJ" FgKgEqHjLFd_HqHW{r.JDⲳW(5JB'RP"h!9%N!A<% i\Ee\+vmYG3\rOt:[S?/MǝƫLI^[_iz77qxw-20200708/Makefile0000664000175000017500000001030613701317005012044 0ustar momo## REL+ # Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant # http://www.quinapalus.com # E-mail: qxw@quinapalus.com # # This file is part of Qxw. # # Qxw is free software: you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License # as published by the Free Software Foundation. # # Qxw 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 Qxw. If not, see or # write to the Free Software Foundation, Inc., 51 Franklin Street, # Fifth Floor, Boston, MA 02110-1301, USA. all:: qxw deb:: qxw PKG_CONFIG ?= pkg-config CFLAGS := -Wall -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -Wno-deprecated-declarations `$(PKG_CONFIG) --cflags glib-2.0` `$(PKG_CONFIG) --cflags gtk+-2.0` -I/opt/local/include `dpkg-buildflags --get CFLAGS` `dpkg-buildflags --get CPPFLAGS` -Wpedantic -Wextra -Wno-unused-parameter # CFLAGS := -Wall -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security `$(PKG_CONFIG) --cflags glib-2.0` `$(PKG_CONFIG) --cflags gtk+-2.0` -I/opt/local/include LFLAGS := -Wl,-Bsymbolic-functions -Wl,-z,relro -L/opt/local/lib `$(PKG_CONFIG) --libs glib-2.0` `$(PKG_CONFIG) --libs gtk+-2.0` -lm -ldl -lpcre -pthread -lgthread-2.0 `dpkg-buildflags --get LDFLAGS` # -lrt as well? ifneq ($(filter deb,$(MAKECMDGOALS)),) CFLAGS:= $(CFLAGS) -g else CFLAGS:= $(CFLAGS) -g -O3 endif qxw: qxw.o filler.o treatment.o dicts.o gui.o draw.o alphabets.o deck.o Makefile $(CC) -rdynamic -Wall qxw.o filler.o treatment.o dicts.o gui.o draw.o alphabets.o deck.o $(LFLAGS) -o qxw qxw.o: qxw.c common.h qxw.h filler.h dicts.h treatment.h gui.h draw.h deck.h alphabets.h Makefile $(CC) $(CFLAGS) -c qxw.c -o qxw.o gui.o: gui.c common.h qxw.h filler.h dicts.h treatment.h gui.h draw.h alphabets.h Makefile $(CC) $(CFLAGS) -c gui.c -o gui.o filler.o: filler.c common.h filler.h treatment.h qxw.h gui.h dicts.h Makefile $(CC) $(CFLAGS) -c filler.c -o filler.o treatment.o: treatment.c common.h qxw.h dicts.h treatment.h gui.h Makefile $(CC) $(CFLAGS) -fno-strict-aliasing -c treatment.c -o treatment.o dicts.o: dicts.c common.h qxw.h gui.h dicts.h alphabets.h Makefile $(CC) $(CFLAGS) -fno-strict-aliasing -c dicts.c -o dicts.o draw.o: draw.c common.h qxw.h draw.h gui.h dicts.h Makefile $(CC) $(CFLAGS) -c draw.c -o draw.o deck.o: deck.c common.h qxw.h filler.h alphabets.h dicts.h draw.h treatment.h deck.h Makefile $(CC) $(CFLAGS) -c deck.c -o deck.o alphabets.o: alphabets.c common.h alphabets.h Makefile $(CC) $(CFLAGS) -c alphabets.c -o alphabets.o .PHONY: clean clean: rm -f treatment.o dicts.o draw.o filler.o gui.o qxw.o alphabets.o deck.o qxw .PHONY: install install: mkdir -p $(DESTDIR)/usr/games cp -a qxw $(DESTDIR)/usr/games/qxw mkdir -p $(DESTDIR)/usr/include/qxw cp -a qxwplugin.h $(DESTDIR)/usr/include/qxw/qxwplugin.h mkdir -p $(DESTDIR)/usr/share/applications cp -a qxw.desktop $(DESTDIR)/usr/share/applications/qxw.desktop mkdir -p $(DESTDIR)/usr/share/pixmaps cp -a qxw.xpm $(DESTDIR)/usr/share/pixmaps/qxw.xpm mkdir -p $(DESTDIR)/usr/share/icons/hicolor/48x48/apps cp -a icon-48x48.png $(DESTDIR)/usr/share/icons/hicolor/48x48/apps/qxw.png mkdir -p $(DESTDIR)/usr/share/icons/hicolor/64x64/apps cp -a icon-64x64.png $(DESTDIR)/usr/share/icons/hicolor/64x64/apps/qxw.png mkdir -p $(DESTDIR)/usr/share/icons/hicolor/96x96/apps cp -a icon-96x96.png $(DESTDIR)/usr/share/icons/hicolor/96x96/apps/qxw.png mkdir -p $(DESTDIR)/usr/share/icons/hicolor/128x128/apps cp -a icon-128x128.png $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/qxw.png mkdir -p $(DESTDIR)/usr/share/icons/hicolor/256x256/apps cp -a icon-256x256.png $(DESTDIR)/usr/share/icons/hicolor/256x256/apps/qxw.png # mkdir -p $(DESTDIR)/usr/share/ /usr/share/lintian/overrides # cp -a lintian-binary-overrides $(DESTDIR)/usr/share/lintian/overrides/qxw # mkdir -p $(DESTDIR)/usr/share/menu # cp -a menufile $(DESTDIR)/usr/share/menu/qxw ## REL- qxw-20200708/icon-64x64.png0000664000175000017500000000342113674704262012651 0ustar momoPNG  IHDR@@iqbKGD pHYs B(xtIME 45H OIDATx_HmQJ EQE"VPIK ƺ"Ë$(7ZyP&ť̷o7˜9=<9gf`VfeF2w( #j0EQn?:Tٳ)))|>x( }vJJJcxx8hBffHFFF@6翖Ѡ0Wf{G[[Cvv6Ɂv;---Fl6UUioogժUpI^z͛q\ܹri&^|c޼y#Μ9Cdd$( \|̝;MtyfEQ7 vwws=0L3 ϟ9~8 ۷ѨۘhFEE|!L&9iܹs\rr eee]ݻwcXݻq)4MCUU;!"8qa4MCDtiiif^/Ky@TUtR!"n^/!!!۝ ' OF޽{GMM ϟ?tx0Lʕ+"11ɓ~V.^իWioogdddB vo23rnܸd2~l6S__Oee%\pÁnrݣGd2RZZ*!!!ŋ9N@)((TCCCȵkINN@FTWWO)_ ߺu.ʈ~DDΝ#44Q˧t~%Kػwo@v^6 Ç~ܠlm6}}}8}pnݺl 088ߏvҥO>XYg2ƯK}&]X`?yMPF @UU-[@}}}Pcf+V@\\III466X, < or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ extern int usegui; extern unsigned int fseed; extern int curmux,curdir,curx,cury; extern int curent,curword; extern int unsaved; extern int symmr,symmd,symmm; extern int gtype,ndir[NGTYPE],gshape[NGTYPE]; extern int width,height; extern char gtitle[SLEN]; extern char gauthor[SLEN]; extern char filename[SLEN+50]; extern char filenamebase[SLEN]; extern int havesavefn; extern int uhead,utail,uhwm; extern int st_lc[MXLE+1]; extern int st_lucc[MXLE+1]; extern int st_locc[MXLE+1]; extern int st_lsc[MXLE+1]; extern int st_lmnc[MXLE+1]; extern int st_lmxc[MXLE+1]; extern int st_hist[MAXICC+2]; extern int st_sc; extern int st_ce; extern int st_2u,st_3u; extern int st_tlf,st_vltlf,st_tmtlf; extern struct sprop dsp; extern struct lprop dlp; // functions called by grid filler extern void updategrid(void); extern void mkfeas(void); // interface functions to gsq[][] extern int getflags(int x,int y); extern int getbgcol(int x,int y); extern int getfgcol(int x,int y); extern int getmkcol(int x,int y); extern int getfstyle(int x,int y); extern int getdech(int x,int y); extern int getnumber(int x,int y); extern struct lprop*getvlprop(int d); extern struct lprop*getlprop(int x,int y,int d); extern void getmk(char*s,int x,int y,int c); extern FILE* q_fopen(char* filename, char* mode); extern void a_load(void); extern void a_save(void); extern void a_importvls(char*fn); extern void a_exportvls(char*fn); extern void a_filenew(int flags); extern void saveprefs(void); extern void a_editblock (int k,int x,int y,int d); extern void a_editcutout(int k,int x,int y,int d); extern void a_editempty (int k,int x,int y,int d); extern void a_editmerge (int k,int x,int y,int d); extern void a_editbar (int k,int x,int y,int d); extern int symmrmask(void); extern int symmmmask(void); extern int symmdmask(void); extern int cbits(ABM x); extern int logbase2(ABM x); extern void initcodeword(); extern void undo_push(void); extern void undo_pop(void); extern void abmstodispstr(char*s,ABM*b,int l); extern void abmtostr(char*s,ABM b,int dash); extern void abmstostr(char*s,ABM*b,int l,int dash); extern void pabm(ABM b,int dash); extern void pabms(ABM*b,int l,int dash); extern int strtoabms(ABM*p,int l,char*s,int dash); extern int getlightd(int*lx,int*ly,int x,int y,int d); extern int getlightdat(ABM**lp,int*lx,int*ly,int*ls,int*lo,struct entry**le,int x0,int y0,int d,int mx); extern int getlightbmp(ABM**p,int x,int y,int d,int mx); extern int getlight(int*lx,int*ly,int x,int y,int d); extern int isstartoflight(int x,int y,int d); extern int issellight(int x,int y,int d); extern void sellight(int x,int y,int d,int k); extern int getmaxmux(int x,int y,int d); extern int ismux(int x,int y,int d); extern int isclear(int x,int y); extern int isbar(int x,int y,int d); extern int ismerge(int x,int y,int d); extern int isingrid(int x,int y); extern int sqexists(int i,int j); extern int clearbefore(int x,int y,int d); extern int clearafter(int x,int y,int d); extern int getwordutf8(int x,int y,int d,char*s,int mx); extern int getmergegroupd(int*gx,int*gy,int x,int y,int d); extern int getmergegroup(int*gx,int*gy,int x,int y); extern int getmergedir(int x,int y); extern void getmergerep(int*mx,int*my,int x,int y); extern int isownmergerep(int x,int y); extern void getmergerepd(int*mx,int*my,int x,int y,int d); extern int compute(int mode); extern void symmdo(void f(int,int,int,int),int k,int x,int y,int d); extern int geteicc(int x,int y); extern int seteicc(int x,int y,int d,int c); extern void clrcont(int x,int y); extern void stepback(int*x,int*y,int d); extern void donumbers(void); extern int stepbackifingrid (int*x,int*y,int d); extern void stepforw (int*x,int*y,int d); extern int stepforwmifingrid(int*x,int*y,int d); extern int stepbackmifingrid(int*x,int*y,int d); extern char*titlebyauthor(void); extern int preexport(void); extern void postexport(void); extern void initstructs(void); extern void addimplicitwords(); extern int onebit(ABM x); extern void resetlp(struct lprop*lp); extern void initsquare(int x,int y); qxw-20200708/filler.h0000664000175000017500000000223313674705417012053 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __FILLER_H__ #define __FILLER_H__ // control functions for filler called from main code extern void filler_init(); extern void filler_finit(); extern int filler_start(int mode); extern void filler_wait(); extern void filler_stop(); extern void getposs(struct entry*e,char*s,int r,int dash); extern int filler_status; #endif qxw-20200708/icon-256x256.png0000664000175000017500000001600713674704262013023 0ustar momoPNG  IHDR\rfbKGD pHYs B(xtIME 65zkIDATx{T 첈F1&(5J֪q&06FZX؊ƴF|Ԩ3(DD!U!oXXv/,;sxgvgwޙ """"""""""""""""""""""""""""" h*OPPR;#Pu?|6r U w\YRC*0@CYdž@D S(ÇctlDEEˬԮܼy)))nR|F# Cr_~%n߾pww_T{NNN(++c!bcc t:xg///8;;h4";;Oƅ p #((?V?N5F///xyy[nDUUVZCVA?O+_nt~…HKKæMsNGEdd$.]*?~>f f i|ƍgYQ֬Y3[{o߾ "kb 7[6|p\uDV`Æ ؼy2OOODDDcǎ "k駟",,캿^ǧ~^xrPP"… h4ظq#ƍm0d*&&/nurrG}$j<@6d*::SN5=Ν+z; "ٳgfΜi6lقyIHFۇEx [l~+cđ#Gjv-֯_f N@"8y$~m-SXd /^2,ܩSkܹ[m6,ؿ_~Xti0Ç|k֬G}*!&@SZF$/HHrss͖]˖-kױ0jo߾`Ynn.WMTݽD$..!!!siӦaɍGj^ @񟸸85dee ]Bxd47D!11QjBkpuZʟݻ7x->_V( aSRɟ]Ӷ54vk FcmZ\DOJmmmly,cƌi0h>>>6lXUyyy+t:ӪM ggg0hǏLj#=7`SkZtMN^?+UhNԎ1D vݻw" FvvvVVCDŽ'bX ?~OٳgquI7G9::O>>>08;wQQQnc-8SLo www~0 jK+WOJJ RSSo>"88R;ˀO˗ѷo_|d2!== ,1cƞ';w}>\UU ӧ1*++d̚5un*ѩS't:t:hZh4888ʠYYY0a8q@UXXE?ovw~O=ѵkWt:8::BPd2yyy۷ˉu}?LIQVVyaZƍ?郞={Bш^Ν;z*RSSFL}>?TӦZ_VXl&{N8!L8YIV ׯƃ>N 6ڬ/ڈ#tMޗhbbbwwwcǎBTT?\+ v/uފeooK">>?#GDn.Rc"##cǎnII V\CUjLrr2ϟ/iVM6!<Xݺu]^=vOZEv?h'O޽{[~ŰQϋ*_RR20ڗSN]^ʯI&*+[<11de߾}0@/ >\<HIIa`_} 4zUh?.\ zL :Tҭ@բo߾Wx"߿~ U_~pss~KpvvUҥKw+?UUU@r? GGGQe;r0߭[D?ۧO899r?}||$WFFyMvv_:GGGxxxz`toOK׮]c0[^^JKKEuuu}>ʂhd%aX|*hjeR=( 1dX'''tQ۵kWgwe0[II貎;J} &Mk R`qq1+ : : b $ R[[+WPH 2# 1lll&:t @2>ˆU`Ftd4^%rZo- j4Ni2t B6db|]1 HKbRwԉ`ĎSƖJ%D Yh4۹墟Tw}@*> (..FAAzyy `D@~~>ܹ#MKK}`X.]~'??ߋ/.۽{wyxxETي ܾ}[.iTk@|ZZ$##yyyʪj Q/J@jjl;P^^.l=d?DyEtΘ 2f߾}ѹsgVׯ~ɄoVv7ݿ)))} mȑ޽[vc={W^U ~~~ #((HtٔIӞZ$%%!00ޏ@T"44N„ zR> III3f`РAm>Nmm->~/Z^`#337n[p5ܸqYYYE~~>[5322{r\YR#(++CEE  jjj`0P[[ BZ R coEVzz:z-=z]tg%V$عs'&L z?gΜZAgYϞ=~^'99cǎ4& 1BukL6 UUU< 3AݻwK C!44< 73۶m4u;&@}AAAxdRbوÇ9F"Y4BRRP[[:Jrr2OoggFNV '''ؘh?g #@OO1Sv~~>͛l{ʕ+7|2:@t:Xp!k ^^^Bn鉪*ZM^{Æ HLL4[6n8l޼>>>fGѣG/Eߎ;0zh7R?SN/<< or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __COMMON_H__ #define __COMMON_H__ #include #include #include #include #include #include #include #include #include // OS-SPECIFIC #ifdef _WIN32 #include #include #include #define _USE_MATH_DEFINES #include #define DIR_SEP_STR "\\" #define DIR_SEP_CHAR '\\' #define STRCASECMP _stricmp #else #define DIR_SEP_STR "/" #define DIR_SEP_CHAR '/' #define STRCASECMP strcasecmp #endif #define RELEASE "20200708" // GENERAL #define NGTYPE 13 // number of different grid types #define MAXNDIR 3 // maximum number of directions #define MXSZ 63 // max grid size X and Y #define MXCL 250 // max number of cells in light; must be >=MXSZ*2; allow more for VL:s #define MXCT 31 // max contents in one cell per direction #define MXMUX MXCT // maximum degree of multiplexing #define NMSG 2 // number of messages passed to treatment code #define MXLE 250 // max entries in a light before tags added #define MXFL 255 // max entries in a word that filler can cope with: light plus tags, >=MXLE+NMSG; <256 to allow poscnt[] not to overflow #define MXLT (MAXNDIR*MXSZ*MXSZ+NVL) // max number of lights (conservative estimate) #define NVL (MXSZ*4) // max number of virtual lights #define MAXNMK (MAXNDIR*2) // max number of corner marks #define MXMK 30 // max length of mark string // note that a light (in a Mobius grid with all squares full) can contain up to MXSZ*2*MXCT entries, which is >MXLE; and that // if filler discretion is enabled, the number of treated lights must be <=MXFL, otherwise only limited by MXLT // MXFL<=255 to prevent unsigned char histograms overflowing #define NLEM 5 // number of light entry methods #define NATREAT 12 // number of treatments #define TREAT_PLUGIN 9 #define UNDOS 50 // MISC #define STRSTARTS(s,t) (!strncmp((s),(t),strlen(t))) #define MEMBLK 100000 // unit of memory allocation struct memblk { struct memblk*next; int ct; char s[MEMBLK]; }; #define PI (M_PI) #define ODD(x) ((x)&1) #define EVEN(x) (!((x)&1)) #define FREEX(p) if(p) {free(p);p=0;} #define SLEN 1000 // maximum length for filenames, strings etc.; Windows has MAX_PATH around 260; should be >>MXFL #define LEMDESCLEN 20 // maximum length of entry method description #define MX(a,b) ((a)>(b)?(a):(b)) extern int debug; #define DEB_F0 if(debug&0x00000001) // filler: start and stop #define DEB_F1 if(debug&0x00000002) // filler: basics #define DEB_F2 if(debug&0x00000004) // more detail #define DEB_F3 if(debug&0x00000008) // spreads and jumbles #define DEB_GU if(debug&0x00000010) // general GUI #define DEB_RF if(debug&0x00000020) // refresh, events #define DEB_DI if(debug&0x00000040) // dictionaries #define DEB_DV if(debug&0x00000080) // dictionaries, verbose #define DEB_AL if(debug&0x00000100) // alphabets #define DEB_FL if(debug&0x00000200) // feasible list building #define DEB_TR if(debug&0x00000400) // treatments and plug-ins #define DEB_GR if(debug&0x00000800) // grid operations, save, load #define DEB_BS if(debug&0x00001000) // buildstructs #define DEB_DE if(debug&0x00002000) // decks #define DEB_EX if(debug&0x00004000) // export // bit 31 is used to force printing of version information etc. without other output // ALPHABETS typedef unsigned int uchar; // to hold UTF-32 character; must be unsigned #define MAXUCHAR 0x30000 // maximum Unicode character accepted: first three planes only #define MAXEQUIV 100 // maximum equivalent unicode charaacters mapping to given internal code #define MAXICC 61 // internal character codes from 1..MAXICC-1 are allowed for normal characters; 0 reserved for 0-termination; code MAXICC used for "dash" in treatments (to mean "no treatment") #define ICC_DASH MAXICC // internal character code for dash #define TOUUPPER(c) g_unichar_toupper(c) #define TOULOWER(c) g_unichar_tolower(c) #define ISUUPPER(c) g_unichar_isupper(c) #define ISULOWER(c) g_unichar_islower(c) #define ISUDIGIT(c) g_unichar_isdigit(c) #define ISUALPHA(c) g_unichar_isalpha(c) #define ISUPRINT(c) g_unichar_isprint(c) #define ISUGRAPH(c) g_unichar_isgraph(c) struct alphaentry { char*rep; // representative as UTF-8 char*eqv; // UTF-8 string of equivalents (need not include rep) int vow; // is it a vowel? int con; // is it a consonant? int seq; // forms sequence with next? }; #define ICCTOABM(x) (1ULL<<((x)-1)) typedef unsigned long long int ABM; // alphabet bitmap type #define ABM_NRM ((1ULL<<(MAXICC-1))-1) // normal characters #define ABM_DASH (1ULL<<(ICC_DASH-1)) #define ABM_ALL (ABM_NRM|ABM_DASH) // normal characters plus dash // Terminology: // A `square' is the quantum of area in the grid; one or more squares (a `merge group') form // an `entry', which is a single enclosed white area in the grid where a letter (or group of letters) will appear. // A `word' is a sequence of entries to be filled. // bldstructs() constructs the words and entries from the square data produced // by the editor. struct sprop { // square properties unsigned int bgcol; // background colour unsigned int fgcol; // foreground colour unsigned int mkcol; // mark colour unsigned char ten; // treatment enable: flag to plug-in unsigned char spor; // global square property override (not used in dsp) unsigned char fstyle; // font style: b0=bold, b1=italic unsigned char dech; // dechecked: 0=normal, 1=contributions stacked atop one another, 2=contributions side-by-side char mk[MAXNMK][MXMK+1]; // square corner mark strings in each direction }; // entry methods #define EM_FWD 1 #define EM_REV 2 #define EM_CYC 4 #define EM_RCY 8 #define EM_JUM 16 #define EM_ALL 31 #define EM_SPR 32 // for internal use only struct lprop { // light properties unsigned int dmask; // mask of allowed dictionaries; special values 1<abKGD pHYs B(xtIME 6#kޜ IDATxLu=q?" 0r(ʨe6 Ǭ&͙%l `AY3R'X wW q&=k{<}?ߟ AAA7}o0ʮY )Ob,0Je1+:\>7^&}qkh9& ǎfCDD֭[RāH.B&Aӡ6 (--fp ɨt\X H áBl𚆲@AfApi"AV+JR2*tuu`0௿͛7???_˗/qhoo͛7q%\|z2 QQQjxG8xh^~e6::&,--1ܝEd;y$#fNc^^^ [fͤ϶2V;.wrr2CkPTBll,***T*<}N`0ٳPʕ+T*C[[^u\v o"##Vdeeˈ\.G__***t\@XX"Ґ+V~_td2ǎÑחJE㡇JmcbbOZZZO@O8;1'ٳgqqq'x_|,x{{<ׯaTkHg``?8.^#))iw*͆al6pgndahhfپFOp FYYYhjj¢Ep!a``@,P(-_rEEE[}6:p9رc~'4 _V(HII˿r>>>: $%%ahhhV+3@LL *** ”}0*5jQSSc_ \ ۛ vP(P(3~<t8w~ttt6 ~~~Gbb"VZ4FFFсGzk׮Eaa!jEƌmݺy{{Ok3ѕɾ+6<<t:e&Y,fX03׳G}t&!66 h3a[lhhhF0R)_rr2Z$":R*l߾}o{{;[t(^ئM80(..d<رEEEwtt4jkktq1TWWɓn TWWA~ǟ?Pd2ׇrܹs00JR'|Rw᧟~"UUUcb:.#d2lٲE522)YIN0ꫯ:<~XҁBMM6sZVg}i;7n/c}6 QjG-KnZ$rELOMMuZQQQ} .\MKK(ӣ[I]鑑vFg/_bz{{EaN1022Bp%Sj&rxH,X .ɂbn5ўI.@w&24qv߃ cShQ@pcWvzU% yjW#j;;;TܸqCfsZIIIL8+WVXAFH~uNKAA5j/iiJgee\\.VWVVbxx)i?~\Ɍs}s~W^߿ihii?# ͕tqsN :4C{\/rrrk= AٳGf2PPP4N8!gggO < 4(?wekװsN_`` ^z%f޽[4+wxqUѽ|dggÓ3[FGGٮ]$rVPP,ˌ#3aV2Z=.x688駟BTUU,tzzz}vl߾HMMExx8xhDkk+~IV^oJv%K/0^l۶ml6;pqkFR!//}JJJ = ^222-[Gmm99gQ]v!..#y&> QXXA\~qC[[jjjƽۋ"8q~~~ϗ>Ǟz)>@~~>swPRR5kֈ}'ؽ{7,G}+xؿ?V\)`߾}$w'!!咾|MܝTUU!""BR{Q:l޼q&_j$7bS=:0!A H $@A H wTqVb or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "alphabets.h" const char*alphaname[NALPHAINIT][NALPHACODES+1]={ {"Roman A-Z", "Roman","AZ",""}, {"Digits only 0-9", "Digits","09",""}, {"Roman plus digits A-Z 0-9", "RomanDigits","AZ09",""}, {"Czech", "Czech","CZ",""}, {"Danish and Norwegian", "Danish","Norwegian","DA","NO",""}, // {"Devanagari", "Devanagari","DV",""}, {"Dutch", "Dutch","NL",""}, {"Estonian", "Estonian","EE",""}, {"Finnish", "Finnish","FI",""}, {"French and Italian", "French","Italian","FR","IT",""}, {"German", "German","DE",""}, {"Ancient Greek (polytonic)", "AncientGreek","AG",""}, {"Modern Greek (monotonic)", "ModernGreek","MG","EL",""}, {"Hungarian", "Hungarian","HU",""}, {"Polish", "Polish","PL",""}, {"Romanian", "Romanian","RO",""}, {"Russian", "Russian","RU",""}, {"Slovenian", "Slovenian","SI",""}, {"Spanish", "Spanish","SP","ES",""}, {"Swedish", "Swedish","SE",""}, {"Empty", "Empty","Null",""}, }; // {"Japanese (katakana)", "Katakana","JPK",""}, // {"Japanese (hiragana)", "Hiragana","JPH",""}, struct alphaentry alphainitdata[NALPHAINIT][MAXICC]={ { // Roman A-Z { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,0,1,1}, {"Z","z" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Digits only 0-9 { 0 ,"" ,0,0,0}, // 0 always unused {"0","" ,0,0,1}, {"1","" ,0,0,1}, {"2","" ,0,0,1}, {"3","" ,0,0,1}, {"4","" ,0,0,1}, {"5","" ,0,0,1}, {"6","" ,0,0,1}, {"7","" ,0,0,1}, {"8","" ,0,0,1}, {"9","" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Roman plus digits A-Z 0-9 { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,0,1,1}, {"Z","z" ,0,1,0}, {"0","" ,0,0,1}, {"1","" ,0,0,1}, {"2","" ,0,0,1}, {"3","" ,0,0,1}, {"4","" ,0,0,1}, {"5","" ,0,0,1}, {"6","" ,0,0,1}, {"7","" ,0,0,1}, {"8","" ,0,0,1}, {"9","" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Czech { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀàâÂåÅäÄãÃ" ,1,0,0}, {"Á","á" ,1,0,0}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"Č","č" ,0,1,1}, {"D","d" ,0,1,1}, {"Ď","ď" ,0,1,0}, {"E","eæÆœŒèÈêÊëË" ,1,0,0}, {"É","é" ,1,0,0}, {"Ě","ě" ,1,0,0}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"$","" ,0,1,0}, {"I","iìÌîÎïÏ" ,1,0,0}, {"Í","í" ,1,0,0}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"Ň","ň" ,0,1,0}, {"O","oòÒôÔöÖõÕøØ" ,1,0,0}, {"Ó","ó" ,1,0,0}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"Ř","ř" ,0,1,1}, {"S","s" ,0,1,1}, {"Š","š" ,0,1,1}, {"T","t" ,0,1,1}, {"Ť","ť" ,0,1,0}, {"U","uùÙûÛüÜ" ,1,0,0}, {"Ú","ú" ,1,0,0}, {"Ů","ů" ,1,0,0}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,0}, {"Y","yÿ" ,1,0,0}, {"Ý","ý" ,1,0,0}, {"Z","z" ,0,1,1}, {"Ž","ž" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Danish and Norwegian { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿüÜ" ,1,0,1}, {"Z","z" ,0,1,1}, {"Æ","æ" ,1,0,1}, {"Ø","ø" ,1,0,1}, {"Å","å" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // // Devanagari (testing) // // { 0 ,"" ,0,0,0}, // 0 always unused // {"ऄ","",1,0,1}, // {"अ","",1,0,1}, // {"आ","",1,0,1}, // {"इ","",1,0,1}, // {"ई","",1,0,1}, // {"उ","",1,0,1}, // {"ऊ","",1,0,0}, // {"ऋ","",1,0,0}, // {"ऌ","",1,0,0}, // {"ऎ","",1,0,1}, // {"ए","ऍ",1,0,1}, // {"ऐ","",1,0,1}, // {"ऒ","",1,0,1}, // {"ओ","ऑ",1,0,1}, // {"औ","",1,0,0}, // {"क","क़",0,1,1}, // {"ख","ख़",0,1,1}, // {"ग","ग़",0,1,1}, // {"घ","",0,1,1}, // {"ङ","",0,1,0}, // {"च","",0,1,1}, // {"छ","",0,1,1}, // {"ज","ज़",0,1,1}, // {"झ","",0,1,1}, // {"ञ","",0,1,0}, // {"ट","",0,1,1}, // {"ठ","",0,1,1}, // {"ड","",0,1,1}, // {"ड़","",0,1,0}, // {"ढ","",0,1,0}, // {"ढ़","",0,1,0}, // {"ण","",0,1,0}, // {"त","",0,1,1}, // {"थ","",0,1,1}, // {"द","",0,1,1}, // {"ध","",0,1,1}, // {"न","",0,1,0}, // {"ऩ","",0,1,0}, // {"प","",0,1,1}, // {"फ","फ़",0,1,1}, // {"ब","",0,1,1}, // {"भ","",0,1,1}, // {"म","",0,1,0}, // {"य","य़",0,1,1}, // {"र","",0,1,1}, // {"ऱ","",0,1,1}, // {"ल","",0,1,0}, // {"ळ","",0,1,0}, // {"ऴ","",0,1,0}, // {"व","",0,1,1}, // {"श","",0,1,0}, // {"ष","",0,1,1}, // {"स","",0,1,1}, // {"ह","",0,1,1}, // {"ॐ","",0,1,0}, // {"ॠ","",1,0,0}, // {"ॡ","",1,0,0}, // { 0 ,"",0,0,0}, // { 0 ,"",0,0,0}, // { 0 ,"",0,0,0}, // // },{ // Dutch { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝ" ,0,1,1}, {"Z","z" ,0,1,0}, {"IJ","ijÿ" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Estonian { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"Š","š" ,0,1,1}, {"Z","z" ,0,1,1}, {"Ž","ž" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"Õ","õ" ,1,0,1}, {"Ä","ä" ,1,0,1}, {"Ö","öøØ" ,1,0,1}, {"Ü","ü" ,1,0,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Finnish { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿüÜ" ,1,1,1}, {"Z","z" ,0,1,1}, {"Å","å" ,1,0,1}, {"Ä","ä" ,1,0,1}, {"Ö","öøØõÕ" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // French { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,1,0,1}, {"Z","z" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // German { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝ" ,0,1,1}, {"Z","z" ,0,1,0}, {"AE","Ää" ,0,0,0}, {"OE","Öö" ,0,0,0}, {"UE","Üü" ,0,0,0}, {"SS","ẞß" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Ancient Greek { 0 ,"" ,0,0,0}, // 0 always unused {"Α","αάΆἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏὰάᾰᾱᾶᾸᾹᾺΆ" ,1,0,1}, {"Β","βϐ" ,0,1,1}, {"Γ","γ" ,0,1,1}, {"Δ","δ" ,0,1,1}, {"Ε","εέΈἐἑἒἓἔἕἘἙἚἛἜἝὲέῈΈϵ" ,1,0,1}, {"Ζ","ζ" ,0,1,1}, {"Η","ηήΉἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯὴήῆῊΉ" ,1,0,1}, {"Θ","θϑϴ" ,0,1,1}, {"Ι","ιίϊΐΊΪἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὶίῐῑῒΐῖῗῘῙῚΊ" ,1,0,1}, {"Κ","κϰ" ,0,1,1}, {"Λ","λ" ,0,1,1}, {"Μ","μ" ,0,1,1}, {"Ν","ν" ,0,1,1}, {"Ξ","ξ" ,0,1,1}, {"Ο","οόΌὀὁὂὃὄὅὈὉὊὋὌὍὸόῸΌ" ,1,0,1}, {"Π","πϖ" ,0,1,1}, {"Ρ","ρῤῥῬϱϼ" ,0,1,1}, {"Σ","σςϲϹ" ,0,1,1}, {"Τ","τ" ,0,1,1}, {"Υ","υύϋΰΎΫὐὑὒὓὔὕὖὗὙὛὝὟὺύῠῡῢΰῦῧῨῩῪΎϒϓϔ" ,1,0,1}, {"Φ","φϕ" ,0,1,1}, {"Χ","χ" ,0,1,1}, {"Ψ","ψ" ,0,1,1}, {"Ω","ωώΏὠὡὢὣὤὥὦὧὼώὨὩὪὫὬὭὮὯῶῺΏ" ,1,0,0}, {"Ϙ","Ϙϙ" ,0,1,0}, {"Ϛ","Ϛϛ" ,0,1,0}, {"Ϝ","Ϝϝ" ,0,1,0}, {"Ϟ","Ϟϟ" ,0,1,0}, {"Ϡ","Ϡϡ" ,0,1,0}, {"Ͱ","Ͱͱ" ,0,1,0}, {"Ͳ","Ͳͳ" ,0,1,0}, {"Ͷ","Ͷͷ" ,0,1,0}, {"Ϻ","Ϻϻ" ,0,1,0}, {"ΑΙ","ᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾲᾳᾴᾷᾼ" ,0,0,0}, {"ΗΙ","ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟῂῃῄῇῌ" ,0,0,0}, {"ΩΙ","ᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯῲῳῴῷῼ" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Modern Greek { 0 ,"" ,0,0,0}, // 0 always unused {"Α","αάΆ" ,1,0,1}, {"Β","β" ,0,1,1}, {"Γ","γ" ,0,1,1}, {"Δ","δ" ,0,1,1}, {"Ε","εέΈ" ,1,0,1}, {"Ζ","ζ" ,0,1,1}, {"Η","ηήΉ" ,1,0,1}, {"Θ","θ" ,0,1,1}, {"Ι","ιίϊΐΊΪ" ,1,0,1}, {"Κ","κ" ,0,1,1}, {"Λ","λ" ,0,1,1}, {"Μ","μ" ,0,1,1}, {"Ν","ν" ,0,1,1}, {"Ξ","ξ" ,0,1,1}, {"Ο","οόΌ" ,1,0,1}, {"Π","π" ,0,1,1}, {"Ρ","ρ" ,0,1,1}, {"Σ","σς" ,0,1,1}, {"Τ","τ" ,0,1,1}, {"Υ","υύϋΰΎΫ" ,1,0,1}, {"Φ","φ" ,0,1,1}, {"Χ","χ" ,0,1,1}, {"Ψ","ψ" ,0,1,1}, {"Ω","ωώΏ" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Hungarian { 0 ,"" ,0,0,0}, // 0 always unused {"A","aàÀâÂåÅäÄãÃ" ,1,0,0}, {"Á","á" ,1,0,0}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,0}, {"E","eæÆœŒèÈêÊëË" ,1,0,0}, {"É","é" ,1,0,0}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,0}, {"O","oóÓòÒôÔõÕøØ" ,1,0,0}, {"Ö","öőŐ" ,1,0,0}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,0}, {"U","uúÚùÙûÛ" ,1,0,0}, {"Ü","üűŰ" ,1,0,0}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,0,1,1}, {"Z","z" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // // Japanese (katakana) // // { 0 ,"" ,0,0,0}, // {"ア","ァァア" ,1,0,0}, // {"イ","ィィイ" ,1,0,0}, // {"ウ","ゥゥウヴ" ,1,0,0}, // {"エ","ェェエ" ,1,0,0}, // {"オ","ォォオ" ,1,0,0}, // {"カ","ヵカガ" ,0,1,0}, // {"キ","キギ" ,0,1,0}, // {"ク","ㇰクグ" ,0,1,0}, // {"ケ","ヶケゲ" ,0,1,0}, // {"コ","コゴ" ,0,1,0}, // {"サ","サザ" ,0,1,0}, // {"シ","ㇱシジ" ,0,1,0}, // {"ス","ㇲスズ" ,0,1,0}, // {"セ","セゼ" ,0,1,0}, // {"ソ","ソゾ" ,0,1,0}, // {"タ","タダ" ,0,1,0}, // {"チ","チヂ" ,0,1,0}, // {"ツ","ッッツヅ" ,0,1,0}, // {"テ","テデ" ,0,1,0}, // {"ト","ㇳトド" ,0,1,0}, // {"ナ","ナ" ,0,1,0}, // {"ニ","ニ" ,0,1,0}, // {"ヌ","ㇴヌ" ,0,1,0}, // {"ネ","ネ" ,0,1,0}, // {"ノ","ノ" ,0,1,0}, // {"ハ","ㇵハバパ" ,0,1,0}, // {"ヒ","ㇶヒビピ" ,0,1,0}, // {"フ","ㇷフブプ" ,0,1,0}, // {"ヘ","ㇸヘベペ" ,0,1,0}, // {"ホ","ㇹホボポ" ,0,1,0}, // {"マ","マ" ,0,1,0}, // {"ミ","ミ" ,0,1,0}, // {"ム","ㇺム" ,0,1,0}, // {"メ","メ" ,0,1,0}, // {"モ","モ" ,0,1,0}, // {"ヤ","ャャヤ" ,0,1,0}, // {"ユ","ュュユ" ,0,1,0}, // {"ヨ","ョョヨ" ,0,1,0}, // {"ラ","ㇻラ" ,0,1,0}, // {"リ","ㇼリ" ,0,1,0}, // {"ル","ㇽル" ,0,1,0}, // {"レ","ㇾレ" ,0,1,0}, // {"ロ","ㇿロ" ,0,1,0}, // {"ワ","ヮワヷ" ,0,1,0}, // {"ヰ","ヸ" ,0,1,0}, // {"ヱ","ヹ" ,0,1,0}, // {"ヲ","ヲヺ" ,0,1,0}, // {"ン","ン" ,0,1,0}, // {"ー","ー" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // // },{ // // // Japanese (hiragana) // // { 0 ,"" ,0,0,0}, // {"あ","ぁ" ,1,0,0}, // {"い","ぃ" ,1,0,0}, // {"う","ぅゔ" ,1,0,0}, // {"え","ぇ" ,1,0,0}, // {"お","ぉ" ,1,0,0}, // {"か","ゕが" ,0,1,0}, // {"き","ぎ" ,0,1,0}, // {"く","ぐ" ,0,1,0}, // {"け","ゖげ" ,0,1,0}, // {"こ","ご" ,0,1,0}, // {"さ","ざ" ,0,1,0}, // {"し","じ" ,0,1,0}, // {"す","ず" ,0,1,0}, // {"せ","ぜ" ,0,1,0}, // {"そ","ぞ" ,0,1,0}, // {"た","だ" ,0,1,0}, // {"ち","ぢ" ,0,1,0}, // {"つ","っづ" ,0,1,0}, // {"て","で" ,0,1,0}, // {"と","ど" ,0,1,0}, // {"な","" ,0,1,0}, // {"に","" ,0,1,0}, // {"ぬ","" ,0,1,0}, // {"ね","" ,0,1,0}, // {"の","" ,0,1,0}, // {"は","ばぱ" ,0,1,0}, // {"ひ","びぴ" ,0,1,0}, // {"ふ","ぶぷ" ,0,1,0}, // {"へ","べぺ" ,0,1,0}, // {"ほ","ぼぽ" ,0,1,0}, // {"ま","" ,0,1,0}, // {"み","" ,0,1,0}, // {"む","" ,0,1,0}, // {"め","" ,0,1,0}, // {"も","" ,0,1,0}, // {"や","ゃ" ,0,1,0}, // {"ゆ","ゅ" ,0,1,0}, // {"よ","ょ" ,0,1,0}, // {"ら","" ,0,1,0}, // {"り","" ,0,1,0}, // {"る","" ,0,1,0}, // {"れ","" ,0,1,0}, // {"ろ","" ,0,1,0}, // {"わ","ゎ" ,0,1,0}, // {"ゐ","" ,0,1,0}, // {"ゑ","" ,0,1,0}, // {"を","" ,0,1,0}, // {"ん","" ,0,1,0}, // {"ー","ー" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // { 0 ,"" ,0,0,0}, // // },{ // Polish { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"Ą","ą" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"Ć","ć" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"Ę","ę" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"Ł","ł" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"Ń","ń" ,0,1,1}, {"O","oòÒôÔöÖõÕøØ" ,1,0,1}, {"Ó","ó" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"Ś","ś" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,1,0,1}, {"Z","z" ,0,1,1}, {"Ź","ź" ,0,1,1}, {"Ż","ż" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Romanian { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃĂă",1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","sȘŞșş" ,0,1,1}, {"T","tȚŢțţ" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,0,1,1}, {"Z","z" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Russian { 0 ,"" ,0,0,0}, // 0 always unused {"А","а" ,1,0,1}, {"Б","б" ,0,1,1}, {"В","в" ,0,1,1}, {"Г","г" ,0,1,1}, {"Д","д" ,0,1,1}, {"Е","еЁё" ,1,0,1}, {"Ж","ж" ,0,1,1}, {"З","з" ,0,1,1}, {"И","и" ,1,0,1}, {"Й","й" ,1,0,1}, {"К","к" ,0,1,1}, {"Л","л" ,0,1,1}, {"М","м" ,0,1,1}, {"Н","н" ,0,1,1}, {"О","о" ,1,0,1}, {"П","п" ,0,1,1}, {"Р","р" ,0,1,1}, {"С","с" ,0,1,1}, {"Т","т" ,0,1,1}, {"У","у" ,1,0,1}, {"Ф","ф" ,0,1,1}, {"Х","х" ,0,1,1}, {"Ц","ц" ,0,1,1}, {"Ч","ч" ,0,1,1}, {"Ш","ш" ,0,1,1}, {"Щ","щ" ,0,1,1}, {"Ъ","ъ" ,0,1,1}, {"Ы","ы" ,1,0,1}, {"Ь","ь" ,0,1,1}, {"Э","э" ,1,0,1}, {"Ю","ю" ,1,0,1}, {"Я","я" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Slovenian { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"Č","č" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊ" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"Š","š" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿ" ,0,1,1}, {"Z","z" ,0,1,1}, {"Ž","ž" ,0,1,0}, {"Ä","ä" ,1,0,0}, {"Ć","ć" ,0,1,0}, {"Đ","đ" ,0,1,0}, {"Ë","ë" ,1,0,0}, {"Ö","ö" ,1,0,0}, {"Ü","ü" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Spanish { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂåÅäÄãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","n" ,0,1,1}, {"Ñ","ñ" ,0,1,1}, {"O","oóÓòÒôÔöÖõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛüÜ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝ" ,0,1,1}, {"Z","z" ,0,1,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Swedish { 0 ,"" ,0,0,0}, // 0 always unused {"A","aÀáÁàâÂãÃ" ,1,0,1}, {"B","b" ,0,1,1}, {"C","cçÇ" ,0,1,1}, {"D","d" ,0,1,1}, {"E","eæÆœŒéÉèÈêÊëË" ,1,0,1}, {"F","f" ,0,1,1}, {"G","g" ,0,1,1}, {"H","h" ,0,1,1}, {"I","iíÍìÌîÎïÏ" ,1,0,1}, {"J","j" ,0,1,1}, {"K","k" ,0,1,1}, {"L","l" ,0,1,1}, {"M","m" ,0,1,1}, {"N","nñÑ" ,0,1,1}, {"O","oóÓòÒôÔõÕøØ" ,1,0,1}, {"P","p" ,0,1,1}, {"Q","q" ,0,1,1}, {"R","r" ,0,1,1}, {"S","s" ,0,1,1}, {"T","t" ,0,1,1}, {"U","uúÚùÙûÛ" ,1,0,1}, {"V","v" ,0,1,1}, {"W","w" ,0,1,1}, {"X","x" ,0,1,1}, {"Y","yýÝÿüÜ" ,1,0,1}, {"Z","z" ,0,1,1}, {"Å","å" ,1,0,1}, {"Ä","ä" ,1,0,1}, {"Ö","ö" ,1,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, },{ // Empty { 0 ,"" ,0,0,0}, // 0 always unused { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, { 0 ,"" ,0,0,0}, }}; qxw-20200708/treatment.c0000664000175000017500000005442613674705417012607 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "common.h" #include "qxw.h" #include "dicts.h" #include "treatment.h" #include "gui.h" #ifdef _WIN32 // using wrapper for Windows dynamic linking functions #include "pfdlfcn.h" #else #include #endif #define HTABSZ 4194304 // INITIAL FEASIBLE LIST GENERATION static int curans,curem,curten,curdm; int treatmode=0,treatorder[NMSG]={0,0}; char tpifname[SLEN]=""; ABM treatcstr[NMSG][MXFL]={{0},{0}}; int tambaw=0; char treatmsg [NMSG][MXLT*8+1]; // unfiltered, as provided by GUI, utf-8 uchar treatmsgU [NMSG][MXLT+1]; // converted to uchars char treatmsgICC [NMSG][MXLT+1]; // converted to ICCs char treatmsgICCAZ [NMSG][MXLT+1]; // alphabetic only char treatmsgICCAZ09[NMSG][MXLT+1]; // alphabetic+digits uchar treatmsgUAZ [NMSG][MXLT+1]; // converted to uchars uchar treatmsgUAZ09 [NMSG][MXLT+1]; // converted to uchars char treatmsgAZ [NMSG][MXLT+1]; // 7-bit clean *no transliteration* char treatmsgAZ09 [NMSG][MXLT+1]; char *treatmessage [NMSG]={"",""}; // pointer copies of above uchar*treatmessageU [NMSG]; char *treatmessageICC [NMSG]; char *treatmessageICCAZ [NMSG]; char *treatmessageICCAZ09[NMSG]; uchar*treatmessageUAZ [NMSG]; uchar*treatmessageUAZ09 [NMSG]; char *treatmessageAZ [NMSG]; char *treatmessageAZ09 [NMSG]; char msgchar[NMSG]; uchar msgcharU[NMSG]; // converted to uchar uchar msgcharUAZ[NMSG]; // converted to uchar, alphabetic, made upper case uchar msgcharUAZ09[NMSG]; // ... plus digits char msgcharICC[NMSG]; // converted to ICC char msgcharICCAZ[NMSG]; char msgcharICCAZ09[NMSG]; char msgcharAZ[NMSG]; // 7-bit clean *no transliteration* char msgcharAZ09[NMSG]; const char*answerICC; const uchar*answerU; int clueorderindex; int gridorderindex[MXLE]; int checking[MXLE]; int lightlength; int lightx; int lighty; int lightdir; // STATICS FOR VARIOUS TREATMENTS // Playfair square static char psq[25]; // square position to ICC, 0 if cell not filled static int psc[MAXICC]; // ICC to square position, -1 if not present static int*tfl=0; // temporary feasible list static int ctfl,ntfl; static int clts; static int hstab[HTABSZ]; static int haestab[HTABSZ]; static struct memblk*lstrings=0; static struct memblk*lmp=0; static int lml=MEMBLK; static void dohistdata(struct light*l) { int i,j,m,n; memset(l->hist,0,sizeof(l->hist)); l->lbm=0; m=0; n=strlen(l->s); if(l->tagged) n-=NMSG; for(i=0;is[i]; l->hist[j]++; if(l->hist[j]>m) m=l->hist[j]; l->lbm|=ICCTOABM(j); } } // return index of light, creating if it doesn't exist; -1 on no memory static int findlight(const char*s,int tagged,int a,int e) { unsigned int h0,h1; int f,i,u,l0; int l; int len0,len1; struct light*p; struct memblk*q; len0=strlen(s); if(tagged) len0-=NMSG; assert(len0>0); h0=0; for(i=0;i=clts) { // out of space to store light structures? (always happens first time) clts=clts*2+5000; // try again a bit bigger p=realloc(lts,clts*sizeof(struct light)); if(!p) return -1; lts=p; DEB_FL printf("lts realloc: %d\n",clts); } l=hstab[h0]; u=-1; // look for the light string, independent of how it arose f=0; while(l!=-1) { len1=strlen(lts[l].s); if(lts[l].tagged) len1-=NMSG; assert(len1>0); if(len0==len1&&!strncmp(s,lts[l].s,len0)) { // match as far as non-tag part is concerned u=lts[l].uniq; if(!strcmp(s,lts[l].s)) {f=1; break;} // exact match including possible tags } l=lts[l].hashslink; } if(f==0) { // we do not have a full-string match l0=strlen(s)+1; if(lml+l0>MEMBLK) { // make space to store copy of light string DEB_FL printf("memblk alloc\n"); q=(struct memblk*)malloc(sizeof(struct memblk)); if(!q) return -1; q->next=NULL; if(lmp==NULL) lstrings=q; else lmp->next=q; // link into list lmp=q; lml=0; } if(u==-1) u=ultotal++; // allocate new uniquifying number if needed lts[ltotal].s=lmp->s+lml; strcpy(lmp->s+lml,s);lml+=l0; } else { lts[ltotal].s=lts[l].s; } lts[ltotal].ans=a; lts[ltotal].em=e; lts[ltotal].uniq=u; lts[ltotal].tagged=tagged; lts[ltotal].hashslink =hstab [h0]; hstab [h0]=ltotal; // insert into hash tables lts[ltotal].hashaeslink=haestab[h1]; haestab[h1]=ltotal; dohistdata(lts+ltotal); return ltotal++; } // is word in dictionaries specified by curdm? int iswordICC(const char*s) { return iswordindm(s,curdm); } // as above, but s converted from uchars int iswordU(const uchar*s) { int i,j,u; char s0[MXFL+1]; for(i=0,j=0;s[i]&&jMAXICC) return -1; return icctogroup[(int)c]; } // add light to feasible list: s=text of light (in internal character code), a=answer from which treated (-ve for msgword), e=entry method // returns 0 if OK, !=0 on (out of memory) error static int addlight(const char*s,int a,int e) { int l; int*p; char t[MXFL+1]; // curten should never be set when adding msgword[]:s (got from msglprop); as MXLE+NMSG<=MXFL this never overflows l=strlen(s); if(l<1) return 0; // is this test needed? memcpy(t,s,l); if(curten) memcpy(t+l,msgcharICC,NMSG),l+=NMSG; // append tag characters if any t[l]=0; l=findlight(t,curten,a,e); if(l<0) return l; if(ntfl>=ctfl) { ctfl=ctfl*3/2+500; p=realloc(tfl,ctfl*sizeof(int)); if(!p) return -1; tfl=p; DEB_FL printf("tfl realloc: %d\n",ctfl); } tfl[ntfl++]=l; return 0; } // Add treated answer (in internal character code) to feasible light list if suitable // returns !=0 for error int treatedanswerICC(const char*s) { char s0[MXFL+1]; int j,k,l,u; l=strlen(s); // DEB_FL printf("treatedanswerICC l=%d\n",l); if(l!=lightlength) return 0; DEB_FL assert(l>0); if(tambaw&&!iswordICC(s)) return 0; if(curem&EM_JUM) { // jumbled entry method return addlight(s,curans,4); // just store normal entry } if(curem&EM_FWD) { // forwards entry method u=addlight(s,curans,0);if(u) return u; } if(curem&EM_REV) { for(j=0;j1||g1<0||g1>1) return c0; // don't encode symbols u=iccgroupstart[g0]; n=iccgroupstart[g0+1]-u; // size of group g0 assert(n>0); return u+(c0-u+c1-iccgroupstart[g1])%n; } // returns !=0 on error // s points to answer to be treated in internal character code static int treatans(const char*s) { int c0,c1,c2,d0,d1,g,i,j,l,l0,l1,o,u; char ansutf8[MXFL*8],*p; uchar ansU[MXFL+1]; char t[MXLE+2]; // enough for "insert single character" l=strlen(s); // printf("treatans("); printICCs(s); printf(")");fflush(stdout); for(i=0;s[i];i++) if(s[i]>=MAXICC) return 0; switch(treatmode) { case 0: // no treatment return treatedanswerICC(s); case 1: // Playfair if(l!=lightlength) return 0; strcpy(t,s); for(i=0;i1) continue; // only affect letters and digits j=c0-iccgroupstart[g]; if(j>=l0) continue; t[i]=treatmsgICC[0][j]; } return treatedanswerICC(t); case 3: // fixed Caesar/Vigenère if(l!=lightlength) return 0; l0=strlen(treatmsgICC[0]); if(l0==0) return treatedanswerICC(s); // no keyword, so leave as plaintext if(niccused<1) return treatedanswerICC(s); // prevent divide-by-0 strcpy(t,s); for(i=0;s[i];i++) { c0=icctousedindex[(int)s[i]]; c1=icctousedindex[(int)treatmsgICC[0][i%l0]]; if(c0>=0&&c1>=0) t[i]=iccused[offsetenc(c0,c1)]; } return treatedanswerICC(t); case 4: // variable Caesar if(l!=lightlength) return 0; if(niccused<1) return treatedanswerICC(s); // prevent divide-by-0 if(treatorder[0]==0) { // for backwards compatibility l0=strlen(treatmsgICC[0]); if(l0==0) return treatedanswerICC(s); // no keyword, so leave as plaintext o=treatmsgICC[0][clueorderindex%l0]; } else { o=msgcharICC[0]; if(o==ICC_DASH) return treatedanswerICC(s); // leave as plaintext } c1=icctousedindex[o]; if(c1<0) return treatedanswerICC(s); strcpy(t,s); for(i=0;s[i];i++) { c0=icctousedindex[(int)s[i]]; if(c0>=0) t[i]=iccused[offsetenc(c0,c1)]; } return treatedanswerICC(t); case 10: // misprint, correct letters specified if(l!=lightlength) return 0; c0=msgcharICC[0]; if(c0==ICC_DASH) return treatedanswerICC(s); // unmisprinted c1=0; goto misp0; case 11: // misprint, misprinted letters specified if(l!=lightlength) return 0; c1=msgcharICC[0]; if(c1==ICC_DASH) return treatedanswerICC(s); // unmisprinted c0=0; goto misp0; case 5: // misprint if(l!=lightlength) return 0; l0=ucharslen(treatmsgU[0]); l1=ucharslen(treatmsgU[1]); c0=0; if(clueorderindex%s<\n",ansutf8); if(treatf) return (*treatf)(ansutf8); return 1; default:break; } return 0; } int pregetinitflist(void) { int i; struct memblk*p; while(lstrings) {p=lstrings->next;free(lstrings);lstrings=p;} lmp=0; lml=MEMBLK; FREEX(tfl);ctfl=0;ntfl=0; FREEX(lts);clts=0;ltotal=0;ultotal=0; for(i=0;idmask,curem=lp->emask,curten=lp->ten; for(i=0;i\n"); } u=addlight(msgword[i],-1-i,0); if(u) return u; goto ex0; } if((curem&EM_ALL)==0) curem=EM_FWD; // force normal entry to be allowed if all are disabled lightlength=llen; DEB_FL printf("getinitflist(%p) llen=%d dmask=%08x emask=%08x ten=%d:\n",(void*)lp,llen,curdm,curem,curten); memset(mfl,0,sizeof(mfl)); for(i=0;i0) { // using discretionary mode - i.e., potentially shuffling treatment message? for(j=0;treatmsgICC[i][j];j++) mfl[i]|=ICCTOABM((int)treatmsgICC[i][j]); // bitmap of all letters present in message if(ntw>(int)strlen(treatmsgICC[i])) mfl[i]|=ABM_DASH; // add in "-" if message not long enough if(clueorderindex0) { j=abmtoicc(ml[i]); // extract msgchar:s from counter if in discretionary mode (overwriting previous values of msgcharICC and friends) u=icctouchar[j]; msgcharICC[i]=j; msgcharU[i]=u; g=icctogroup[j]; if((g==0||g==1)&&u<128) msgcharAZ09[i]=u; // alphanumeric and 7-bit clean? else msgcharAZ09[i]='-'; // otherwise } DEB_FL { printf(" building list with msgcharICC[]="); for(i=0;idmask)==0) continue; // not in a valid dictionary if(ansp[curans]->banned) continue; if(curten) u=treatans(ansp[curans]->ul); else u=treatedanswerICC(ansp[curans]->ul); if(u) return u; if(abort_flag) return -5; } for(i=0;i0) { // this increments the NMSG-digit "counter" in ml[i] where valid digits are the set bits in mfl[i] b=mfl[i]&~(ml[i]|(ml[i]-1)); // clear bits mf[] and below b&=~(b-1); // find new bottom set bit if(b) {ml[i]=b; break;} // try next feasible character ml[i]=mfl[i]&~(mfl[i]-1); // reset to bottom set bit and proceed to advance next character } if(i==NMSG) break; // finish when all combinations done } ex0: *l=malloc(ntfl*sizeof(int)+1); // ensure we don't execute malloc(0) if(*l==0) return 1; memcpy(*l,tfl,ntfl*sizeof(int)); *ll=ntfl; DEB_FL printf("%d entries\n",ntfl); return 0; } qxw-20200708/deck.h0000664000175000017500000000166513674705417011514 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __DECK_H__ #define __DECK_H__ extern int loaddeck(int cldict); extern int dumpdeck(); #endif qxw-20200708/deck.c0000664000175000017500000003562713674705417011514 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "common.h" #include "qxw.h" #include "filler.h" #include "alphabets.h" #include "dicts.h" #include "draw.h" #include "treatment.h" static FILE*dkfp=0; static int line; #define DBUFSZ 10000 char dbuf[DBUFSZ]; #define DELIMS " \t\r\n" #define DELIMEOL "\r\n" #define ENHTABSZ 4096 #define MAXENAMELEN 31 static int enhtab[ENHTABSZ]; // deck is assembled using these structs before copying across to struct entry etc. for filler struct dkentry { char name[MAXENAMELEN+1]; ABM flbm; int hashlink; }*dkentries=0; int entsalloc=0; struct dkword { int nent; struct lprop prop; int entries[MXFL]; }*dkwords=0; int wordsalloc=0; static int dknw,dkne; static int dspec; static void batcherr(char*s) { if(line) fprintf(stderr,"Error at line %d: %s\n",line,s); else fprintf(stderr,"Error: %s\n",s); } static void batchwarn(char*s) { fprintf(stderr,"Warning: %s",s); if(line) fprintf(stderr," at line %d of deck\n",line); fprintf(stderr,"\n"); } // check whether a token is a given directive; if c1!=NULL also check against abbreviated form static int cmdcmp(char*s,char*c0,char*c1) { if(s[0]!='.') return 1; if(!STRCASECMP(s+1,c0)) return 0; if(c1&&!STRCASECMP(s+1,c1)) return 0; return 2; } // 0=not a valid entry name; 1=valid static int isvalidename(char*t) { int i; if(!t) return 0; if(strlen(t)<1||strlen(t)>MAXENAMELEN) return 0; for(i=0;t[i];i++) { if(isalnum((unsigned char)t[i])) continue; if(t[i]=='$') continue; if(t[i]=='_') continue; return 0; } return 1; } static void initenhtab() {int i; for(i=0;i'9') {batcherr("Dictionary number must be 1..9"); return 16;} d=*tok-'1'; TOKEOL; if(!tok) strcpy(dfnames[d],""); // allow empty dictionary filename else strncpy(dfnames[d],tok,SLEN-1); dfnames[d][SLEN-1]=0; DEB_DE printf("dictionary %d: >%s<\n",d,dfnames[d]); dspec=1; continue; } if(!cmdcmp(tok,"FILEFILTER","FF")) { CHECKSTART("Dictionary file filter directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<='0'||*tok>'9') {batcherr("Dictionary number must be 1..9"); return 16;} d=*tok-'1'; TOKEOL; if(!tok) strcpy(dsfilters[d],""); // allow empty file filter else strncpy(dsfilters[d],tok,SLEN-1); dsfilters[d][SLEN-1]=0; DEB_DE printf("dsfilter %d: >%s<\n",d,dsfilters[d]); dspec=1; continue; } if(!cmdcmp(tok,"ANSWERFILTER","AF")) { CHECKSTART("Dictionary answer filter directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<='0'||*tok>'9') {batcherr("Dictionary number must be 1..9"); return 16;} d=*tok-'1'; TOKEOL; if(!tok) strcpy(dafilters[d],""); else strncpy(dafilters[d],tok,SLEN-1); dafilters[d][SLEN-1]=0; DEB_DE printf("dafilter %d: >%s<\n",d,dafilters[d]); dspec=1; continue; } if(!cmdcmp(tok,"RANDOM","RA")) { CHECKSTART("Random fill directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>'2') {batcherr("Syntax error in random fill directive"); return 16;} afrandom=*tok-'0'; continue; } if(!cmdcmp(tok,"UNIQUE","UN")) { CHECKSTART("Unique fill directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>'1') {batcherr("Syntax error in unique fill directive"); return 16;} afunique=*tok-'0'; continue; } if(!cmdcmp(tok,"TREATMENT","TR")) { CHECKSTART("Treatment directive") NEXTTOK; if(!tok||!isdigit((unsigned char)*tok)) {batcherr("Syntax error in treatment directive"); return 16;} u=atoi(tok); if(u<0||u>=NATREAT) {batcherr("Invalid treatment number"); return 16;} treatmode=u; continue; } if(!cmdcmp(tok,"MESSAGE","ME")) { CHECKSTART("Message directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>='0'+NMSG) {batcherr("Syntax error in message directive"); return 16;} u=*tok-'0'; TOKEOL; if(!tok) {batcherr("Syntax error in message directive"); return 16;} strncpy(treatmsg[u],tok,sizeof(treatmsg[0])-1); treatmsg[u][sizeof(treatmsg[0])-1]=0; continue; } if(!cmdcmp(tok,"MESSAGEALLOCATE","MA")) { CHECKSTART("Message allocate directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>='0'+NMSG) {batcherr("Syntax error in message allocate directive"); return 16;} u=*tok-'0'; NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>'2') {batcherr("Syntax error in message allocate directive"); return 16;} treatorder[u]=*tok-'0'; continue; } if(!cmdcmp(tok,"MESSAGECONSTRAINTS","MC")) { CHECKSTART("Message constraints directive") NEXTTOK; if(!tok||strlen(tok)!=1||*tok<'0'||*tok>='0'+NMSG) {batcherr("Syntax error in message constraints directive"); return 16;} u=*tok-'0'; TOKEOL; if(!tok) {batcherr("Syntax error in message constraints directive"); return 16;} i=strtoabms(treatcstr[u],MXFL,tok,1); for(;i'1') {batcherr("Syntax error in word constraint directive"); return 16;} tambaw=*tok-'0'; continue; } if(!cmdcmp(tok,"PLUGIN","PI")) { CHECKSTART("Plugin directive") TOKEOL; if(!tok) {batcherr("Syntax error in plugin directive"); return 16;} strncpy(tpifname,tok,SLEN-1); tpifname[SLEN-1]=0; continue; } // the following are stackable using block syntax if(!cmdcmp(tok,"USEDICTIONARY","UD")) { NEXTTOK; if(!tok) {batcherr("Syntax error in dictionary list"); return 16;} for(dmask=0,i=0;tok[i];i++) { if(tok[i]<='0'||tok[i]>'9') {batcherr("Syntax error in dictionary list"); return 16;} dmask|=1<<(tok[i]-'1'); // internally count from 0 } if(!dmask) batchwarn("Empty dictionary list"); continue; } if(!cmdcmp(tok,"ENTRYMETHOD","EM")) { NEXTTOK; if(!tok) {batcherr("Syntax error in entry method specification"); return 16;} for(emask=0,i=0;tok[i];i++) { u=tok[i]; if(isupper((unsigned char)u)) u=tolower((unsigned char)u); switch(u) { case 'f': case '>': emask|=EM_FWD; break; case 'r': case '<': emask|=EM_REV; break; case 'c': case ')': emask|=EM_CYC; break; case 'a': case '(': emask|=EM_RCY; break; case 'j': case '@': emask|=EM_JUM; break; default: batcherr("Syntax error in entry method specification"); return 16; } } if(!emask) batchwarn("No entry methods specified"); continue; } if(!cmdcmp(tok,"TREATMENTENABLE" ,"TE")) { ten=1; continue; } if(!cmdcmp(tok,"TREATMENTDISABLE","TD")) { ten=0; continue; } if(*tok=='.') {batcherr("Unrecognised directive"); return 16;} // word/entry creation if(isvalidename(tok)) { w=newword(); if(w<0) return 16; // out of memory etc. dkwords[w].prop.dmask=dmask; dkwords[w].prop.emask=emask; dkwords[w].prop.ten=ten; for(;;) { DEB_DE printf("word entry tok=>%s<\n",tok); e=findent(tok); if(e<0) return 16; // out of memory etc. if(dkwords[w].nent>=MXLE) {batcherr("Too many entries in word"); return 16;} dkwords[w].entries[dkwords[w].nent]=e; dkwords[w].nent++; ew0: NEXTTOK; if(!tok) break; if(*tok=='=') { ABM a[MXLE]; int l; char s[MAXENAMELEN+100]; l=strtoabms(a,MXLE,tok+1,1); if(l>dkwords[w].nent) {batcherr("Constraint too long"); return 16;} for(i=0;iten&&treatmode>0) ntw++; // count treated words } for(e=0;e=0) printf("H%4d>%4d\n",h,enhtab[h]); for(e=0;e%d\n",e,dkentries[e].name,dkentries[e].flbm,dkentries[e].hashlink); for(w=0;wflbmh,1); if(words[w].flistlen) { printf("\n# "); for(k=0;k0) printf("; "); ansform(t0,sizeof(t0),words[w].flist[k],words[w].wlen,words[w].lp->dmask); printf("%s",t0); } } printf("\n"); } for(;wflbmh,1); printf("\n"); } return 0; } qxw-20200708/dicts.h0000664000175000017500000000570513674705417011713 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __DICTS_H__ #define __DICTS_H__ #define MAXNDICTS 9 // must fit in a word extern char dfnames[MAXNDICTS][SLEN]; extern char dsfilters[MAXNDICTS][SLEN]; extern char dafilters[MAXNDICTS][SLEN]; extern int dst_lines[MAXNDICTS]; extern int dst_lines_f[MAXNDICTS]; extern int dst_lines_fa[MAXNDICTS]; extern int dst_u_rejline[MAXNDICTS][MAXUCHAR]; extern int dst_u_rejline_count[MAXNDICTS][MAXUCHAR]; extern char lemdesc[NLEM][LEMDESCLEN]; extern char*lemdescADVP[NLEM]; extern int atotal; // total answers extern int ltotal; // total lights extern int ultotal; // total uniquified lights extern unsigned int dusedmask; // set of dictionaries used extern void initalphamap(struct alphaentry*a); extern int initalphamapbycode(char*s); extern void clearalphamap(); extern int addalphamapentry(int icc,char*rep,char*equiv,int vow,int con,int seq); extern int isdisallowed(uchar uc); extern int loaddicts(int sil); extern void freedicts(void); extern int loaddefdicts(void); extern int iswordindm(const char*s,int dm); extern int ucharslen(uchar*s); extern int utf8touchars(uchar*ucs,const char*s,int l); extern char*uchartoutf8(char*q,uchar c); extern char*ucharstoutf8(char*q,uchar*s); extern int q_mblen(char*p); extern int abmtoicc(ABM b); extern char uchartoICC(int c); // convert UTF-32 to internal character code extern uchar ICCtouchar(char c); // convert internal character code to UTF-32 extern void printU(uchar c); extern void printUs(const uchar*s); extern void printICC(char c); extern void printICCs(const char*s); extern uchar icctouchar[MAXICC+1]; // convert internal character code to UTF-32 of canonical representative extern char icctoutf8[MAXICC+1][16]; // convert internal character code to UTF-8 string of canonical representative, 0-terminated extern char iccequivs[MAXICC][MAXEQUIV*8+1]; extern char iccseq[MAXICC+1]; #define MAXICCGROUP 3 extern int niccused; extern char iccused[MAXICC+1]; extern int icctousedindex[MAXICC+1]; extern int iccusedtogroup[MAXICC+1]; extern int icctogroup[MAXICC+1]; extern int iccgroupstart[MAXICCGROUP+1]; extern ABM abm_vow,abm_con,abm_use; #endif qxw-20200708/filler.c0000664000175000017500000011270413674706260012050 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Interface to treatment.c comprises: pregetinitflist(); getinitflist(); postgetinitflist(); Interface to qxw.c / gui.c comprises: Calls out: mkfeas(); updatefeas(); updategrid(); Calls in: filler_init(); filler_start(); filler_stop(); filler_finit(); getposs(); */ #include #include #include #include #include "common.h" #include "filler.h" #include "treatment.h" #include "qxw.h" #include "gui.h" #include "dicts.h" static GThread*fth; static int ct_malloc=0,ct_free=0; // counters for debugging volatile int abort_flag=0; volatile unsigned int filler_seed=0; static int fillmode=0; // 0=stopped, 1=filling all, 2=filling selection, 3=word lists only (for preexport) static clock_t ct0; int filler_status=0; // return code: -5: aborted; -3, -4: initflist errors; -2: out of stack; -1: out of memory; 0: stopped; 1: no fill found; 2: fill found; 3: running // the following stacks keep track of the filler state as it recursively tries to fill the grid static int sdep=-1; // stack pointer static char**sposs=0; // possibilities for this entry, 0-terminated static int*spossp=0; // which possibility we are currently trying (index into sposs) static int***sflist; // pointers to restore feasible word list flist static struct jdata***sjdata=0; // jumble data static ABM***sjflbm=0; // jumble data feasible list bitmaps static struct sdata***ssdata=0; // spread data static int**sflistlen=0; // pointers to restore flistlen static ABM**sentryfl=0; // feasible letter bitmap for this entry static int*sentry=0; // entry considered at this depth static unsigned char*aused=0; // answer already used while filling static unsigned char*lused=0; // light already used while filling #define isused(l) (lused[lts[l].uniq]|aused[lts[l].ans+NMSG]) #define setused(l,v) lused[lts[l].uniq]=v,aused[lts[l].ans+NMSG]=v // ,printf("setused(%d,%d)->%d\n",l,v,lts[l].uniq) static void pstate(int f) { int i,j,jmode; struct word*w; for(i=0;ilp->emask&EM_JUM) jmode=1; else if(w->lp->emask&EM_SPR) jmode=2; else jmode=0; printf("W%d: fe=%d jmode=%d nent=%d wlen=%d jlen=%d E: ",i,w->fe,jmode,w->nent,w->wlen,w->jlen); for(j=0;jnent;j++) printf("%d ",(int)(w->e[j]-entries)); printf("= "); for(j=0;jnent;j++) pabm(w->e[j]->flbm,1); printf("\n"); if(f) { printf(" "); if(w->flistlen<8) j=0; else { for(j=0;j<3;j++) { printf(" "); printICCs(lts[w->flist[j]].s); printf("[%d]",lts[w->flist[j]].uniq); } printf(" ..."); j=w->flistlen-3; } for(;jflistlen;j++) { printf(" "); printICCs(lts[w->flist[j]].s); printf("[%d]",lts[w->flist[j]].uniq); } printf(" (%d)\n",w->flistlen); } } } // transfer progress info to display static void progress(void) { DEB_F1 printf("ct_malloc=%d ct_free=%d diff=%d\n",ct_malloc,ct_free,ct_malloc-ct_free); gdk_threads_enter(); updategrid(); gdk_threads_leave(); } static int initjdata(int j) {struct word*w; int i; w=words+j; if(!(w->lp->emask&EM_JUM)) return 0; w->jdata=malloc(w->flistlen*sizeof(struct jdata)); if(!w->jdata) return -1; w->jflbm=malloc(w->flistlen*w->jlen*sizeof(ABM)); if(!w->jflbm) return -1; for(i=0;iflistlen*w->jlen;i++) w->jflbm[i]=ABM_ALL; return 0; } static int initsdata(int j) {struct word*w; int i,k; w=words+j; if(!(w->lp->emask&EM_SPR)) return 0; if(w->fe) return 0; w->sdata=malloc(w->flistlen*sizeof(struct sdata)); if(!w->sdata) return -1; for(i=0;iflistlen;i++) for(k=0;knent;k++) w->sdata[i].flbm[k]=ABM_ALL; return 0; } // Determine if one string is a non-trivial cyclic permutation of another static int strcyccmp(char*s,char*t,int l) { int i,j,k; for(i=1;ilp->emask; m=w->jlen; for(k=0;kjflbm[j*m+k]:w->e[k]->flbm); // build up forward and reversed versions f[k]=0; r[k]=0; t=lts[w->flist[j]].s; DEB_F3 { printf("checkperm("); printICCs(f); printf(" : "); printICCs(t); printf(" em=%d mode=%d)\n",em,mode); } if((em&EM_FWD)==0) if(!strncmp(f,t,m)) return 0; if((em&EM_REV)==0) if(!strncmp(r,t,m)) return 0; if((em&EM_CYC)==0) if(strcyccmp(f,t,m)) return 0; if((em&EM_RCY)==0) if(strcyccmp(r,t,m)) return 0; return 1; } // Approximate test to see if a jumble of #wn in the flist for word w can fit. Writes deductions to flbm etc. in jdata. static int checkjword(struct word*w,int wn) { unsigned char hi[MAXICC+1]; ABM bm[MXFL],u,v,*jbm; unsigned char edone[MXFL]; // entries done unsigned char order[MAXICC+1]; int excess[MAXICC+1]; struct light*l; int c,c0,c1,f,i,i0,k,m,n,norder,nuf; int mex,mmex; l=lts+w->flist[wn]; m=w->jlen; jbm=w->jflbm+wn*m; DEB_F3 { printf("checkjword(w=%ld,\"",(long int)(w-words)); printICCs(l->s); printf("\") jlen=%d lbm=",m); pabm(l->lbm,1); printf("\nhist="); for(i=1;ihist[i]); printf("\n"); } for(k=0;ke[k]->flbm&l->lbm; // here bm[k] is the array of feasible letter bitmaps, and l->hist[] is the histogram of available letters DEB_F3 { printf("entering main loop with\nbm[k]= "); pabms(bm,m,1); printf("\n"); } do { memcpy(hi,l->hist,sizeof(hi)); memset(edone,0,sizeof(edone)); l0: f=0; for(k=0;k0) { v=ICCTOABM(i); for(k=0,c=0;k0&&excess[i]>mmex&&excess[i]0&&excess[i]==mex) order[norder++]=i; mmex=mex; } while(mmex<=MXFL); for(u=0,n=0,i=0,i0=0;ijdata[wn].ufhist[i]=hi[i]; v=ICCTOABM(i); for(c0=0,k=0;kjdata[wn].poscnt[i]=c0; } for(nuf=0,k=0;kjdata[wn].nuf=nuf; DEB_F3 { printf("checkjword returning w=%ld \"",(long int)(w-words)); printICCs(l->s); printf("\" nuf=%d\n",nuf); printf("ufhist="); for(i=1;ijdata[wn].ufhist[i]); printf("\n"); printf("poscnt="); for(i=1;ijdata[wn].poscnt[i]); printf("\n"); printf(" flbm: "); pabms(jbm,m,1); printf("\n"); } for(i=0;iflist[wn]; m=w->nent; n=w->wlen; sd=w->sdata+wn; DEB_F3 { printf("scounts: w=%ld \"",(long int)(w-words)); printICCs(l->s); printf("\"\n"); } memset(ctl,0,sizeof(ctl)); ctl[0][0]=1; for(j=1;j<=m;j++) { u=bm[j-1]; for(i=0;i<=n;i++) { if(u&ABM_DASH) ctl[i][j]=ctl[i][j-1]; if(i>0&&(u&ICCTOABM((int)l->s[i-1]))) ctl[i][j]+=ctl[i-1][j-1]; } } memset(ctr,0,sizeof(ctr)); ctr[n][m]=1; for(j=m-1;j>=0;j--) { u=bm[j]; for(i=n;i>=0;i--) { if(u&ABM_DASH) ctr[i][j]=ctr[i][j+1]; if(is[i]))) ctr[i][j]+=ctr[i+1][j+1]; } } DEB_F3 { printf("CTL: # of ways to put chars [0,i) in slots [0,j)\n"); for(j=0;j<=m;j++) { for(i=0;i<=n;i++) printf("%5.1f ",ctl[i][j]); printf("\n"); } printf("CTR: # of ways to put chars [i,n) in slots [j,m)\n"); for(j=0;j<=m;j++) { for(i=0;i<=n;i++) printf("%5.1f ",ctr[i][j]); printf("\n"); } } // DEB_F3 {printf("memset0: %p 0 %d wn=%d\n",sd->ct,sizeof(sd->ct),wn); fflush(stdout); } memset(sd->ct,0,sizeof(sd->ct)); // DEB_F3 {printf("memset1: %p 0 %d\n",sd->ctd,sizeof(sd->ctd)); fflush(stdout); } memset(sd->ctd,0,sizeof(sd->ctd)); for(i=0;ict[i][j]=ctl[i][j]*ctr[i+1][j+1]; for(j=0;jctd[j]+=ctl[i][j]*ctr[i][j+1]; // do the spreading character as a special case DEB_F3 { printf(" " ); for(i=0;is[i]]); printf(" -\n"); for(j=0;jct[i][j]); printf(" %5.1f",sd->ctd[j]); printf("\n");} } memset(sd->flbm,0,sizeof(sd->flbm)); for(i=0;ict [i][j]) sd->flbm[j]|=ICCTOABM((int)l->s[i]); for (j=0;jctd[j]) sd->flbm[j]|=ABM_DASH; } // Test to see if a spread string can fit in a given word. Writes deductions to w->sdata[j]. static void checksword(struct word*w,int j) { ABM bm[MXFL]; struct light*l; struct sdata*sd; int k,m; l=lts+w->flist[j]; sd=w->sdata+j; m=w->nent; for(k=0;ke[k]->flbm; DEB_F3 { printf("checksword(w=%ld,\"",(long int)(w-words)); printICCs(l->s); printf("\") bm="); pabms(bm,m,1); printf(" j=%d\n",j); } scounts(w,j,bm); DEB_F3 { printf(" output bm="); pabms(sd->flbm,m,1); printf("\n"); } } // intersect light list q length l with letter position wp masked by bitmap m: result is stored in p and new length is returned static int listisect(int*p,int*q,int l,int wp,ABM m) {int i,j; for(i=0,j=0;i%d\n",wp,m,l,j); return j; } // find the entry to expand next, or -1 if all done static int findcritent(void) {int i,j,m;double k,l; m=-1; for(i=0;im) m=entries[i].checking; // find highest checking level // find highest checking level } j=-1; for(;m>0;m--) { // m>=2: loop over checked entries; then m=1: loop over unchecked entries j=-1;l=DBL_MAX; for(i=0;i=m) { // not already fixed? k=entries[i].crux; // get the priority for this entry if(k=1 otherwise static int settleents(void) { struct entry*e; struct word*w; struct jdata*jd; struct sdata*sd; ABM*jdf; int aed,f,i,j,k,l,m,mj,jmode; int*p; // DEB_F1 printf("settleents() sdep=%d\n",sdep); f=0; for(j=0;jlp->emask&EM_JUM) jmode=1; else if(w->lp->emask&EM_SPR) jmode=2; else jmode=0; // printf("j=%d jmode=%d emask=%d\n",j,jmode,w->lp->emask); m=w->nent; mj=w->jlen; for(k=0;ke[k]->upd) break; if(k==m) continue; // no update flags set on any entries for this word for(k=0;ke[k]->flbm)) break; aed=(k==m); // all entries determined? p=w->flist; l=w->flistlen; jd=w->jdata; sd=w->sdata; if(!p) continue; // no flist? if(sflistlen[sdep][j]==-1) { // then we mustn't trash words[].flist sflist [sdep][j]=p; sflistlen[sdep][j]=l; sjdata [sdep][j]=jd; sjflbm [sdep][j]=w->jflbm; ssdata [sdep][j]=sd; w->jdata=0; w->jflbm=0; w->sdata=0; w->flist=(int*)malloc(l*sizeof(int)); // new list can be at most as long as old one if(!w->flist) return -1; // out of memory ct_malloc++; if(jmode==1) { w->jdata=(struct jdata*)malloc(l*sizeof(struct jdata)); if(!w->jdata) return -1; // out of memory ct_malloc++; w->jflbm=(ABM*)malloc(l*mj*sizeof(ABM)); if(!w->jflbm) return -1; // out of memory ct_malloc++; } if(jmode==2) { w->sdata=(struct sdata*)malloc(l*sizeof(struct sdata)); if(!w->sdata) return -1; // out of memory ct_malloc++; } } if(afunique) { // the following test makes things quite a lot slower: consider optimising by keeping track of when an update might be needed for(i=0,k=0;iflist[k++]=p[i]; p=w->flist; l=k; } if(jmode==0) { // normal case for(k=0;ke[k]; if(!e->upd) continue; l=listisect(w->flist,p,l,k,e->flbm); // generate new feasible word list p=w->flist; if(l==0) break; } } else if(jmode==1) { // jumble case for(k=mj;ke[k]; if(!e->upd) continue; l=listisect(w->flist,p,l,k,e->flbm); // generate new feasible word list p=w->flist; } for(i=0,k=0;iflist[k]=p[i]; if(checkjword(w,k)) k++;} l=k; w->upd=1; f++; // need to do settlents() anyway in this case } else { // spread case for(i=0;iflist[i]=p[i]; checksword(w,i);} w->upd=1; f++; // need to do settlents() anyway in this case } if(l!=w->flistlen) { w->upd=1;f++; // word list has changed: feasible letter lists will need updating if(l) { p=realloc(w->flist,l*sizeof(int)); if(p) w->flist=p; if(w->jdata) { jd=realloc(w->jdata,l*sizeof(struct jdata)); if(jd) w->jdata=jd; jdf=realloc(w->jflbm,l*mj*sizeof(ABM)); if(jdf) w->jflbm=jdf; } if(w->sdata) { sd=realloc(w->sdata,l*sizeof(struct sdata)); if(sd) w->sdata=sd; } } } w->flistlen=l; if(l==0&&!w->fe) return -2; // no options left and was not fully entered by user if(!aed) continue; // not all entries determined yet, so don't commit if(jmode==1) { // final check that the "jumble" is not actually a cyclic permutation etc. for(i=0,k=0;iflist[k]=w->flist[i]; if(checkperm(w,k,0)) k++;} l=k; } w->flistlen=l; if(l==0&&!w->fe) return -2; // no options left and was not fully entered by user assert(w->commitdep==-1); for(k=0;kflist[k],1); // flag as used (can be more than one in jumble case) w->commitdep=sdep; } for(i=0;i0 otherwise static int settlewds(void) { int f,i,j,k,l,m,mj,jmode; int*p; struct entry*e; struct word*w; ABM entfl[MXFL]; DEB_F1 printf("settlewds()\n"); f=0; for(i=0;iupd) continue; // loop over updated word lists if(ifamode==1&&i!=curword) continue; if(w->fe) continue; if(w->lp->emask&EM_JUM) jmode=1; else if(w->lp->emask&EM_SPR) jmode=2; else jmode=0; m=w->nent; mj=w->jlen; p=w->flist; l=w->flistlen; for(k=0;kjflbm[j*mj+k]; // main work has been done in settleents() for( ;ksdata[j].flbm[k]; // main work has been done in settleents() DEB_F2 { printf("w=%d entfl: ",i); pabms(entfl,m,1); printf("\n"); } for(j=0;je[j]; // propagate from word to entry if(e->flbm&~entfl[j]) { // has this entry been changed by the additional constraint? e->flbm&=entfl[j]; e->upd=1;f++; // flag that it will need updating // printf("E%d %16llx\n",k,entries[k].flbm);fflush(stdout); } } } for(i=0;iflist[j]; m=w->jlen; jd=w->jdata+j; jbm=w->jflbm+j*m; nuf=jd->nuf; DEB_F3 { printf("jscores: w=%ld \"",(long int)(w-words)); printICCs(l->s); printf("\" nuf=%d\n",nuf); printf("ufhist="); for(i=1;iufhist[i]); printf("\n"); printf("poscnt="); for(i=1;iposcnt[i]); printf("\n"); printf(" flbm: "); pabms(jbm,m,1); } // first make a very poor man's estimate of total feasible permutations given jdata information for word t=nuf; tp=1; for(i=1;iufhist[i]; p=jd->poscnt[i]; if(!h||h==nuf) continue; // if none of this letter, or all unforced are the same letter, then nothing to do r=(double)(p-h)/(nuf-h)*(t-h)+h; // if p==h, r=h; if p==nuf, r=t; and linearly (!) in between for(k=1;k<=h;k++) tp*=r,tp/=k,r-=1; t-=h; } if(tp>DBL_MAX) tp=DBL_MAX; // tp could conceivably go infinite here DEB_F3 { printf(" tp=%g\n",tp); } memset(sc,0,m*(MAXICC+1)*sizeof(double)); for(k=0;kposcnt[i]==0) continue; if(u&(ICCTOABM(i))) { s=(double)jd->ufhist[i]/jd->poscnt[i]; // proportion of fills that will have letter c in each position r+=sc[k][i]=s; } } if(r>0) r=tp/r; for(i=1;iflist[wn]; m=w->nent; n=w->wlen; sd=w->sdata+wn; memset(sc,0,m*(MAXICC+1)*sizeof(double)); for(i=0;is[i]; for(j=0;jct[i][j]; } // now do the spreading character as a special case: i=#chars to left of candidate '-' for(j=0;jctd[j]; DEB_F3 for(k=0;kfe) continue; if(w->lp->emask&EM_JUM) jmode=1; else if(w->lp->emask&EM_SPR) jmode=2; else jmode=0; m=w->nent; mj=w->jlen; p=w->flist; l=w->flistlen; for(k=0;kcommitdep>=0) { // avoid zero score if we've committed if(l==1) for(k=0;kscore; for(k=0;k=0) f*=(double)ansp[k]->score; // score once for each feasible permutation; assume score=1 if a treatment light for(k=mj;ke[k]->score[j]*=sc[k][j]; } for(i=0;iscore[i]>k) k=e->score[i]; // find highest score k*=2; for(;;) { for(i=1,j=-DBL_MAX;iscore[i]>j&&e->score[i]score[i]; // peel off scores from top down DEB_F1 printf("getposs(%d): j=%g\n",(int)(e-entries),j); if(j<=0) break; for(i=1;iscore[i]==j) s[l++]=i; // add to output string k=j;} // get next highest set of equal scores s[l]='\0'; if(r==0) return; for(i=0;i=0&&mcommitdep>=sdep) { // word to uncommit? l=w->flistlen; DEB_F2 { printf("sdep=%d flistlen=%d uncommitting word %d commitdep=%d:",sdep,w->flistlen,i,w->commitdep); for(j=0;jflist[j]].s);} printf("\n"); } for(j=0;jflist[j],0); w->commitdep=-1; } if(sflistlen[sdep][i]!=-1&&w->flist!=0) { // word feasible list to free? free(w->flist); ct_free++; w->flist=sflist[sdep][i]; w->flistlen=sflistlen[sdep][i]; if(w->jdata) { free(w->jdata); ct_free++; w->jdata=sjdata[sdep][i]; } if(w->jflbm) { free(w->jflbm); ct_free++; w->jflbm=sjflbm[sdep][i]; } if(w->sdata) { free(w->sdata); ct_free++; w->sdata=ssdata[sdep][i]; } } } for(i=0;i=0);state_restore();sdep--;} // clear state stacks and free allocated memory static void state_finit(void) { while(sdep>=0) state_pop(); freestack(); } // build initial feasible lists, calling plug-in as necessary static int buildlists(void) {int u,i,j; DEB_F1 printf("buildlists() "); for(i=0;ichecking; } if(fillmode>0||ifamode==2||(ifamode==1&&i==curword)) { // only build the lists we need u=getinitflist(&words[i].flist,&words[i].flistlen,words[i].lp,words[i].wlen); if(u) {filler_status=-3;return 0;} if(initjdata(i)) {filler_status=-3;return 0;} if(initsdata(i)) {filler_status=-3;return 0;} } if(abort_flag) { DEB_F1 printf("aborted while building word lists\n"); filler_status=-5; return 1; } if(words[i].lp->ten) clueorderindex++; } DEB_F1 printf("\n"); if(postgetinitflist()) {filler_status=-4;return 1;} FREEX(aused); FREEX(lused); aused=(unsigned char*)calloc(atotal+NMSG,sizeof(unsigned char)); // enough for "msgword" answers too if(aused==NULL) {filler_status=-3;return 0;} lused=(unsigned char*)calloc(ultotal,sizeof(unsigned char)); if(lused==NULL) {filler_status=-3;return 0;} return 0; } // Main search routine. Returns // -5: told to abort // -1: out of memory // -2: out of stack // 1: all done, no result found // 2: all done, result found or only doing BG fill anyway static int search() { int e,f; unsigned char c; clock_t ct1; if(fillmode==0&&ifamode==1) { f=settleents(); if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} f=settlewds(); if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} f=mkscores(); if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} return 2; } // Initially entry flbms are not consistent with word lists or vice versa. So we // need to make sure we call both settlewds() and settleents() before proceeding. if(settlewds()==-3) {DEB_F1 printf("aborting...\n"); return -5;}; resettle: // "unit propagation" do { if(abort_flag) {DEB_F1 printf("aborting...\n"); return -5;} f=settleents(); // rescan entries if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} if(f==0) break; if(f==-1) return -1; // out of memory: abort if(f==-2) goto backtrack; // proved impossible f=settlewds(); // rescan words if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} } while(f); // need to iterate until everything settles down f=mkscores(); if(f==-3) {DEB_F1 printf("aborting...\n"); return -5;} if(fillmode==0||fillmode==3) return 2; // only doing BG/preexport fill? stop after first settle DEB_F2 pstate(1); // go one level deeper in search tree DEB_F2 { int w; for(w=0;wCLOCKS_PER_SEC*3||ct1=0) printf("assertion failing i=%d nw=%d words[i].commitdep=%d\n",i,nw,words[i].commitdep); assert(words[i].commitdep==-1); // ... and uncommitted } DEB_F0 printf("search done\n"); DEB_F0 {printf(">> ct_malloc=%d ct_free=%d diff=%d\n",ct_malloc,ct_free,ct_malloc-ct_free);fflush(stdout);} // j=0; for(i=0;i0||ifamode>0) filler_status=search(); else filler_status=2; if(fillmode!=3) searchdone(); // tidy up unless in pre-export mode DEB_F0 printf("search finished: %.3fs\n",(double)(clock()-ct)/CLOCKS_PER_SEC); ex0: DEB_F0 printf("fillerthread() terminating filler_status=%d\n",filler_status); return 0; } // EXTERNAL INTERFACE // returns !=0 on error int filler_start(int mode) {int i,j; assert(fth==0); DEB_F0 printf("filler_start(%d)\n",mode); DEB_F1 pstate(0); fillmode=mode; if(allocstack()) return 1; for(i=0;iflbm)) {words[i].fe=0; break;} } if(pregetinitflist()) return 1; state_init(); for(i=0;i or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // GTK #include #include #include #include #include #include #include "common.h" #include "qxw.h" #include "filler.h" #include "dicts.h" #include "treatment.h" #include "gui.h" #include "draw.h" #include "alphabets.h" #define MAINWWIDTH 800 #define MAINWHEIGHT 628 #define FLISTWIDTH 218 int selmode=0; int nsel=0; // number of things selected int pxsq; int zoomf=8; int zoompx[]={18,20,22,24, 26,28,30,33, 36,39,43,47, 52,57,62,67, 72}; int curmf=1; // cursor has moved since last redraw static char*gtypedesc[NGTYPE]={ "Plain rectangular", "Hex with vertical lights", "Hex with horizontal lights", "Circular", "Circular with half-cell offset", "Join left and right edges", "Join top and bottom edges", "Join left and right edges with flip", "Join top and bottom edges with flip", "Torus", "Klein bottle (left and right edges joined with flip, top and bottom without)", "Klein bottle (top and bottom edges joined with flip, left and right without)", "Projective plane (both pairs of edges joined with flip)", }; static int spropdia(int g); static int lpropdia(int g); static int mvldia(int v); static int alphadia(void); static int dictldia(void); static int dstatsdia(void); static int treatdia(void); static int gpropdia(void); static int ccontdia(void); static int editlightdia(void); // static int writecluedia(void); static int prefsdia(void); static int statsdia(void); static int filedia(char*res,char*but,char*ext,char*filetype,int write); static void gridchangen(void); static void syncsymmmenu(void); static void syncselmenu(void); static void syncifamenu(void); static GtkWidget *grid_da; static GtkItemFactory *item_factory; // for menus static GtkWidget *mainw,*grid_sw,*paned,*list_sw,*poss_label,*clist; // main window and content static GtkWidget*stats=NULL; // statistics window (if visible) static GtkWidget *hist_da; static GtkWidget*(st_te[MXLE+2][5]),*(st_r[10]); // statistics table static char*treat_lab[NATREAT][NMSG]={ {0, 0, }, {"Keyword: ", 0, }, {"Encode ABC...Z as: ", 0, }, {"Key character/word: ", 0, }, {"Encodings of A: ", 0, }, {"Correct characters: ", "Incorrect characters: " }, {"Characters to delete: ", 0, }, {"Characters to delete: ", 0, }, {"Characters to insert: ", 0, }, {"Message 1: ", "Message 2: " }, {"Correct characters: ", 0, }, {"Incorrect characters: ", 0 }, }; static int treatpermok[NATREAT][NMSG]={ {0,0}, {0,0}, {0,0}, {0,0}, {1,0}, {0,0}, {1,0}, {1,0}, {1,0}, {1,1}, {1,0}, {1,0}, }; static char*tnames[NATREAT]={ " None", " Playfair cipher", " Substitution cipher", " Fixed Caesar/Vigenère cipher", " Variable Caesar cipher", " Misprint (general, clue order)", " Delete single occurrence of character", " Letters latent: delete all occurrences of character", " Insert single character", " Custom plug-in", " Misprint (correct characters specified)", " Misprint (incorrect characters specified)", }; static char*mklabel[NGTYPE][MAXNDIR*2]={ {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","E mark: ", "SE mark: ","SW mark: ","W mark: "}, {"NW mark: ","N mark: ","NE mark: ", "SE mark: ","S mark: ","SW mark: "}, {"First mark: ","Second mark: ","Third mark: ","Fourth mark: "}, {"First mark: ","Second mark: ","Third mark: ","Fourth mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, {"NW mark: ","NE mark: ","SE mark: ","SW mark: "}, }; // set main window title static void setwintitle() {char t[SLEN*3]; sprintf(t,"Qxw: %s",titlebyauthor()); gtk_window_set_title(GTK_WINDOW(mainw),t); } // set filenamebase from given string, which conventionally ends ".qxw" void setfilenamebase(char*s) { strncpy(filenamebase,s,SLEN-1);filenamebase[SLEN-1]='\0'; if(strlen(filenamebase)>=4&&!strcmp(filenamebase+strlen(filenamebase)-4,".qxw")) filenamebase[strlen(filenamebase)-4]='\0'; } // general question-and-answer box: title, question, yes-text, no-text static int box(int type,const char*t,const char*u,const char*v) { GtkWidget*dia; int i; dia=gtk_message_dialog_new( GTK_WINDOW(mainw), GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_NONE, "%s",t ); gtk_dialog_add_buttons(GTK_DIALOG(dia),u,GTK_RESPONSE_ACCEPT,v,GTK_RESPONSE_REJECT,NULL); i=gtk_dialog_run(GTK_DIALOG(dia)); gtk_widget_destroy(dia); return i==GTK_RESPONSE_ACCEPT; } // box for information purposes only static void okbox(const char*t) {box(GTK_MESSAGE_INFO,t,GTK_STOCK_CLOSE,0);} // box for warnings void repwarn(const char*s) { if(usegui) box(GTK_MESSAGE_WARNING,s,GTK_STOCK_CLOSE,0); else { fprintf(stderr,"Warning: %s\n",s); } } // box for errors void reperr(const char*s) { if(usegui) box(GTK_MESSAGE_ERROR,s,GTK_STOCK_CLOSE,0); else { fprintf(stderr,"Error: %s\n",s); exit(16); } } void fsgerr() {reperr("A filing system error occurred");} void fserror() {char s[SLEN],t[SLEN*2]; #ifdef _WIN32 if(strerror_s(s,SLEN,errno)) strcpy(s,"general error"); // Windows version of threadsafe strerror() #else if(strerror_r(errno,s,SLEN)) strcpy(s,"general error"); #endif sprintf(t,"Filing system error: %s",s); reperr(t); } static int areyousure(char*action) { // general-purpose are-you-sure dialogue char s[1000]; sprintf(s,"\n Your work is not saved. \n Are you sure you want to %s? \n",action); return box(GTK_MESSAGE_QUESTION,s," Proceed ",GTK_STOCK_CANCEL); } GtkWidget*fipdia; static volatile int killfdflag=0; static int fiptimeout(gpointer data) { DEB_GU {printf(" fipdia=%p %d\n",(void*)fipdia,killfdflag); fflush(stdout);} if(killfdflag==0) return 1; killfdflag=2; gtk_dialog_response(GTK_DIALOG(fipdia),GTK_RESPONSE_ACCEPT); return 1; } static void createfipdia() { DEB_GU printf("entering createfipdia()...\n"); killfdflag=0; fipdia=gtk_message_dialog_new(GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_NONE,"\n Filling in progress \n"); DEB_GU printf("fipdia=%p\n",(void*)fipdia); gtk_dialog_add_buttons(GTK_DIALOG(fipdia)," Stop ",GTK_RESPONSE_ACCEPT,NULL); gtk_widget_show_now(fipdia); while(gtk_events_pending()) gtk_main_iteration_do(0); } static void runfipdia() { int id; DEB_GU printf("entering runfipdia %p...\n",(void*)fipdia); id=g_timeout_add(100,fiptimeout,0); gtk_dialog_run(GTK_DIALOG(fipdia)); DEB_GU printf("leaving runfipdia %p...\n",(void*)fipdia); g_source_remove(id); gtk_widget_destroy(fipdia); } // note this function is called from a different thread void killfipdia(void) { if(!usegui) return; DEB_GU printf("killfipdia()\n"); killfdflag=1; } // GTK MENU HANDLERS // simple menu handlers static int checkoverwrite() {FILE*fp; fp=q_fopen(filename,"r"); if(!fp) return 1; fclose(fp); return box(GTK_MESSAGE_QUESTION,"\n That file already exists. \n Overwrite it? \n"," Overwrite ",GTK_STOCK_CANCEL); } static void m_filenew(GtkWidget*w,gpointer data) { if(!unsaved||areyousure("start again")) { a_filenew((intptr_t)data); strcpy(filenamebase,""); setwintitle(); syncgui(); compute(0); } } static void m_fileopen(GtkWidget*w,gpointer data) { if(!unsaved||areyousure("proceed")) if(filedia(0,"Open",".qxw","Qxw",0)) { a_load(); setwintitle(); syncgui(); compute(0); } } static void m_filesaveas(GtkWidget*w,gpointer data) { if(filedia(0,"Save",".qxw","Qxw",1)&&checkoverwrite()) { a_save(); setwintitle(); } } static void m_filesave(GtkWidget*w,gpointer data) { // printf("m_filesave: filenamebase=%s havesavefn=%d\n",filenamebase,havesavefn); if(havesavefn&&strcmp(filenamebase,"")) { strcpy(filename,filenamebase); strcat(filename,".qxw"); a_save(); } else m_filesaveas(w,data); } static void m_exportvls(GtkWidget*w,gpointer data) {char t[SLEN+50]; if(filedia(t,"Export free light paths",".fl.txt","Plain text",1)) a_exportvls(t);} static void m_importvls(GtkWidget*w,gpointer data) {char t[SLEN+50]; if(filedia(t,"Import free light paths",".fl.txt","Plain text",0)) a_importvls(t);} static void m_filequit(void) {if(!unsaved||areyousure("quit")) gtk_main_quit();} static void m_undo(GtkWidget*w,gpointer data) {if((uhead+UNDOS-1)%UNDOS==utail) return;undo_pop();gridchangen();syncgui();} static void m_redo(GtkWidget*w,gpointer data) {if(uhead==uhwm) return;uhead=(uhead+2)%UNDOS;undo_pop();gridchangen();syncgui();} static void m_editgprop(GtkWidget*w,gpointer data) {gpropdia();} static void m_dsprop(GtkWidget*w,gpointer data) {spropdia(1);} static void m_sprop(GtkWidget*w,gpointer data) {spropdia(0);} static void m_dlprop(GtkWidget*w,gpointer data) {lpropdia(1);} static void m_lprop(GtkWidget*w,gpointer data) {lpropdia(0);} static void m_cellcont(GtkWidget*w,gpointer data) {ccontdia();} static void m_editlight(GtkWidget*w,gpointer data) {editlightdia();} // static void m_writeclue(GtkWidget*w,gpointer data) {writecluedia();} static void m_afctreat(GtkWidget*w,gpointer data) {treatdia();} static void m_editprefs(GtkWidget*w,gpointer data) {prefsdia();} static void m_showstats(GtkWidget*w,gpointer data) {statsdia();} static void m_symmclr(void) {symmr=1; symmm=0; symmd=0; syncsymmmenu();} static void m_symm0(GtkWidget*w,gpointer data) {symmr=(intptr_t)data&0xff;} static void m_symm1(GtkWidget*w,gpointer data) {symmm=(intptr_t)data&0xff;} static void m_symm2(GtkWidget*w,gpointer data) {symmd=(intptr_t)data&0xff;} static void m_ifamode(GtkWidget*w,gpointer data) { ifamode=(intptr_t)data&0xff; if(ifamode==0) gtk_paned_set_position(GTK_PANED(paned),mainw->allocation.width+100); else gtk_paned_set_position(GTK_PANED(paned),mainw->allocation.width-FLISTWIDTH); gridchangen(); } static void m_zoom(GtkWidget*w,gpointer data) {int u; u=(intptr_t)data; if(u==-1) zoomf++; else if(u==-2) zoomf--; else zoomf=u*4; if(zoomf<0) zoomf=0; if(zoomf>16) zoomf=16; pxsq=zoompx[zoomf]; syncgui(); compute(0); } static void m_fileexport(GtkWidget*w,gpointer data) { switch((intptr_t)data) { case 0x401: if(filedia(0,"Export blank grid as EPS",".blank.eps","Encapsulated PostScript",1)) a_exportg(filename,4,0);break; case 0x402: if(filedia(0,"Export blank grid as SVG",".blank.svg","Scalable Vector Graphics",1)) a_exportg(filename,4,1);break; case 0x403: if(filedia(0,"Export blank grid as PNG",".blank.png","Portable Network Graphics",1)) a_exportg(filename,4,2);break; case 0x404: if(gshape[gtype]!=0) break; if(filedia(0,"Export blank grid as HTML",".blank.html","HyperText Markup Language",1)) a_exportgh(0x05,""); break; case 0x411: if(filedia(0,"Export filled grid as EPS",".eps","Encapsulated PostScript",1)) a_exportg(filename,lnis?6:2,0);break; case 0x412: if(filedia(0,"Export filled grid as SVG",".svg","Scalable Vector Graphics",1)) a_exportg(filename,lnis?6:2,1);break; case 0x413: if(filedia(0,"Export filled grid as PNG",".png","Portable Network Graphics",1)) a_exportg(filename,lnis?6:2,2);break; case 0x414: if(gshape[gtype]!=0) break; if(filedia(0,"Export filled grid as HTML",".html","HyperText Markup Language",1)) a_exportgh(lnis?7:3,""); break; case 0x420: if(filedia(0,"Export answers as plain text",".ans.txt","Plain text",1)) a_exporta(0);break; case 0x423: if(filedia(0,"Export answers as HTML",".ans.html","HyperText Markup Language",1)) a_exporta(1);break; case 0x433: if(gshape[gtype]!=0) break; if(filedia(0,"Export puzzle as HTML",".html","HyperText Markup Language",1)) a_exportgh(0x0d,""); break; case 0x434:if(filedia(0,"Export puzzle as HTML+SVG",".html","HyperText Markup Language",1)) a_exporthp(0,4,1);break; case 0x435:if(filedia(0,"Export puzzle as HTML+PNG",".html","HyperText Markup Language",1)) a_exporthp(0,4,2);break; case 0x443: if(gshape[gtype]!=0) break; if(filedia(0,"Export solution as HTML",".html","HyperText Markup Language",1)) a_exportgh(lnis?0x17:0x13,""); break; case 0x444:if(filedia(0,"Export solution as HTML+SVG",".html","HyperText Markup Language",1)) a_exporthp(1,lnis?6:2,1);break; case 0x445:if(filedia(0,"Export solution as HTML+PNG",".html","HyperText Markup Language",1)) a_exporthp(1,lnis?6:2,2);break; case 0x451: if(gshape[gtype]!=0) break; if(filedia(0,"Export as Crossword Compiler XML","-ccw.xml","Crossword Compiler Extensible Markup Language",1)) a_exportccwxml(filename); break; default: assert(0); } } static void selchange(void) {int i,j,d; nsel=0; if (selmode==0) for(i=0;i=100) { if(curdir>=100+nvl) return; if(selmode!=2) m_selnone(w,data); selmode=2; vls[curdir-100].sel=!vls[curdir-100].sel; } else { if(selmode!=1) m_selnone(w,data); selmode=1; sellight(curx,cury,curdir,!issellight(curx,cury,curdir)); } selchange(); } // all lights parallel static void m_sellpar(GtkWidget*w,gpointer data) {int f,i,j; if(curdir>=100) return; if(selmode!=1) m_selnone(w,data); selmode=1; f=issellight(curx,cury,curdir); for(i=0;i0&&gsq[i][j].ents[k][0]!=0) { selcell(i,j,gsq[i][j].ents[k][0]->checking==1); break; } } } selchange(); } static void m_selctreat(GtkWidget*w,gpointer data) {int i,j; if(selmode!=0) m_selnone(w,data); selmode=0; for(i=0;iten); selchange(); } // select violating lights static void m_selviol(GtkWidget*w,gpointer data) {int d,i,j,v; if(selmode!=1) m_selnone(w,data); selmode=1; v=(intptr_t)data; DEB_GU printf("selviol(%d)\n",v); for(i=0;i=100||curdir>=100) refreshsel(); odir=curdir; curmf=1; } static void gridchangen(void) { // change of grid, but without an "undo push" int d,i,j; // only squares at start of lights can have dsel information for(i=0;i0&&treat_lab[treatmode][i]) for(j=0;j0&&treat_lab[treatmode][i]) for(j=0;jflbmh; // get hints bitmap else m=0; // printf("%d %d %16llx\n",x,y,m); if(onebit(m)) gsq[x][y].ctbm[i][j]=m; // could consider removing the onebit() test but potentially confusing? } } refreshsqmg(x,y); } f=0; for(i=0;i0&&treat_lab[treatmode][i]) for(j=0;jflbmh; if(b!=treatcstr[i][j]) treatcstr[i][j]=b,f=1; } } if(f) {okbox("\n Answer treatment \n constraints updated \n");} gridchange(); } static void m_unban(GtkWidget*w,gpointer data) { int i; for(i=0;ibanned=0; gridchange(); } // run filler static void m_autofill(GtkWidget*w,gpointer data) { int mode; if(filler_status==0) return; // already running? mode=(intptr_t)data; // selected mode (1=all, 2=selection) if(mode==2&&selmode!=0) { sel_toc(); selchange(); } createfipdia(); if(compute(mode)) { reperr("Could not start filler"); return; } runfipdia(); DEB_GU printf("stopping filler...\n"); filler_stop(); DEB_GU printf("stopped filler, status=%d\n",filler_status); setposslabel(""); switch(filler_status) { case -4: case -3: reperr("Error generating lists of feasible lights");break; case -2: reperr("Out of stack space");break; case -1: reperr("Out of memory");break; case 1: reperr("No fill found");break; } } // grid edit operations static void editblock (int x,int y,int adv) { symmdo(a_editblock ,0,x,y,0); if(adv&&curdir<100) stepforwmifingrid(&curx,&cury,curdir); gridchange();} static void editempty (int x,int y,int adv) {clrcont(x,y);symmdo(a_editempty ,0,x,y,0); if(adv&&curdir<100) stepforwmifingrid(&curx,&cury,curdir); gridchange();} static void editcutout(int x,int y,int adv) { symmdo(a_editcutout,0,x,y,0); if(adv&&curdir<100) stepforwmifingrid(&curx,&cury,curdir); gridchange();} // called from menu static void m_editblock (GtkWidget*w,gpointer data) {editblock (curx,cury,1);} static void m_editempty (GtkWidget*w,gpointer data) {editempty (curx,cury,1);} static void m_editcutout(GtkWidget*w,gpointer data) {editcutout(curx,cury,1);} // bar behind cursor static void m_editbarb(GtkWidget*w,gpointer data) { if(curdir>=100) return; symmdo(a_editbar,!isbar(curx,cury,curdir+ndir[gtype]),curx,cury,curdir+ndir[gtype]); gridchange(); } // merge/join ahead static void m_editmerge(GtkWidget*w,gpointer data) { if(curdir>=100) return; symmdo(a_editmerge,!ismerge(curx,cury,curdir),curx,cury,curdir); gridchange(); } static void m_insrow(GtkWidget*w,gpointer data) {int i,j,y; y=cury+(intptr_t)data; // now always "insert above" if(height>=MXSZ) return; for(j=height;j>y;j--) for(i=0;i=y) vls[i].y[j]++; height++; if((intptr_t)data==0) {cury++; curmoved();} gridchange(); syncgui(); } static void m_inscol(GtkWidget*w,gpointer data) {int i,j,x; x=curx+(intptr_t)data; // now always "insert to left" if(width>=MXSZ) return; for(i=width;i>x;i--) for(j=0;j=x) vls[i].x[j]++; width++; if((intptr_t)data==0) {curx++; curmoved();} gridchange(); syncgui(); } static void m_delrow(GtkWidget*w,gpointer data) {int bm,i,j,i0,j0; if(height<2) return; if(gtype==1) bm=4; else if(gtype==2) bm=6; else bm=2; if(curycury) vls[i0].y[j0++]=vls[i].y[j]-1; } vls[i0].l=j0; if(j0>0) i0++; // have we lost the free light completely? } nvl=i0; height--; gridchange(); syncgui(); } static void m_delcol(GtkWidget*w,gpointer data) {int bm,i,j,i0,j0; if(width<2) return; if(gtype==1) bm=3; else bm=1; if(curxcurx) vls[i0].x[j0++]=vls[i].x[j]-1; } vls[i0].l=j0; if(j0>0) i0++; // have we lost the free light completely? } nvl=i0; width--; gridchange(); syncgui(); } // flip grid in main diagonal static void m_editflip(GtkWidget*w,gpointer data) {int i,j,k,t;struct square s;struct lprop l;ABM p[MXCT]; if(gshape[gtype]>2) return; for(i=0;i>1); // swap bars around else t=((t&1)<<2)|( t&2 )|((t&4)>>2); gsq[i][j].bars=t; t=gsq[i][j].merge; if(gshape[gtype]==0) t=((t&1)<<1)|((t&2)>>1); // swap merges around else t=((t&1)<<2)|( t&2 )|((t&4)>>2); gsq[i][j].merge=t; t=gsq[i][j].dsel; if(gshape[gtype]==0) t=((t&1)<<1)|((t&2)>>1); // swap directional selects around else t=((t&1)<<2)|( t&2 )|((t&4)>>2); gsq[i][j].dsel=t; k=(gshape[gtype]==0)?1:2; l=gsq[i][j].lp[0];gsq[i][j].lp[0]=gsq[i][j].lp[k];gsq[i][j].lp[k]=l; // if dechecked we want to swap the across and down contents if(getdech(i,j)) { memcpy(p,gsq[i][j].ctbm[0],sizeof(p)); memcpy(gsq[i][j].ctbm[0],gsq[i][j].ctbm[k],sizeof(p)); memcpy(gsq[i][j].ctbm[k],p,sizeof(p)); t=gsq[i][j].ctlen[0]; gsq[i][j].ctlen[0]=gsq[i][j].ctlen[k]; gsq[i][j].ctlen[k]=t; } } for(i=0;i=0 ;i--) u=gsq[i][j],gsq[i][j]=t,t=u;} gridchange(); syncgui(); } static void m_vlnew(GtkWidget*w,gpointer data) { if(nvl>=NVL) {reperr("Limit on number of\nfree lights reached");return;} m_selnone(w,data); selmode=2; vls[nvl].x[0]=curx; vls[nvl].y[0]=cury; vls[nvl].l=1; vls[nvl].sel=1; resetlp(&vls[nvl].lp); nvl++; gridchange(); } static int getselvl() {int i; if(selmode!=2) return -1; if(nsel!=1) return -1; for(i=0;i=MXCL) {reperr("Limit on length of\nfree light reached");return;} vls[i].x[vls[i].l]=curx; vls[i].y[vls[i].l]=cury; vls[i].l++; DEB_GU printf("VL %d l=%d\n",i,vls[i].l); gridchange(); } static void m_vldelete(GtkWidget*w,gpointer data) {int i,j,d; if(selmode!=2) return; d=-1; for(i=0,j=0;i=100) { if(d>=0) curdir=d+100; else curdir=0; } nvl=j; gridchange(); } static void m_vlcurtail(GtkWidget*w,gpointer data) {int i; i=getselvl(); if(i==-1) return; if(vls[i].l<2) {m_vldelete(w,data);return;} vls[i].l--; DEB_GU printf("VL %d l=%d\n",i,vls[i].l); gridchange(); } static void m_vlmodify(GtkWidget*w,gpointer data) {int i; i=getselvl(); if(i==-1) return; mvldia(i); } static void m_helpabout(GtkWidget*w,gpointer data) {char s[4000]; sprintf(s, "Qxw release %s\n\n" "Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant\n" "\n" "This program is free software; you can redistribute it and/or modify " "it under the terms of version 2 of the GNU General Public License as " "published by the Free Software Foundation.\n" "\n" "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.\n" "\n" "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., " "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" "\n" "Visit http://www.quinapalus.com/ for more information and to download " "the PDF manual.\n" "\n" "Please e-mail qxw@quinapalus.com with bug reports and suggestions." ,RELEASE); okbox(s);} static int w_destroy(void) {gtk_main_quit();return 0;} static int w_delete(void) {return !(!unsaved||areyousure("quit"));} static void moveleft(int*x,int*y) { switch(gtype) { case 0:case 1:case 2:case 6:case 8:(*x)--;break; case 7:case 10:case 12: if(*x==0) *y=height-1-*y; // fall through case 3:case 4:case 5:case 9:case 11: *x=(*x+width-1)%width; break; } } static void moveright(int*x,int*y) { switch(gtype) { case 0:case 1:case 2:case 6:case 8:(*x)++;break; case 7:case 10:case 12: if(*x==width-1) *y=height-1-*y; // fall through case 3:case 4:case 5:case 9:case 11: *x=(*x+1)%width; break; } } static void moveup(int*x,int*y) { switch(gtype) { case 0:case 1:case 2:case 3:case 4:case 5:case 7:(*y)--;break; case 8:case 11:case 12: if(*y==0) *x=width-1-*x; // fall through case 6:case 9:case 10: *y=(*y+height-1)%height; break; } } static void movedown(int*x,int*y) { switch(gtype) { case 0:case 1:case 2:case 3:case 4:case 5:case 7:(*y)++;break; case 8:case 11:case 12: if(*y==height-1) *x=width-1-*x; // fall through case 6:case 9:case 10: *y=(*y+1)%height; break; } } static void movehome(int*x,int*y) {int l,lx[MXCL],ly[MXCL]; l=getlight(lx,ly,*x,*y,curdir); if(l<1) return; *x=lx[0];*y=ly[0]; } static void moveend(int*x,int*y) {int l,lx[MXCL],ly[MXCL]; l=getlight(lx,ly,*x,*y,curdir); if(l<1) return; *x=lx[l-1];*y=ly[l-1]; } static void nextdir() { int m; if(ismux(curx,cury,curdir)) { m=getmaxmux(curx,cury,curdir); if(m>1) { curmux++; if(curmux=100+nvl) curdir=0; if(curdir1) { curmux--; if(curmux>=m) {curmux=m-1; return;} if(curmux>=0) return; } } do{ curdir--; curmux=0; if(curdir<0) curdir=100+nvl-1; if(curdir==99) curdir=ndir[gtype]-1; if(ismux(curx,cury,curdir)) { m=getmaxmux(curx,cury,curdir); if(m>1) curmux=m-1; } if(curdir=100) curdir=0; x=curx;y=cury;moveleft (&x,&y);if(isingrid(x,y)) curx=x,cury=y;} static void curright() {int x,y; if(curdir>=100) curdir=0; x=curx;y=cury;moveright(&x,&y);if(isingrid(x,y)) curx=x,cury=y;} static void curup () {int x,y; if(curdir>=100) curdir=0; x=curx;y=cury;moveup (&x,&y);if(isingrid(x,y)) curx=x,cury=y;} static void curdown () {int x,y; if(curdir>=100) curdir=0; x=curx;y=cury;movedown (&x,&y);if(isingrid(x,y)) curx=x,cury=y;} // process keyboard static int keypress(GtkWidget *widget, GdkEventKey *event) { int k,x,y; uchar uc; k=event->keyval; uc=gdk_keyval_to_unicode(k); if(tryuchar(uc)) goto done; if(tryuchar(TOUUPPER(uc))) goto done; if(tryuchar(TOULOWER(uc))) goto done; if((event->state&12)!=0) return 0; // don't handle anything with CTRL or ALT modifiers if(k==' ' ) {if(curdir<100) stepforwmifingrid(&curx,&cury,curdir);} else if(k==GDK_Tab ) {clrcont(curx,cury); refreshsqmg(curx,cury);refreshnum(); stepforwmifingrid(&curx,&cury,curdir); undo_push();} else if(k==GDK_ISO_Left_Tab ) {if(stepbackmifingrid(&curx,&cury,curdir)) {clrcont(curx,cury); refreshsqmg(curx,cury);refreshnum(); undo_push();}} else if(k==GDK_Left ) curleft (); else if(k==GDK_Right ) curright(); else if(k==GDK_Up ) curup (); else if(k==GDK_Down ) curdown (); else if(k==GDK_Home ) {x=curx;y=cury;movehome (&x,&y);if(isingrid(x,y)) curx=x,cury=y;} else if(k==GDK_End ) {x=curx;y=cury;moveend (&x,&y);if(isingrid(x,y)) curx=x,cury=y;} else if((k==GDK_Page_Up )) {prevdir();} else if((k==GDK_Page_Down||k=='/')) {nextdir();} else if(k=='.' ) {editempty (curx,cury,1);} else if(k==',' ) {editblock (curx,cury,1);} else if(k==GDK_BackSpace ) {if(curdir<100) stepbackifingrid(&curx,&cury,curdir);} else return 0; done: curmoved(); compute(0); return 1; } // convert screen coords to internal square coords; k is bitmap of sufficiently nearby edges static void ptrtosq(int*x,int*y,int*k,int x0,int y0) {double u,v,u0,v0,r=0,t=0,xa=0,ya=0,xb=0,yb=0;int i,j; u0=((double)x0-bawdpx)/pxsq;v0=((double)y0-bawdpx)/pxsq; *k=0; switch(gshape[gtype]) { case 0: i=(int)floor(u0);u=u0-i; j=(int)floor(v0);v=v0-j; *x=i;*y=j; break; case 1: i=(int)floor(u0/1.2);u=u0-i*1.2; if((i&1)==0) { j=(int)floor(v0/1.4);v=v0-j*1.4; if(u>=0.4) {*x=i;*y=j;break;} if( 0.7*u+0.4*v<0.28) {*x=i-1;*y=j-1;break;} if(-0.7*u+0.4*v>0.28) {*x=i-1;*y=j; break;} *x=i;*y=j;break; } else { j=(int)floor((v0-0.7)/1.4);v=v0-0.7-j*1.4; if(u>=0.4) {*x=i;*y=j;break;} if( 0.7*u+0.4*v<0.28) {*x=i-1;*y=j; break;} if(-0.7*u+0.4*v>0.28) {*x=i-1;*y=j+1;break;} *x=i;*y=j;break; } case 2: j=(int)floor(v0/1.2);v=v0-j*1.2; if((j&1)==0) { i=(int)floor(u0/1.4);u=u0-i*1.4; if(v>=0.4) {*y=j;*x=i;break;} if( 0.7*v+0.4*u<0.28) {*y=j-1;*x=i-1;break;} if(-0.7*v+0.4*u>0.28) {*y=j-1;*x=i; break;} *y=j;*x=i;break; } else { i=(int)floor((u0-0.7)/1.4);u=u0-0.7-i*1.4; if(v>=0.4) {*y=j;*x=i;break;} if( 0.7*v+0.4*u<0.28) {*y=j-1;*x=i; break;} if(-0.7*v+0.4*u>0.28) {*y=j-1;*x=i+1;break;} *y=j;*x=i;break; } case 3:case 4: u=u0-height;v=v0-height; r=sqrt(u*u+v*v); if(r<1e-3) {*x=-1;*y=-1;return;} r=height-r; t=atan2(u,-v)*width/2/PI; if(gtype==4) t+=.5; if(t<0) t+=width; *x=(int)floor(t); *y=(int)floor(r); break; } switch(gshape[gtype]) { // click-near-edge bitmap case 0:case 1:case 2: for(i=0;i1-PXEDGE ) *k|=2; if(r-*y< PXEDGE ) *k|=8; r=height-r; if(t-*x>1-PXEDGE/((r<2)?1:(r-1))) *k|=1; if(t-*x< PXEDGE/((r<2)?1:(r-1))) *k|=4; break; } } int dragflag=-1; // store selectedness state of square where shift-drag starts, or -1 if none in progress static void mousel(int x,int y) { // left button if(selmode!=0) m_selnone(0,0); selmode=0; if(dragflag==-1) dragflag=gsq[x][y].fl&16; // set f if at beginning of shift-drag if((gsq[x][y].fl&16)==dragflag) { selcell(x,y,!dragflag); selchange(); } } static void mouser(int x,int y) { // right button if(curdir>=100) return; if(selmode!=1) m_selnone(0,0); selmode=1; if(dragflag==-1) dragflag=issellight(x,y,curdir); if(issellight(x,y,curdir)==dragflag) { sellight(x,y,curdir,!dragflag); selchange(); } } // pointer motion static gint mousemove(GtkWidget*widget,GdkEventMotion*event) { int e,k,x,y; ptrtosq(&x,&y,&e,(int)floor(event->x+.5),(int)floor(event->y)); k=(int)(event->state); // buttons and modifiers // DEB_RF printf("mouse move event (%d,%d) %d e=%02x\n",x,y,k,e); if(!isingrid(x,y)) return 0; if((k&GDK_SHIFT_MASK)==0) {dragflag=-1;return 0;} // shift not held down: reset f if (k&GDK_BUTTON3_MASK) mouser(x,y); else if(k&GDK_BUTTON1_MASK) mousel(x,y); else dragflag=-1; // button not held down: reset dragflag return 0; } // click in grid area static gint button_press_event(GtkWidget*widget,GdkEventButton*event) { int b,e,ee,k,x,y; ptrtosq(&x,&y,&e,(int)floor(event->x+.5),(int)floor(event->y)); k=event->state; DEB_RF printf("button press event (%f,%f) -> (%d,%d) e=%02x button=%08x type=%08x state=%08x\n",event->x,event->y,x,y,e,(int)event->button,(int)event->type,k); if(event->type==GDK_BUTTON_RELEASE) dragflag=-1; if(event->type!=GDK_BUTTON_PRESS) goto ew0; if(k&GDK_SHIFT_MASK) { if (event->button==3) mouser(x,y); else if(event->button==1) mousel(x,y); return 0; } if(event->button!=1) goto ew0; // only left clicks do anything now if(!isingrid(x,y)) goto ew0; ee=!!(e&(e-1)); // more than one bit set in e? if(clickblock&&ee) { // flip between block and space when a square is clicked near a corner if((gsq[x][y].fl&1)==0) {editblock(x,y,0);goto ew1;} else {editempty(x,y,0);goto ew1;} } else if(clickbar&&e&&!ee) { // flip bar if clicked in middle of edge b=logbase2(e); DEB_RF printf(" x=%d y=%d e=%d b=%d isbar(x,y,b)=%d\n",x,y,e,b,isbar(x,y,b)); symmdo(a_editbar,!isbar(x,y,b),x,y,b); gridchange(); goto ew1; } if(x==curx&&y==cury) nextdir(); // flip direction for click in square of cursor else { curx=x; cury=y; // not trapped as producing bar or block, so move cursor if(curdir>=100) curdir=0; } curmoved(); gridchangen(); ew1: gtk_window_set_focus(GTK_WINDOW(mainw),grid_da); ew0: DEB_RF printf("Exiting button_press_event()\n"); return FALSE; } // scroll static gint mousescroll(GtkWidget*widget,GdkEventScroll*event) { int d,k; k=(int)(event->state); // buttons and modifiers d=event->direction; if(k&GDK_CONTROL_MASK) { // control held down if(d==GDK_SCROLL_UP ) m_zoom(0,(void*)-1); if(d==GDK_SCROLL_DOWN ) m_zoom(0,(void*)-2); } return 0; } // word list entry selected static int selrow(GtkWidget*widget,gint row,gint column, GdkEventButton*event,gpointer data) { int i,l,l0,lx[MXCL],ly[MXCL],nc; ABM*abmp[MXLE]; DEB_RF printf("row select event\n"); if(llistem&EM_JUM) return 1; // don't allow click-to-enter for jumbles l=getlight(lx,ly,curx,cury,curdir); if(l<2) return 1; nc=getlightbmp(abmp,curx,cury,curdir,curmux); if(nc<2) return 1; if(!llistp) return 1; if(row<0||row>=llistn) return 1; if(llistp[row]>=ltotal) return 1; // light building has not caught up yet, so ignore click l0=strlen(lts[llistp[row]].s); if(lts[llistp[row]].tagged) l0-=NMSG; if(l0!=nc) return 1; for(i=0;i=0&&ubanned=1; gridchange(); gtk_window_set_focus(GTK_WINDOW(mainw),grid_da); return 1; } static int copyword(GtkWidget*menuitem,gpointer data) { int u; u=(int)(intptr_t)data; if(u>=0&&ucf,-1); gtk_window_set_focus(GTK_WINDOW(mainw),grid_da); return 1; } static int lookupword(GtkWidget*menuitem,gpointer data) { char*p=(char*)data; DEB_GU printf("Lookup %s\n",p); if(!STRSTARTS(p,"http://")&&!STRSTARTS(p,"https://")) { reperr("Only http:// and https:// URIs can be opened.\nPlease check your Preferences settings."); return 1; } #ifdef _WIN32 { wchar_t sw[SLEN]; MultiByteToWideChar(CP_UTF8, 0, p, -1, sw, SLEN); ShellExecuteW(0,L"open",sw,0,0,SW_SHOWNORMAL); } #else gtk_show_uri(NULL,p,GDK_CURRENT_TIME,NULL); #endif gtk_window_set_focus(GTK_WINDOW(mainw),grid_da); gdk_window_set_cursor(mainw->window,NULL); return 1; } static int clist_button(GtkWidget*widget,GdkEventButton*event,gpointer data) { int row,col,i,j,k; char s[SLEN*3],*p,*t; GtkWidget*menu,*mi,*mi0[NLOOKUP]; // printf("clist_button(%d) x=%f y=%f\n",(int)(intptr_t)data,event->x,event->y); if(event->button!=3) return 0; if(gtk_clist_get_selection_info(GTK_CLIST(clist),(int)floor(event->x+.5),(int)floor(event->y),&row,&col)==0) return 1; // printf(" row=%d col=%d\n",row,col); if(!llistp) return 1; if(row<0||row>=llistn) return 1; if(llistp[row]>=ltotal) return 1; // light building has not caught up yet, so ignore click // printf("llistp[row]=%d\n",llistp[row]); // printf("lts[llistp[row]].ans=%d ansp[a].cf=<%s>\n",lts[llistp[row]].ans,ansp[lts[llistp[row]].ans]->cf); menu=gtk_menu_new(); sprintf(s,"Ban \"%s\"",ansp[lts[llistp[row]].ans]->cf); mi=gtk_menu_item_new_with_label(s); g_signal_connect(mi,"activate",GTK_SIGNAL_FUNC(banword),(gpointer)(intptr_t)lts[llistp[row]].ans); gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi); mi=gtk_menu_item_new_with_label("Copy"); g_signal_connect(mi,"activate",GTK_SIGNAL_FUNC(copyword),(gpointer)(intptr_t)lts[llistp[row]].ans); gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi); t=ansp[lts[llistp[row]].ans]->cf; if(t&&strlen(t)SLEN*3-10) goto skip; // each byte could become %XX for(p=t;*p;p++) if(isalnum((unsigned char)*p)) lookupuri[i][k++]=*p; else sprintf(lookupuri[i]+k,"%%%02X",(unsigned char)*p),k+=3; continue; } } lookupuri[i][k++]=lookup(i)[j++]; if(k>=SLEN*3-1) break; } lookupuri[i][k]=0; DEB_GU printf("lookupuri[%d]=%s\n",i,lookupuri[i]); g_signal_connect(mi0[i],"activate",GTK_SIGNAL_FUNC(lookupword),lookupuri[i]); gtk_menu_shell_append(GTK_MENU_SHELL(menu),mi0[i]); skip: ; } } gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,event->button,gdk_event_get_time((GdkEvent*)event)); return 1; } // grid update static gint configure_event(GtkWidget*widget,GdkEventConfigure*event) { DEB_RF printf("config event: new w=%d h=%d\n",widget->allocation.width,widget->allocation.height); return 1; } // redraw the grid area static gint expose_event(GtkWidget*widget,GdkEventExpose*event) {double u,v; cairo_t*cr; DEB_RF printf("expose event x=%d y=%d w=%d h=%d\n",event->area.x,event->area.y,event->area.width,event->area.height),fflush(stdout); if(widget==grid_da) { cr=gdk_cairo_create(widget->window); cairo_rectangle(cr,event->area.x,event->area.y,event->area.width,event->area.height); cairo_clip(cr); repaint(cr); cairo_destroy(cr); if(curmf) { mgcentre(&u,&v,curx,cury,0,1); DEB_RF printf("curmoved: %f %f %d %d\n",u,v,pxsq,bawdpx); gtk_adjustment_clamp_page(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(grid_sw)),(u-.5)*pxsq+bawdpx-3,(u+.5)*pxsq+bawdpx+3); // scroll window to follow cursor gtk_adjustment_clamp_page(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(grid_sw)),(v-.5)*pxsq+bawdpx-3,(v+.5)*pxsq+bawdpx+3); curmf=0; } } return FALSE; } void invaldarect(int x0,int y0,int x1,int y1) {GdkRectangle r; if(!usegui) return; r.x=x0; r.y=y0; r.width=x1-x0; r.height=y1-y0; DEB_RF printf("invalidate(%d,%d - %d,%d)\n",x0,y0,x1,y1); gdk_window_invalidate_rect(grid_da->window,&r,0); } void invaldaall() { DEB_RF printf("invalidate all\n"); if(!usegui) return; gdk_window_invalidate_rect(grid_da->window,0,0); } // GTK DIALOGUES // general filename dialogue: button text in but, default file extension in ext // result copied to res if non-NULL, "filename" otherwise static int filedia(char*res,char*but,char*ext,char*filetype,int write) { GtkWidget*dia; int i; char*p,t[SLEN+50]; GtkFileFilter*filt0,*filt1; if(!res) res=filename; filt0=gtk_file_filter_new(); if(!filt0) return 0; gtk_file_filter_add_pattern(filt0,"*"); gtk_file_filter_set_name(filt0,"All files"); filt1=gtk_file_filter_new(); if(!filt1) return 0; strcpy(t,"*"); strcat(t,strrchr(ext,'.')); // printf("<%s>\n",t); gtk_file_filter_add_pattern(filt1,t); for(i=1;t[i];i++) t[i]=toupper(t[i]); // printf("<%s>\n",t); gtk_file_filter_add_pattern(filt1,t); strcpy(t,filetype); strcat(t," files"); gtk_file_filter_set_name(filt1,t); dia=gtk_file_chooser_dialog_new(but,0, write?GTK_FILE_CHOOSER_ACTION_SAVE:GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dia),filt1); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dia),filt0); if(strcmp(filenamebase,"")) strcpy(res,filenamebase); else strcpy(res,"untitled"); strcat(res,ext); strcpy(t,res); if(write) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dia),t); ew0: i=gtk_dialog_run(GTK_DIALOG(dia)); i=i==GTK_RESPONSE_OK; if(i) { p=gtk_file_chooser_get_filename((GtkFileChooser*)dia); if(strlen(p)>SLEN) {reperr("Filename too long");goto ew0;} strcpy(res,p); } else strcpy(res,""); gtk_widget_destroy(dia); return i; // return 1 if got name successfully (although may be empty string) } // cell contents dialogue static int ccontdia() { GtkWidget*dia,*vb,*l0,*m[MAXNDIR],*lm[MAXNDIR],*e[MAXNDIR]; int i,u,x,y; char s[100],t[MXCT*(MAXICC*16+4)]; x=curx; y=cury; getmergerep(&x,&y,x,y); if(!isclear(x,y)) {reperr("Please place the cursor on a cell\nthat can contain characters");return 1;} dia=gtk_dialog_new_with_buttons("Cell contents", GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL); gtk_dialog_set_default_response(GTK_DIALOG(dia),GTK_RESPONSE_OK); vb=gtk_vbox_new(0,2); // box to hold everything gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),vb,TRUE,TRUE,0); u=getdech(x,y); if(u) { l0=gtk_label_new("Contribution from cell"); gtk_misc_set_alignment(GTK_MISC(l0),0,0.5); gtk_box_pack_start(GTK_BOX(vb),l0,TRUE,TRUE,0); } for(i=0;iMXLE) { reperr("Light is too long"); return 1; } t[0]=0; for(i=0,p=t;ivbox),vb,TRUE,TRUE,0); m=gtk_hbox_new(0,2); lm=gtk_label_new("Contents of light: "); gtk_box_pack_start(GTK_BOX(m),lm,FALSE,FALSE,5); e=gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(e),60); gtk_entry_set_max_length(GTK_ENTRY(e),sizeof(t)); gtk_entry_set_text(GTK_ENTRY(e),t); gtk_box_pack_start(GTK_BOX(m),e,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vb),m,TRUE,TRUE,0); gtk_window_set_focus(GTK_WINDOW(dia),e); gtk_entry_set_activates_default(GTK_ENTRY(e),1); l0=gtk_label_new("(use '.' or enter a pattern for any characters yet to be filled)"); gtk_box_pack_start(GTK_BOX(vb),l0,TRUE,TRUE,0); gtk_widget_show_all(dia); i=gtk_dialog_run(GTK_DIALOG(dia)); if(i==GTK_RESPONSE_OK) { u=strtoabms(b,nc,(char*)gtk_entry_get_text(GTK_ENTRY(e)),0); for(i=u;i", "", "", "", "", ""}; // static char*fmt_e[6]={"","","","","",""}; // // // static int applyformat(GtkWidget*w,void*data) { // int f,u; // GtkTextIter fi,ti; // f=(intptr_t)data; // if(!gtk_text_buffer_get_selection_bounds(GTK_TEXT_BUFFER(wctb),&fi,&ti)) return 1; // u=gtk_text_iter_has_tag(&fi,wctag[f]); // if(f==2||f==3) { // gtk_text_buffer_remove_tag(GTK_TEXT_BUFFER(wctb),wctag[2],&fi,&ti); // gtk_text_buffer_remove_tag(GTK_TEXT_BUFFER(wctb),wctag[3],&fi,&ti); // } // if(!u) gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER(wctb),wctag[f],&fi,&ti); // else gtk_text_buffer_remove_tag(GTK_TEXT_BUFFER(wctb),wctag[f],&fi,&ti); // return 1; // } // // static GtkWidget*wcdia; // // static int fmt_key(GtkWidget*widget,GdkEventKey*event) { // if(event->keyval==GDK_Return||event->keyval==GDK_KP_Enter) { // g_signal_emit_by_name(G_OBJECT(wcdia),"response",GTK_RESPONSE_OK); // return 1; // } // if((event->state&GDK_CONTROL_MASK)&&event->keyval==GDK_b) {applyformat(0,(void*)0); return 1;} // if((event->state&GDK_CONTROL_MASK)&&event->keyval==GDK_i) {applyformat(0,(void*)1); return 1;} // if((event->state&GDK_CONTROL_MASK)&&event->keyval==GDK_s) {applyformat(0,(void*)4); return 1;} // if((event->state&GDK_CONTROL_MASK)&&event->keyval==GDK_u) {applyformat(0,(void*)5); return 1;} // return 0; // } // // // write clue dialogue // static int writecluedia() { // GtkWidget*l0,*vb,*hb; // GtkWidget*fmt[6]; // GtkWidget*tv; // GtkTextIter ti; // char s[MXLE*16+1]; // int i,l; // uchar u; // // l=getwordutf8(curx,cury,curdir,s,curmux); // if(l<2) {reperr("Please point the cursor along a light");return 1;} // // wcdia=gtk_dialog_new_with_buttons("Write clue", // GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT, // GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL); // gtk_dialog_set_default_response(GTK_DIALOG(wcdia),GTK_RESPONSE_OK); // vb=gtk_vbox_new(0,2); // box to hold everything // gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wcdia)->vbox),vb,TRUE,TRUE,0); // hb=gtk_hbox_new(FALSE,0); // l0=gtk_label_new("Light:"); gtk_box_pack_start(GTK_BOX(hb),l0,FALSE,FALSE,2); // l0=gtk_label_new(s); gtk_box_pack_start(GTK_BOX(hb),l0,TRUE,TRUE,2); // gtk_misc_set_alignment(GTK_MISC(l0),0,0); // gtk_box_pack_start(GTK_BOX(vb),hb,TRUE,TRUE,0); // // tv=gtk_text_view_new(); // wctb=(GtkWidget*)gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv)); // gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(tv),3); // gtk_text_view_set_pixels_below_lines(GTK_TEXT_VIEW(tv),3); // gtk_text_view_set_left_margin(GTK_TEXT_VIEW(tv),3); // gtk_text_view_set_right_margin(GTK_TEXT_VIEW(tv),3); // gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tv),GTK_WRAP_WORD_CHAR); // gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(tv),0); // gtk_signal_connect(GTK_OBJECT(tv),"key_press_event",GTK_SIGNAL_FUNC(fmt_key),NULL); // // hb=gtk_hbox_new(FALSE,0); // for(i=0;i<6;i++) { // fmt[i]=gtk_button_new_with_label(fmtname[i]); gtk_box_pack_start(GTK_BOX(hb),fmt[i],TRUE,TRUE,0); // gtk_signal_connect(GTK_OBJECT(fmt[i]),"clicked",GTK_SIGNAL_FUNC(applyformat),(gpointer)(intptr_t)i); // wctag[i]=gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(wctb),fmtname[i],fmtprops[i],fmtvals[i],0); // } // gtk_box_pack_start(GTK_BOX(vb),hb,FALSE,FALSE,0); // // gtk_box_pack_start(GTK_BOX(vb),tv,TRUE,TRUE,0); // // gtk_widget_show_all(wcdia); // gtk_window_set_focus(GTK_WINDOW(wcdia),tv); // i=gtk_dialog_run(GTK_DIALOG(wcdia)); // if(i==GTK_RESPONSE_OK) { // gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(wctb),&ti); // for(;;) { // u=gtk_text_iter_get_char(&ti); // // for(i=0;i<6;i++) printf("%d %d; ",gtk_text_iter_begins_tag(&ti,wctag[i]),gtk_text_iter_ends_tag(&ti,wctag[i])); printf("%08x\n",u); // for(i=0;i<6;i++) if(gtk_text_iter_ends_tag(&ti,wctag[i])) printf("%s",fmt_e[i]); // for(i=0;i<6;i++) if(gtk_text_iter_begins_tag(&ti,wctag[i])) printf("%s",fmt_b[i]); // if(!u) break; // gtk_text_iter_forward_char(&ti); // } // printf("\n"); // // gridchange(); //? // } // gtk_widget_destroy(wcdia); // return 1; // } // square properties dialogue static GtkWidget*sprop_cbg,*sprop_cfg,*sprop_cmk,*sprop_l0,*sprop_l1,*sprop_l2,*sprop_l3,*sprop_l4,*sprop_tr,*sprop_w20,*sprop_w21,*sprop_or; static GtkWidget*sprop_mkl[MAXNDIR*2],*sprop_mke[MAXNDIR*2]; static int sprop_g; int sprop_setactive() {int i,k; k=sprop_g||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sprop_or)); gtk_widget_set_sensitive(sprop_cbg,k); gtk_widget_set_sensitive(sprop_cfg,k); gtk_widget_set_sensitive(sprop_cmk,k); gtk_widget_set_sensitive(sprop_l0,k); gtk_widget_set_sensitive(sprop_l1,k); gtk_widget_set_sensitive(sprop_l2,k); gtk_widget_set_sensitive(sprop_l3,k); gtk_widget_set_sensitive(sprop_l4,k); gtk_widget_set_sensitive(sprop_w20,k); gtk_widget_set_sensitive(sprop_tr,k); gtk_widget_set_sensitive(sprop_w21,k); for(i=0;ibgcol; gcbg.red =((i>>16)&255)*257; gcbg.green=((i>> 8)&255)*257; gcbg.blue =((i )&255)*257; i=sps[0]->fgcol; gcfg.red =((i>>16)&255)*257; gcfg.green=((i>> 8)&255)*257; gcfg.blue =((i )&255)*257; i=sps[0]->mkcol; gcmk.red =((i>>16)&255)*257; gcmk.green=((i>> 8)&255)*257; gcmk.blue =((i )&255)*257; dia=gtk_dialog_new_with_buttons(g?"Default cell properties":"Selected cell properties", GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_APPLY,GTK_RESPONSE_OK,NULL); vb=gtk_vbox_new(0,2); // box to hold everything gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),vb,TRUE,TRUE,0); if(!g) { sprop_or=gtk_check_button_new_with_mnemonic("_Override default cell properties"); gtk_box_pack_start(GTK_BOX(vb),sprop_or,TRUE,TRUE,0); gtk_signal_connect(GTK_OBJECT(sprop_or),"clicked",GTK_SIGNAL_FUNC(sprop_setactive),0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); } w=gtk_hbox_new(0,2); sprop_l0=gtk_label_new("Background colour: "); gtk_label_set_width_chars(GTK_LABEL(sprop_l0),18); gtk_misc_set_alignment(GTK_MISC(sprop_l0),1,0.5); gtk_box_pack_start(GTK_BOX(w),sprop_l0,FALSE,FALSE,0); sprop_cbg=gtk_color_button_new_with_color(&gcbg); gtk_box_pack_start(GTK_BOX(w),sprop_cbg,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); w=gtk_hbox_new(0,2); sprop_l1=gtk_label_new("Foreground colour: "); gtk_label_set_width_chars(GTK_LABEL(sprop_l1),18); gtk_misc_set_alignment(GTK_MISC(sprop_l1),1,0.5); gtk_box_pack_start(GTK_BOX(w),sprop_l1,FALSE,FALSE,0); sprop_cfg=gtk_color_button_new_with_color(&gcfg); gtk_box_pack_start(GTK_BOX(w),sprop_cfg,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); w=gtk_hbox_new(0,2); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); sprop_l2=gtk_label_new("Font style: "); gtk_box_pack_start(GTK_BOX(w),sprop_l2,FALSE,FALSE,0); gtk_label_set_width_chars(GTK_LABEL(sprop_l2),18); gtk_misc_set_alignment(GTK_MISC(sprop_l2),1,0.5); sprop_w20=gtk_combo_box_new_text(); gtk_box_pack_start(GTK_BOX(w),sprop_w20,FALSE,FALSE,0); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w20),"Normal"); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w20),"Bold"); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w20),"Italic"); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w20),"Bold italic"); i=sps[0]->fstyle; if(i<0) i=0; if(i>3) i=3; gtk_combo_box_set_active(GTK_COMBO_BOX(sprop_w20),i); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); w=gtk_hbox_new(0,2); sprop_l4=gtk_label_new("Mark colour: "); gtk_label_set_width_chars(GTK_LABEL(sprop_l4),18); gtk_misc_set_alignment(GTK_MISC(sprop_l4),1,0.5); gtk_box_pack_start(GTK_BOX(w),sprop_l4,FALSE,FALSE,0); sprop_cmk=gtk_color_button_new_with_color(&gcmk); gtk_box_pack_start(GTK_BOX(w),sprop_cmk,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); for(i=0;i<2;i++) { w=gtk_hbox_new(0,2); for(j=0;jmk[d]); gtk_box_pack_start(GTK_BOX(w),sprop_mke[d],FALSE,FALSE,0); } gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); } w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); sprop_tr=gtk_check_button_new_with_mnemonic("_Flag for answer treatment"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sprop_tr),sps[0]->ten); gtk_box_pack_start(GTK_BOX(vb),sprop_tr,TRUE,TRUE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); w=gtk_hbox_new(0,2); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); sprop_l3=gtk_label_new("Lights intersecting here "); gtk_box_pack_start(GTK_BOX(w),sprop_l3,FALSE,FALSE,0); gtk_misc_set_alignment(GTK_MISC(sprop_l3),1,0.5); sprop_w21=gtk_combo_box_new_text(); gtk_box_pack_start(GTK_BOX(w),sprop_w21,FALSE,FALSE,0); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w21),"must agree"); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w21),"need not agree: horizontal display"); gtk_combo_box_append_text(GTK_COMBO_BOX(sprop_w21),"need not agree: vertical display"); i=sps[0]->dech; if(i<0) i=0; if(i>2) i=2; gtk_combo_box_set_active(GTK_COMBO_BOX(sprop_w21),i); if(!g) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sprop_or),(sps[0]->spor)&1); sprop_setactive(); gtk_widget_show_all(dia); i=gtk_dialog_run(GTK_DIALOG(dia)); if(i==GTK_RESPONSE_OK) { gtk_color_button_get_color(GTK_COLOR_BUTTON(sprop_cbg),&gcbg); gtk_color_button_get_color(GTK_COLOR_BUTTON(sprop_cfg),&gcfg); gtk_color_button_get_color(GTK_COLOR_BUTTON(sprop_cmk),&gcmk); for(j=0;jspor=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sprop_or)); sps[j]->bgcol= (((gcbg.red >>8)&255)<<16)+ (((gcbg.green>>8)&255)<< 8)+ (((gcbg.blue >>8)&255) ); sps[j]->fgcol= (((gcfg.red >>8)&255)<<16)+ (((gcfg.green>>8)&255)<< 8)+ (((gcfg.blue >>8)&255) ); sps[j]->mkcol= (((gcmk.red >>8)&255)<<16)+ (((gcmk.green>>8)&255)<< 8)+ (((gcmk.blue >>8)&255) ); i=gtk_combo_box_get_active(GTK_COMBO_BOX(sprop_w20)); if(i>=0&&i<4) sps[j]->fstyle=i; sps[j]->ten=!!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sprop_tr)); i=gtk_combo_box_get_active(GTK_COMBO_BOX(sprop_w21)); if(i>=0&&i<3) sps[j]->dech=i; for(d=0;dmk[d],gtk_entry_get_text(GTK_ENTRY(sprop_mke[d])),MXMK); sps[j]->mk[d][MXMK]=0; } } gridchange(); } gtk_widget_destroy(dia); refreshall(); return 1; } // get version of dictionary d filename up to l characters static void getdfname(char*s,int d,int l) { if(strlen(dfnames[d])==0) { if(strlen(dafilters[d])==0) strcat(s,""); else { strcat(s,"\""); if((int)strlen(dafilters[d])>l) {strncat(s,dafilters[d],l-3); strcat(s,"...");} else strcat(s,dafilters[d]); strcat(s,"\""); } } else { if((int)strlen(dfnames[d])>l) {strcat(s,"...");strcat(s,dfnames[d]+strlen(dfnames[d])-l+3);} else strcat(s,dfnames[d]); } } // light properties dialogue static GtkWidget*lprop_e[MAXNDICTS],*lprop_f[NLEM],*lprop_or,*lprop_tr,*lprop_nn,*lprop_mux; static int lprop_g; static int lprop_setactive() {int i,k; k=lprop_g||gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lprop_or)); for(i=0;ivbox),vb,TRUE,TRUE,0); if(!g) { lprop_or=gtk_check_button_new_with_mnemonic("_Override default light properties"); gtk_box_pack_start(GTK_BOX(vb),lprop_or,TRUE,TRUE,0); gtk_signal_connect(GTK_OBJECT(lprop_or),"clicked",GTK_SIGNAL_FUNC(lprop_setactive),0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); } for(i=0;idmask)>>i)&1); gtk_box_pack_start(GTK_BOX(vb),lprop_e[i],TRUE,TRUE,0); } w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); lprop_tr=gtk_check_button_new_with_mnemonic("_Enable answer treatment"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lprop_tr),lps[0]->ten); gtk_box_pack_start(GTK_BOX(vb),lprop_tr,TRUE,TRUE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); for(i=0;iemask)>>i)&1); gtk_box_pack_start(GTK_BOX(vb),lprop_f[i],TRUE,TRUE,0); } w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); lprop_nn=gtk_check_button_new_with_mnemonic("Light _does not receive a number"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lprop_nn),lps[0]->dnran); gtk_box_pack_start(GTK_BOX(vb),lprop_nn,TRUE,TRUE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); lprop_mux=gtk_check_button_new_with_mnemonic("_Multiplex"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lprop_mux),lps[0]->mux); gtk_box_pack_start(GTK_BOX(vb),lprop_mux,TRUE,TRUE,0); if(!g) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lprop_or),(lps[0]->lpor)&1); lprop_setactive(); gtk_widget_show_all(dia); i=gtk_dialog_run(GTK_DIALOG(dia)); if(i==GTK_RESPONSE_OK) { for(j=0;jlpor=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lprop_or)); lps[j]->dmask=0; for(i=0;idmask|=1<emask=0; for(i=0;iemask|=1<ten=!!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lprop_tr)); lps[j]->dnran=!!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lprop_nn)); lps[j]->mux=!!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lprop_mux)); if(lps[j]->emask==0) { reperr("No entry methods selected:\nthis would make fill impossible.\nAllowing lights to be entered normally."); lps[j]->emask=EM_FWD; } } gridchange(); } gtk_widget_destroy(dia); return 1; } // treatment dialogue static GtkWidget*treat_a[NMSG],*treat_f,*treat_c,*treat_m[NMSG],*treat_lm[NMSG],*treat_bpiname,*treat_b1[NMSG],*treat_b2[NMSG],*treat_btambaw; static int treatcomboorder[NATREAT]={0,1,2,3,4,10,11,5,6,7,8,9}; // put misprints in the right place static int treat_browse(GtkWidget*w,gpointer p) { GtkWidget*dia; DEB_GU {printf("w=%p p=%p\n",(void*)w,(void*)p);fflush(stdout);} dia=gtk_file_chooser_dialog_new("Choose a treatment plug-in",0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if(gtk_dialog_run(GTK_DIALOG(dia))==GTK_RESPONSE_OK) gtk_entry_set_text(GTK_ENTRY(treat_f),gtk_file_chooser_get_filename((GtkFileChooser*)dia)); gtk_widget_destroy(dia); return 1; } // get (or construct) label for message m of treatment n static char*gettreatlab(int n,int m) { static char s[1000]; int i,j,j0,j1; if(n==2&&m==0) { if(iccgroupstart[2]-iccgroupstart[0]==0) return "Alphabet substitutions: "; strcpy(s,"Encode "); for(i=0;i<2;i++) { j0=iccgroupstart[i]; j1=iccgroupstart[i+1]; if(j0==j1) continue; if(j1-j0<7) for(j=j0;j0&&treatpermok[k][i]); gtk_label_set_text(GTK_LABEL(treat_lm[i]),gettreatlab(j?k:TREAT_PLUGIN,i)); // use text from TREAT_PLUGIN ("Message 1:" etc.) if desensitised } gtk_widget_set_sensitive(treat_bpiname,k==TREAT_PLUGIN); gtk_widget_set_sensitive(treat_btambaw,k!=0); return 1; } static int treatdia(void) { GtkWidget*dia,*e[NMSG],*c[NMSG],*l,*b,*vb; int i,j; char s[(MAXICC*16+4)*MXFL+1]; filler_stop(); dia=gtk_dialog_new_with_buttons("Answer treatment",GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_APPLY,GTK_RESPONSE_OK,NULL); vb=gtk_vbox_new(0,2); // box to hold everything gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),vb,TRUE,TRUE,0); treat_c=gtk_combo_box_new_text(); for(i=0;i0&&s[j-1]=='?') j--; s[j]=0; // strip trailing "?"s gtk_entry_set_text(GTK_ENTRY(c[i]),s); gtk_box_pack_start(GTK_BOX(treat_b2[i]),c[i],FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vb),treat_b2[i],TRUE,TRUE,0); } treat_bpiname=gtk_hbox_new(0,2); l=gtk_label_new("Treatment plug-in: "); gtk_label_set_width_chars(GTK_LABEL(l),25); gtk_misc_set_alignment(GTK_MISC(l),1,0.5); gtk_box_pack_start(GTK_BOX(treat_bpiname),l,FALSE,FALSE,0); treat_f=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(treat_f),SLEN-1); gtk_entry_set_text(GTK_ENTRY(treat_f),tpifname); gtk_box_pack_start(GTK_BOX(treat_bpiname),treat_f,FALSE,FALSE,0); b=gtk_button_new_with_label(" Browse... "); gtk_box_pack_start(GTK_BOX(treat_bpiname),b,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(treat_browse),0); gtk_box_pack_start(GTK_BOX(vb),treat_bpiname,TRUE,TRUE,0); treat_btambaw=gtk_check_button_new_with_mnemonic("Treated answer _must be a word"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(treat_btambaw),tambaw); gtk_box_pack_start(GTK_BOX(vb),treat_btambaw,TRUE,TRUE,0); gtk_signal_connect(GTK_OBJECT(treat_c),"changed",GTK_SIGNAL_FUNC(treat_setactive),0); for(i=0;i2) treatorder[i]=2; if(!treatpermok[treatmode][i]) treatorder[i]=0; j=strtoabms(treatcstr[i],MXFL,(char*)gtk_entry_get_text(GTK_ENTRY(c[i])),1); for(;j=NATREAT) treatmode=0; reloadtpi(); } gridchange(); gtk_widget_destroy(dia); return 1; } // dictionary list dialogue static GtkWidget*dictl_e[MAXNDICTS]; static int dictl_browse(GtkWidget*w,gpointer p) { GtkWidget*dia; DEB_GU {printf("w=%p p=%p\n",(void*)w,(void*)p);fflush(stdout);} dia=gtk_file_chooser_dialog_new("Choose a dictionary",0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if(gtk_dialog_run(GTK_DIALOG(dia))==GTK_RESPONSE_OK) gtk_entry_set_text(GTK_ENTRY(dictl_e[(intptr_t)p]),gtk_file_chooser_get_filename((GtkFileChooser*)dia)); gtk_widget_destroy(dia); return 1; } static int dictldia(void) { GtkWidget*dia,*l,*b,*t,*f0[MAXNDICTS],*f1[MAXNDICTS]; int d,i,j; unsigned int m,m0; char s[SLEN]; filler_stop(); dia=gtk_dialog_new_with_buttons("Dictionaries",GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_APPLY,GTK_RESPONSE_OK,NULL); t=gtk_table_new(MAXNDICTS+1,5,0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),t,TRUE,TRUE,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"File" ); gtk_table_attach(GTK_TABLE(t),l,1,2,0,1,0,0,0,0); l=gtk_label_new(""); gtk_table_attach(GTK_TABLE(t),l,3,4,0,1,0,0,10,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"File filter" ); gtk_table_attach(GTK_TABLE(t),l,4,5,0,1,0,0,0,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Answer filter"); gtk_table_attach(GTK_TABLE(t),l,5,6,0,1,0,0,0,0); for(i=0;i%d",i+1); l=gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(l),s); gtk_table_attach(GTK_TABLE(t),l,0,1,i+1,i+2,0,0,5,0); dictl_e[i]=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(dictl_e[i]),SLEN-1); gtk_entry_set_text(GTK_ENTRY(dictl_e[i]),dfnames[i]); gtk_table_attach(GTK_TABLE(t),dictl_e[i],1,2,i+1,i+2,0,0,0,0); b=gtk_button_new_with_label(" Browse... "); gtk_table_attach(GTK_TABLE(t),b,2,3,i+1,i+2,0,0,0,0); f0[i]=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(f0[i]),SLEN-1); gtk_entry_set_text(GTK_ENTRY(f0[i]),dsfilters[i]); gtk_table_attach(GTK_TABLE(t),f0[i],4,5,i+1,i+2,0,0,5,0); f1[i]=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(f1[i]),SLEN-1); gtk_entry_set_text(GTK_ENTRY(f1[i]),dafilters[i]); gtk_table_attach(GTK_TABLE(t),f1[i],5,6,i+1,i+2,0,0,5,0); gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(dictl_browse),(void*)(intptr_t)i); } gtk_widget_show_all(dia); j=gtk_dialog_run(GTK_DIALOG(dia)); if(j==GTK_RESPONSE_CANCEL||j==GTK_RESPONSE_DELETE_EVENT) goto ew0; for(j=0;jdmask; for(d=0;ddmask; m=dusedmask&~m; if(m) { if(onebit((ABM)m)) sprintf(s,"No lights have properties set to use\nwords from dictionary %d",logbase2((ABM)m)+1); else { sprintf(s,"No lights have properties set to use\nwords from dictionaries "); while(m) { m0=m&~(m-1); sprintf(s+strlen(s),"%d",logbase2((ABM)m0)+1); m&=~m0; if(m) { if(onebit((ABM)m)) strcat(s," or "); else strcat(s,", "); } } } repwarn(s); } ew0: gridchange(); gtk_widget_destroy(dia); return 1; } // dictionary statistics static int dstatsdia(void) { int d,i,j,k,n; GtkWidget*dia,*nb,*w0,*vb0[MAXNDICTS],*vb,*l0; char s[SLEN]; dia=gtk_dialog_new_with_buttons("Dictionary statistics",GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL); vb=gtk_vbox_new(0,3); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),vb,TRUE,TRUE,0); nb=gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(vb),nb,FALSE,TRUE,0); for(d=0;d11)) break; } // if(k0) strcat(q," "); sprintf(q+strlen(q),"U+%04X",p[j]); } } // convert ordinary string of "U+xxxx"s to string of uchars static void ustrtouchars(uchar*q,const char*p,int l) { int i; unsigned int u; *q=0; i=0; for(i=0;i=NALPHAINIT) return 1; a=alphainitdata[i]; for(i=1;i=i;j--) { gtk_entry_set_text(GTK_ENTRY(alpha_r[j+1]),gtk_entry_get_text(GTK_ENTRY(alpha_r[j]))); gtk_entry_set_text(GTK_ENTRY(alpha_a[j+1]),gtk_entry_get_text(GTK_ENTRY(alpha_a[j]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_vs[j+1]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_vs[j]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_cs[j+1]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_cs[j]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_sq[j+1]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_sq[j]))); } gtk_entry_set_text(GTK_ENTRY(alpha_r[i]),""); gtk_entry_set_text(GTK_ENTRY(alpha_a[i]),""); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_vs[i]),0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_cs[i]),0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_sq[i]),0); return 1; } static int al_shfrow(GtkWidget*w,gpointer data) { int i,j; char s[MAXEQUIV*100+1]; i=(GtkWidget**)data-alpha_r; if(i<1||i>=MAXICC-1) return 1; strcpy(s,gtk_entry_get_text(GTK_ENTRY(alpha_r[i]))); gtk_entry_set_text(GTK_ENTRY(alpha_r[i]),gtk_entry_get_text(GTK_ENTRY(alpha_r[i+1]))); gtk_entry_set_text(GTK_ENTRY(alpha_r[i+1]),s); strcpy(s,gtk_entry_get_text(GTK_ENTRY(alpha_a[i]))); gtk_entry_set_text(GTK_ENTRY(alpha_a[i]),gtk_entry_get_text(GTK_ENTRY(alpha_a[i+1]))); gtk_entry_set_text(GTK_ENTRY(alpha_a[i+1]),s); j=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_vs[i])); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_vs[i]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_vs[i+1]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_vs[i+1]),j); j=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_cs[i])); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_cs[i]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_cs[i+1]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_cs[i+1]),j); j=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_sq[i])); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_sq[i]),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_sq[i+1]))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_sq[i+1]),j); return 1; } static int al_delrow(GtkWidget*w,gpointer data) { int i,j; i=(GtkWidget**)data-alpha_r; for(j=i;j%d",j); rowtoicc[i]=j; // currently the identity function j++; // this code if we want to try to skip assigning ICCs to unused rows // if(f1||f2) { // sprintf(s,"%d",j); // rowtoicc[i]=j; // j++; // } // else { // strcpy(s,"-"); // rowtoicc[i]=-1; // } gtk_label_set_markup(GTK_LABEL(alpha_iccl[i]),s); gtk_widget_set_sensitive(alpha_iccl[i],f1); gtk_widget_set_sensitive(alpha_vs[i],f1); gtk_widget_set_sensitive(alpha_cs[i],f1); gtk_widget_set_sensitive(alpha_sq[i],f1); gtk_widget_set_sensitive(alpha_a [i],f1||f2); // this entry needs to be sensitive for letter pairs too } return 1; } static int alphadia(void) { GtkWidget*dia,*l,*t,*b,*w0; GtkRequisition sr; int i,j,u; char s[SLEN]; filler_stop(); if(stats!=NULL) gtk_widget_destroy(stats); stats=NULL; dia=gtk_dialog_new_with_buttons("Alphabet",GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_APPLY,GTK_RESPONSE_OK,NULL); t=gtk_table_new(MAXICC+2,6,0); // l=gtk_label_new(" "); gtk_table_attach(GTK_TABLE(t),l,1,2,0,1,0,0,5,5); // l=gtk_label_new(" Choose language default: "); gtk_table_attach(GTK_TABLE(t),l,2,3,0,1,0,0,5,5); al_w20=gtk_combo_box_new_text(); gtk_table_attach(GTK_TABLE(t),al_w20,0,1,0,1,0,0,5,5); gtk_combo_box_append_text(GTK_COMBO_BOX(al_w20),"Initialise from language default..."); for(i=0;ivbox),t,TRUE,TRUE,0); w0=gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w0),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request(w0,-1,350); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),w0,TRUE,TRUE,0); t=gtk_table_new(MAXICC+2,9,0); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(w0),t); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Entry" ); gtk_table_attach(GTK_TABLE(t),l,1,2,1,2,0,0,5,5); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Equivalents in dictionary files"); gtk_table_attach(GTK_TABLE(t),l,2,3,1,2,0,0,5,5); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"In @ set?" ); gtk_table_attach(GTK_TABLE(t),l,3,4,1,2,0,0,5,5); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"In # set?" ); gtk_table_attach(GTK_TABLE(t),l,4,5,1,2,0,0,5,5); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Sequence\ncontinues?" ); gtk_table_attach(GTK_TABLE(t),l,5,6,1,2,0,0,5,5); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Edit rows" ); gtk_table_attach(GTK_TABLE(t),l,6,9,1,2,0,0,5,5); for(i=1;i%d",i); alpha_iccl[i]=gtk_label_new(NULL); gtk_table_attach(GTK_TABLE(t),alpha_iccl[i],0,1,i+1,i+2,0,0,5,0); alpha_r[i]=gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(alpha_r[i]),10); gtk_entry_set_alignment(GTK_ENTRY(alpha_r[i]),.5); gtk_table_attach(GTK_TABLE(t),alpha_r[i] ,1,2,i+1,i+2,0,0,0,0); gtk_entry_set_max_length(GTK_ENTRY(alpha_r[i]),2); if(icctouchar[i]==0x3f) gtk_entry_set_text(GTK_ENTRY(alpha_r[i]),""); // "?" indicates unused ICC else gtk_entry_set_text(GTK_ENTRY(alpha_r[i]),icctoutf8[i]); gtk_signal_connect(GTK_OBJECT(alpha_r[i]),"changed",GTK_SIGNAL_FUNC(doiccls),NULL); // for update of labels alpha_a[i]=gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(alpha_a[i]),50); gtk_table_attach(GTK_TABLE(t),alpha_a[i] ,2,3,i+1,i+2,0,0,0,0); gtk_entry_set_max_length(GTK_ENTRY(alpha_a[i]),MAXEQUIV); gtk_entry_set_text(GTK_ENTRY(alpha_a[i]),iccequivs[i]); alpha_vs[i]=gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_vs[i]),!!(ICCTOABM(i)&abm_vow)); gtk_table_attach(GTK_TABLE(t),alpha_vs[i] ,3,4,i+1,i+2,0,0,0,0); alpha_cs[i]=gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_cs[i]),!!(ICCTOABM(i)&abm_con)); gtk_table_attach(GTK_TABLE(t),alpha_cs[i] ,4,5,i+1,i+2,0,0,0,0); alpha_sq[i]=gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alpha_sq[i]),iccseq[i]); gtk_table_attach(GTK_TABLE(t),alpha_sq[i] ,5,6,i+1,i+2,0,0,0,0); if(i=0) { u=addalphamapentry(rowtoicc[i], (char*)gtk_entry_get_text(GTK_ENTRY(alpha_r[i])), (char*)gtk_entry_get_text(GTK_ENTRY(alpha_a[i])), !!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_vs[i])), !!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_cs[i])), !!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(alpha_sq[i]))); j|=1<vbox),vb,TRUE,TRUE,0); t=gtk_table_new(2,2,0); gtk_box_pack_start(GTK_BOX(vb),t,TRUE,TRUE,0); l=gtk_label_new("Title: "); gtk_table_attach(GTK_TABLE(t),l,0,1,0,1,0,0,0,0); gtk_label_set_width_chars(GTK_LABEL(l),10); gtk_misc_set_alignment(GTK_MISC(l),1,0.5); ttl=gtk_entry_new(); gtk_table_attach(GTK_TABLE(t),ttl,1,2,0,1,0,0,0,0); gtk_entry_set_max_length(GTK_ENTRY(ttl),SLEN-1); gtk_entry_set_text(GTK_ENTRY(ttl),gtitle); l=gtk_label_new("Author: "); gtk_table_attach(GTK_TABLE(t),l,0,1,1,2,0,0,0,0); gtk_label_set_width_chars(GTK_LABEL(l),10); gtk_misc_set_alignment(GTK_MISC(l),1,0.5); aut=gtk_entry_new(); gtk_table_attach(GTK_TABLE(t),aut,1,2,1,2,0,0,0,0); gtk_entry_set_max_length(GTK_ENTRY(aut),SLEN-1); gtk_entry_set_text(GTK_ENTRY(aut),gauthor); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); w=gtk_hbox_new(0,2); gtk_box_pack_start(GTK_BOX(vb),w,TRUE,TRUE,0); l=gtk_label_new("Grid type: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); gtk_label_set_width_chars(GTK_LABEL(l),10); gtk_misc_set_alignment(GTK_MISC(l),1,0.5); gprop_w20=gtk_combo_box_new_text(); gtk_box_pack_start(GTK_BOX(w),gprop_w20,FALSE,FALSE,0); for(i=0;i=1&&i<=MXSZ) nw=i; else nw=width; i=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w31)); if(i>=1&&i<=MXSZ) nh=i; else nh=height; for(i=0;i=width||j>=height) initsquare(i,j); width=nw; height=nh; for(i=0,i0=0;i0) i0++; // have we lost the free light completely? } nvl=i0; i=gtk_combo_box_get_active(GTK_COMBO_BOX(gprop_w20)); if(i>=0&&ivbox),vb,TRUE,TRUE,0); l=gtk_label_new(" Enter a coordinate pair for each cell in the path on a "); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,TRUE,0); gtk_misc_set_alignment(GTK_MISC(l),0,0.5); l=gtk_label_new(" separate line. Coordinates are counted from zero. "); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,TRUE,0); gtk_misc_set_alignment(GTK_MISC(l),0,0.5); for(i=0,p=s;i=MXSZ) x[i]=MXSZ-1; if(q==p) goto err0; p=q; while(isspace((unsigned char)*p)||*p==',') p++; y[i]=strtol(p,&q,10); if(y[i]<0) y[i]=0; if(y[i]>=MXSZ) y[i]=MXSZ-1; if(q==p) goto err0; p=q; } if(i>0) { vls[v].l=i; memcpy(vls[v].x,x,i*sizeof(int)); memcpy(vls[v].y,y,i*sizeof(int)); } gridchange(); } gtk_widget_destroy(dia); return 1; err0: reperr("Each line must contain\ntwo numeric coordinate values\nseparated by a comma or space"); goto ew0; err1: reperr("Free light length limit reached"); goto ew0; } GtkWidget*dictl_e1; static int ddict_browse(GtkWidget*w,gpointer p) { GtkWidget*dia; dia=gtk_file_chooser_dialog_new("Choose a dictionary",0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if(gtk_dialog_run(GTK_DIALOG(dia))==GTK_RESPONSE_OK) gtk_entry_set_text(GTK_ENTRY(dictl_e1),gtk_file_chooser_get_filename((GtkFileChooser*)dia)); gtk_widget_destroy(dia); return 1; } // preferences dialogue static int prefsdia(void) { GtkWidget*dia,*l,*w,*w30,*w31,*w32,*w00,*w01,*w02,*w20,*w21,*w10,*w11,*w12,*w14,*t,*le0[NLOOKUP],*le1[NLOOKUP],*vb,*nb,*dal,*b,*f01,*f11; int i; char s[SLEN+1]; dia=gtk_dialog_new_with_buttons("Preferences",GTK_WINDOW(mainw),GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_APPLY,GTK_RESPONSE_OK,NULL); nb=gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),nb,FALSE,TRUE,0); vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Export")); // gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dia)->vbox),vb,TRUE,TRUE,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Export preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); w=gtk_hbox_new(0,3); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); l=gtk_label_new(" EPS/SVG export square size: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w30=gtk_spin_button_new_with_range(10,72,1); gtk_box_pack_start(GTK_BOX(w),w30,FALSE,FALSE,0); l=gtk_label_new(" points"); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w=gtk_hbox_new(0,3); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); l=gtk_label_new(" HTML/PNG export square size: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w31=gtk_spin_button_new_with_range(10,72,1); gtk_box_pack_start(GTK_BOX(w),w31,FALSE,FALSE,0); l=gtk_label_new(" pixels"); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w32=gtk_check_button_new_with_label("Include numbers in filled grids"); gtk_box_pack_start(GTK_BOX(vb),w32,FALSE,FALSE,0); vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Editing")); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Editing preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); w00=gtk_check_button_new_with_label("Clicking corners makes blocks"); gtk_box_pack_start(GTK_BOX(vb),w00,FALSE,FALSE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w01=gtk_check_button_new_with_label("Clicking edges makes bars"); gtk_box_pack_start(GTK_BOX(vb),w01,FALSE,FALSE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w02=gtk_check_button_new_with_label("Show numbers while editing"); gtk_box_pack_start(GTK_BOX(vb),w02,FALSE,FALSE,0); vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Statistics")); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Statistics preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); l=gtk_label_new(" Desirable checking ratios");gtk_misc_set_alignment(GTK_MISC(l),0,0.5); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); w=gtk_hbox_new(0,3); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); l=gtk_label_new(" Minimum: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w20=gtk_spin_button_new_with_range(0,100,1); gtk_box_pack_start(GTK_BOX(w),w20,FALSE,FALSE,0); l=gtk_label_new("% Maximum: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); w21=gtk_spin_button_new_with_range(0,100,1); gtk_box_pack_start(GTK_BOX(w),w21,FALSE,FALSE,0); l=gtk_label_new("% plus one cell "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Autofill")); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Autofill preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); w10=gtk_radio_button_new_with_label_from_widget(NULL,"Deterministic"); gtk_box_pack_start(GTK_BOX(vb),w10,FALSE,FALSE,0); w11=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(w10),"Slightly randomised"); gtk_box_pack_start(GTK_BOX(vb),w11,FALSE,FALSE,0); w12=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(w11),"Highly randomised"); gtk_box_pack_start(GTK_BOX(vb),w12,FALSE,FALSE,0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w14=gtk_check_button_new_with_label("Prevent duplicate answers and lights"); gtk_box_pack_start(GTK_BOX(vb),w14,FALSE,FALSE,0); vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Lookup")); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Lookup preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); t=gtk_table_new(NLOOKUP+1,3,0); gtk_box_pack_start(GTK_BOX(vb),t,FALSE,FALSE,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Name"); gtk_table_attach(GTK_TABLE(t),l,1,2,0,1,0,0,0,0); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"URI (must start \"http://\" or \"https://\")"); gtk_table_attach(GTK_TABLE(t),l,2,3,0,1,0,0,0,0); for(i=0;i%d",i+1); l=gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(l),s); gtk_table_attach(GTK_TABLE(t),l,0,1,i+1,i+2,0,0,5,0); le0[i]=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(le0[i]),SLEN-1); gtk_entry_set_width_chars(GTK_ENTRY(le0[i]),30); gtk_entry_set_text(GTK_ENTRY(le0[i]),lookupname(i)); gtk_table_attach(GTK_TABLE(t),le0[i],1,2,i+1,i+2,0,0,0,0); le1[i]=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(le1[i]),SLEN-1); gtk_entry_set_width_chars(GTK_ENTRY(le1[i]),50); gtk_entry_set_text(GTK_ENTRY(le1[i]),lookup(i)); gtk_table_attach(GTK_TABLE(t),le1[i],2,3,i+1,i+2,0,0,5,0); } vb=gtk_vbox_new(0,3); // box to hold all the options gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb,gtk_label_new("Startup")); l=gtk_label_new(NULL);gtk_label_set_markup(GTK_LABEL(l),"Startup preferences"); gtk_box_pack_start(GTK_BOX(vb),l,FALSE,FALSE,0); t=gtk_table_new(4,3,0); gtk_box_pack_start(GTK_BOX(vb),t,FALSE,FALSE,0); l=gtk_label_new(" Default dictionary in slot 1 at startup: "); gtk_table_attach(GTK_TABLE(t),l,0,1,0,1,0,0,0,0); dictl_e1=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(dictl_e1),SLEN-1); gtk_table_attach(GTK_TABLE(t),dictl_e1,1,2,0,1,0,0,0,0); gtk_entry_set_text(GTK_ENTRY(dictl_e1),startup_dict1); b=gtk_button_new_with_label(" Browse... "); gtk_table_attach(GTK_TABLE(t),b,2,3,0,1,0,0,0,0); l=gtk_label_new(" Default file filter: "); gtk_misc_set_alignment(GTK_MISC(l),1.0,0.5); gtk_table_attach(GTK_TABLE(t),l,0,1,1,2,0,0,0,0); f01=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(f01),SLEN-1); gtk_table_attach(GTK_TABLE(t),f01,1,2,1,2,0,0,0,0); gtk_entry_set_text(GTK_ENTRY(f01),startup_ff1); l=gtk_label_new(" Default answer filter: "); gtk_table_attach(GTK_TABLE(t),l,0,1,2,3,0,0,0,0); f11=gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(f11),SLEN-1); gtk_table_attach(GTK_TABLE(t),f11,1,2,2,3,0,0,0,0); gtk_entry_set_text(GTK_ENTRY(f11),startup_af1); gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(ddict_browse),0); w=gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); w=gtk_hbox_new(0,3); gtk_box_pack_start(GTK_BOX(vb),w,FALSE,FALSE,0); l=gtk_label_new(" Default alphabet at startup: "); gtk_box_pack_start(GTK_BOX(w),l,FALSE,FALSE,0); dal=gtk_combo_box_new_text(); gtk_box_pack_start(GTK_BOX(w),dal,FALSE,FALSE,0); for(i=0;i72) eptsq=72; hpxsq=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w31)); if(hpxsq<10) hpxsq=10; if(hpxsq>72) hpxsq=72; lnis=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w32))&1; clickblock=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w00))&1; clickbar=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w01))&1; shownums=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w02))&1; mincheck=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w20)); if(mincheck< 0) mincheck= 0; if(mincheck>100) mincheck=100; maxcheck=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w21)); if(maxcheck< 0) maxcheck= 0; if(maxcheck>100) maxcheck=100; afunique=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w14)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w10))) afrandom=0; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w11))) afrandom=1; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w12))) afrandom=2; for(i=0;i=NALPHAINIT) startup_al=ALPHABET_AZ09; saveprefs(); // save to preferences file (failing silently) } gtk_widget_destroy(dia); refreshall(); compute(0); // because of new checking ratios return 1; } // update statistics window if in view // main widget table is st_te[][], rows below in st_r[] void stats_upd(void) { int i,j; char s[SLEN]; if(!usegui) return; if(!stats) return; for(i=2;i<=MXLE;i++) { // one row for each word length if(st_lc[i]>0) { sprintf(s,"%d",i); gtk_label_set_text(GTK_LABEL(st_te[i][0]),s); sprintf(s,"%d",st_lc[i]); gtk_label_set_text(GTK_LABEL(st_te[i][1]),s); sprintf(s,st_lucc[i]?"%d (%.1f%%)":" ",st_lucc[i],100.0*st_lucc[i]/st_lc[i]); gtk_label_set_text(GTK_LABEL(st_te[i][2]),s); sprintf(s,st_locc[i]?"%d (%.1f%%)":" ",st_locc[i],100.0*st_locc[i]/st_lc[i]); gtk_label_set_text(GTK_LABEL(st_te[i][3]),s); sprintf(s,st_lc[i]?"%.2f:%.2f:%.2f":" " ,1.0*st_lmnc[i]/i,1.0*st_lsc[i]/st_lc[i]/i,1.0*st_lmxc[i]/i); gtk_label_set_text(GTK_LABEL(st_te[i][4]),s); for(j=0;j<5;j++) gtk_widget_show(st_te[i][j]); // show row if non-empty... } else for(j=0;j<5;j++) {gtk_label_set_text(GTK_LABEL(st_te[i][j])," ");gtk_widget_hide(st_te[i][j]);} // ... and hide row if empty } sprintf(s," Total lights: %d",nw0); gtk_label_set_text(GTK_LABEL(st_r[0]),s); if(nw0>0) sprintf(s," Mean length: %.1f",(double)nc/nw0); else strcpy (s," Mean length: -"); gtk_label_set_text(GTK_LABEL(st_r[1]),s); if(nc>0 ) sprintf(s," Checked light characters: %d/%d (%.1f%%)",st_sc,nc,100.0*st_sc/nc); else strcpy (s," Checked light characters: -"); gtk_label_set_text(GTK_LABEL(st_r[2]),s); if(ne0>0) sprintf(s," Checked grid cells: %d/%d (%.1f%%)",st_ce,ne0,100.0*st_ce/ne0); else strcpy (s," Checked grid cells: -"); gtk_label_set_text(GTK_LABEL(st_r[3]),s); sprintf(s," Lights with double unches: %d",st_2u-st_3u); gtk_label_set_text(GTK_LABEL(st_r[4]),s); sprintf(s," Lights with triple, quadruple etc. unches: %d",st_3u); gtk_label_set_text(GTK_LABEL(st_r[5]),s); sprintf(s," Lights too long for filler: %d",st_tlf); gtk_label_set_text(GTK_LABEL(st_r[6]),s); sprintf(s," Total free lights: %d",nvl); gtk_label_set_text(GTK_LABEL(st_r[7]),s); sprintf(s," Free lights too long for filler: %d",st_vltlf); gtk_label_set_text(GTK_LABEL(st_r[8]),s); if(st_tmtlf) sprintf(s," There are too many treated lights to use filler discretionary modes"); else sprintf(s," "); gtk_label_set_text(GTK_LABEL(st_r[9]),s); if(hist_da->window) gdk_window_invalidate_rect(hist_da->window,0,0); } // histogram update static gint hist_configure_event(GtkWidget*widget,GdkEventConfigure*event) { DEB_RF printf("hist config event: new w=%d h=%d\n",widget->allocation.width,widget->allocation.height); return TRUE; } #define HBARW 12 // width of bar #define HBARG 4 // gap between bars // draw histogram (if non-empty) static void drawhist(cairo_t*cr) { int x=5,y0=224,w=HBARW; int c,g,h,i,m,u,v,mni,mxi; char s[SLEN]; for(i=0,u=0;im) m=st_hist[(int)iccused[i]]; // max in histogram for(g=0;garea.x,event->area.y,event->area.width,event->area.height),fflush(stdout); if(widget==hist_da) { cr=gdk_cairo_create(widget->window); cairo_rectangle(cr,event->area.x,event->area.y,event->area.width,event->area.height); cairo_clip(cr); gscale=1; drawhist(cr); cairo_destroy(cr); } return FALSE; } // create statistics dialogue static void stats_init(void) { int i,j; GtkWidget*w0,*w1,*nb,*vb0,*vb1; for(i=0;ivbox),nb,FALSE,TRUE,0); vb0=gtk_vbox_new(0,3); gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb0,gtk_label_new("General")); w0=gtk_table_new(MXLE+2,5,FALSE); st_te[0][0]=gtk_label_new(" Length "); st_te[0][1]=gtk_label_new(" Count "); st_te[0][2]=gtk_label_new(" Underchecked "); st_te[0][3]=gtk_label_new(" Overchecked "); st_te[0][4]=gtk_label_new(" Check ratio min:mean:max "); for(j=0;j<5;j++) gtk_widget_show(st_te[0][j]); w1=gtk_hseparator_new();gtk_table_attach_defaults(GTK_TABLE(w0),w1,0,5,1,2);gtk_widget_show(w1); for(i=2;i<=MXLE;i++) for(j=0;j<5;j++) st_te[i][j]=gtk_label_new(""); // initialise all table entries to empty strings for(i=0;i<=MXLE;i++) for(j=0;j<5;j++) if(st_te[i][j]) gtk_table_attach_defaults(GTK_TABLE(w0),st_te[i][j],j,j+1,i,i+1); w1=gtk_hseparator_new();gtk_table_attach_defaults(GTK_TABLE(w0),w1,0,5,MXLE+1,MXLE+2);gtk_widget_show(w1); gtk_box_pack_start(GTK_BOX(vb0),w0,FALSE,TRUE,0);gtk_widget_show(w0); for(j=0;j<10;j++) { st_r[j]=gtk_label_new(" "); // blank rows at the bottom for now gtk_misc_set_alignment(GTK_MISC(st_r[j]),0,0.5); gtk_box_pack_start(GTK_BOX(vb0),st_r[j],FALSE,TRUE,0); gtk_widget_show(st_r[j]); } vb1=gtk_vbox_new(0,3); gtk_notebook_append_page(GTK_NOTEBOOK(nb),vb1,gtk_label_new("Entry histogram")); // drawing area for histogram and events it captures hist_da=gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(hist_da),niccused*(HBARW+HBARG)+7,250); gtk_widget_set_events(hist_da,GDK_EXPOSURE_MASK); gtk_signal_connect(GTK_OBJECT(hist_da),"expose_event",GTK_SIGNAL_FUNC(hist_expose_event),NULL); gtk_signal_connect(GTK_OBJECT(hist_da),"configure_event",GTK_SIGNAL_FUNC(hist_configure_event),NULL); gtk_box_pack_start(GTK_BOX(vb1),hist_da,FALSE,TRUE,0);gtk_widget_show(hist_da); gtk_widget_show(hist_da); gtk_widget_show(vb1); gtk_widget_show(vb0); gtk_widget_show(nb); } // remove statistics window (if not already gone or in the process of going) static void stats_quit(GtkDialog*w,int i0,void*p0) { DEB_RF printf("stats_quit()\n"),fflush(stdout); if(i0!=GTK_RESPONSE_DELETE_EVENT&&stats!=NULL) gtk_widget_destroy(stats); stats=NULL; DEB_RF printf("stats_quit()\n"),fflush(stdout); } // open stats window if not already open, and update it static int statsdia(void) { if(!stats) stats_init(); stats_upd(); gtk_widget_show(stats); gtk_signal_connect(GTK_OBJECT(stats),"response",GTK_SIGNAL_FUNC(stats_quit),NULL); // does repeating this matter? return 0; } void setposslabel(char*s) { if(!usegui) return; gtk_label_set_text(GTK_LABEL(poss_label),s); } // update feasible list to screen void updatefeas(void) { int i; char t0[MXFL*10+100],t1[MXLE+50],*u[2],p0[MAXICC+1],p1[MAXICC*16+SLEN]; DEB_RF printf("updatefeas()\n"); if(!usegui) return; if(ifamode==0) {setposslabel(""); return;} u[0]=t0; u[1]=t1; p1[0]='\0'; gtk_clist_freeze(GTK_CLIST(clist)); // avoid glitchy-looking updates gtk_clist_clear(GTK_CLIST(clist)); if(!isclear(curx,cury)) goto ew0; for(i=0;i -> <%s>\n",t0); } if(lts[llistp[i]].ans<0) strcpy(t1,""); else sprintf(t1,"%+.1f",log10(ansp[lts[llistp[i]].ans]->score)); // negative ans values should not occur here DEB_RF printf("gtk_clist_append( <%s> <%s> )\n",u[0],u[1]); gtk_clist_append(GTK_CLIST(clist),u); DEB_RF {int j; for(j=0;t0[j];j++) printf("<%02X>",(unsigned char)t0[j]); printf("\n");} } if(curent>=0&&curword>=0&&words[curword].fe==0) { if(entries[curent].flbm==0) strcpy(p0,""); else getposs(entries+curent,p0,0,0); // get feasible letter list with dash suppressed if(strlen(p0)==0) sprintf(p1," No feasible characters"); else { sprintf(p1," Feasible character%s: ",(strlen(p0)==1)?"":"s"); for(i=0;p0[i];i++) strcat(p1,icctoutf8[(unsigned int)p0[i]]); } } else p1[0]=0; ew0: gtk_clist_thaw(GTK_CLIST(clist)); // make list visible DEB_RF printf("Setting poss label to >%s<\n",p1); setposslabel(p1); return; } static void syncselmenu() { DEB_GU printf("syncselmenu mode=%d,n=%d\n",selmode,nsel); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf100),selmode==0&&nsel>0); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf201),selmode==2&&nsel==1); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf202),selmode==2&&nsel==1); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf203),selmode==2&&nsel==1); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf204),selmode==2&&nsel>0); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf300),selmode==0&&nsel>0); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf301),(selmode==1||selmode==2)&&nsel>0); } static void syncsymmmenu() {int i,m; gtk_menu_item_activate((GtkMenuItem*)gtk_item_factory_get_widget_by_action(item_factory,0x100+symmr)); gtk_menu_item_activate((GtkMenuItem*)gtk_item_factory_get_widget_by_action(item_factory,0x200+symmm)); gtk_menu_item_activate((GtkMenuItem*)gtk_item_factory_get_widget_by_action(item_factory,0x300+symmd)); m=symmrmask(); for(i=1;i<=12;i++) gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x100+i),(m>>i)&1); m=symmmmask(); for(i=0;i<= 3;i++) gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x200+i),(m>>i)&1); m=symmdmask(); for(i=0;i<= 3;i++) gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x300+i),(m>>i)&1); i=(gshape[gtype]==3||gshape[gtype]==4); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf000),!i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf001), i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0xf002), i); i=(gshape[gtype]>0); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x404),!i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x414),!i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x433),!i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x443),!i); gtk_widget_set_sensitive((GtkWidget*)gtk_item_factory_get_widget_by_action(item_factory,0x451),!i); } static void syncifamenu() { gtk_menu_item_activate((GtkMenuItem*)gtk_item_factory_get_widget_by_action(item_factory,0x0500+ifamode)); } // sync GUI with possibly new grid properties, flags, symmetry, width, height void syncgui(void) { if(!usegui) return; if(!isingrid(curx,cury)) {curx=0,cury=0;} // keep cursor in grid if(curdir>=ndir[gtype]&&curdir<100) curdir=0; // make sure direction is feasible if(curdir>=100+nvl) curdir=0; gtk_drawing_area_size(GTK_DRAWING_AREA(grid_da),dawidth()+3,daheight()+3); gtk_widget_show(grid_da); syncsymmmenu(); syncselmenu(); syncifamenu(); setwintitle(); draw_init(); refreshall(); curmoved(); } // menus static GtkItemFactoryEntry menu_items[] = { { "/_File", 0, 0, 0, "", 0 }, { "/File/_New", 0, 0, 0, "", 0 }, { "/File/New/Current shape and size", "N", m_filenew, 0, "", GTK_STOCK_NEW }, { "/File/New/Blank 9x9", 0, m_filenew, 0x090980, 0, 0 }, { "/File/New/Blank 10x10", 0, m_filenew, 0x0a0a80, 0, 0 }, { "/File/New/Blank 11x11", 0, m_filenew, 0x0b0b80, 0, 0 }, { "/File/New/Blank 11x13", 0, m_filenew, 0x0b0d80, 0, 0 }, { "/File/New/Blank 12x12", 0, m_filenew, 0x0c0c80, 0, 0 }, { "/File/New/Blank 13x11", 0, m_filenew, 0x0d0b80, 0, 0 }, { "/File/New/Blank 13x13", 0, m_filenew, 0x0d0d80, 0, 0 }, { "/File/New/Blank 14x14", 0, m_filenew, 0x0e0e80, 0, 0 }, { "/File/New/Blank 15x15", 0, m_filenew, 0x0f0f80, 0, 0 }, { "/File/New/Blocked 13x13 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 13x13 template/No unches on edges", 0, m_filenew, 0x0d0d00, 0, 0 }, { "/File/New/Blocked 13x13 template/Unches left and right", 0, m_filenew, 0x0d0d01, 0, 0 }, { "/File/New/Blocked 13x13 template/Unches top and bottom", 0, m_filenew, 0x0d0d02, 0, 0 }, { "/File/New/Blocked 13x13 template/Unches on all edges", 0, m_filenew, 0x0d0d03, 0, 0 }, { "/File/New/Blocked 15x15 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 15x15 template/No unches on edges", 0, m_filenew, 0x0f0f00, 0, 0 }, { "/File/New/Blocked 15x15 template/Unches left and right", 0, m_filenew, 0x0f0f01, 0, 0 }, { "/File/New/Blocked 15x15 template/Unches top and bottom", 0, m_filenew, 0x0f0f02, 0, 0 }, { "/File/New/Blocked 15x15 template/Unches on all edges", 0, m_filenew, 0x0f0f03, 0, 0 }, { "/File/New/Blocked 17x17 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 17x17 template/No unches on edges", 0, m_filenew, 0x111100, 0, 0 }, { "/File/New/Blocked 17x17 template/Unches left and right", 0, m_filenew, 0x111101, 0, 0 }, { "/File/New/Blocked 17x17 template/Unches top and bottom", 0, m_filenew, 0x111102, 0, 0 }, { "/File/New/Blocked 17x17 template/Unches on all edges", 0, m_filenew, 0x111103, 0, 0 }, { "/File/New/Blocked 19x19 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 19x19 template/No unches on edges", 0, m_filenew, 0x131300, 0, 0 }, { "/File/New/Blocked 19x19 template/Unches left and right", 0, m_filenew, 0x131301, 0, 0 }, { "/File/New/Blocked 19x19 template/Unches top and bottom", 0, m_filenew, 0x131302, 0, 0 }, { "/File/New/Blocked 19x19 template/Unches on all edges", 0, m_filenew, 0x131303, 0, 0 }, { "/File/New/Blocked 21x21 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 21x21 template/No unches on edges", 0, m_filenew, 0x151500, 0, 0 }, { "/File/New/Blocked 21x21 template/Unches left and right", 0, m_filenew, 0x151501, 0, 0 }, { "/File/New/Blocked 21x21 template/Unches top and bottom", 0, m_filenew, 0x151502, 0, 0 }, { "/File/New/Blocked 21x21 template/Unches on all edges", 0, m_filenew, 0x151503, 0, 0 }, { "/File/New/Blocked 23x23 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 23x23 template/No unches on edges", 0, m_filenew, 0x171700, 0, 0 }, { "/File/New/Blocked 23x23 template/Unches left and right", 0, m_filenew, 0x171701, 0, 0 }, { "/File/New/Blocked 23x23 template/Unches top and bottom", 0, m_filenew, 0x171702, 0, 0 }, { "/File/New/Blocked 23x23 template/Unches on all edges", 0, m_filenew, 0x171703, 0, 0 }, { "/File/New/Blocked 25x25 template", 0, 0, 0, "", 0 }, { "/File/New/Blocked 25x25 template/No unches on edges", 0, m_filenew, 0x191900, 0, 0 }, { "/File/New/Blocked 25x25 template/Unches left and right", 0, m_filenew, 0x191901, 0, 0 }, { "/File/New/Blocked 25x25 template/Unches top and bottom", 0, m_filenew, 0x191902, 0, 0 }, { "/File/New/Blocked 25x25 template/Unches on all edges", 0, m_filenew, 0x191903, 0, 0 }, { "/File/sep0", 0, 0, 0, "", 0 }, { "/File/_Open...", "O", m_fileopen, 0, "", GTK_STOCK_OPEN }, { "/File/_Save", "S", m_filesave, 0, "", GTK_STOCK_SAVE }, { "/File/Save _as...", 0, m_filesaveas, 0, "", GTK_STOCK_SAVE_AS }, { "/File/sep1", 0, 0, 0, "", 0 }, { "/File/Export _blank grid image", 0, 0, 0, "", 0 }, { "/File/Export blank grid image/as _EPS...", 0, m_fileexport, 0x401, 0, 0 }, { "/File/Export blank grid image/as _SVG...", 0, m_fileexport, 0x402, 0, 0 }, { "/File/Export blank grid image/as _PNG...", 0, m_fileexport, 0x403, 0, 0 }, { "/File/Export blank grid image/as _HTML...", 0, m_fileexport, 0x404, 0, 0 }, { "/File/Export _filled grid image", 0, 0, 0, "", 0 }, { "/File/Export filled grid image/as _EPS...", 0, m_fileexport, 0x411, 0, 0 }, { "/File/Export filled grid image/as _SVG...", 0, m_fileexport, 0x412, 0, 0 }, { "/File/Export filled grid image/as _PNG...", 0, m_fileexport, 0x413, 0, 0 }, { "/File/Export filled grid image/as _HTML...", 0, m_fileexport, 0x414, 0, 0 }, { "/File/Export ans_wers", 0, 0, 0, "", 0 }, { "/File/Export answers/As _text...", 0, m_fileexport, 0x420, 0, 0 }, { "/File/Export answers/As _HTML...", 0, m_fileexport, 0x423, 0, 0 }, { "/File/Export _puzzle", 0, 0, 0, "", 0 }, { "/File/Export puzzle/As _HTML...", 0, m_fileexport, 0x433, 0, 0 }, { "/File/Export puzzle/As HTML+_SVG...", 0, m_fileexport, 0x434, 0, 0 }, { "/File/Export puzzle/As HTML+_PNG...", 0, m_fileexport, 0x435, 0, 0 }, { "/File/Export so_lution", 0, 0, 0, "", 0 }, { "/File/Export solution/As _HTML...", 0, m_fileexport, 0x443, 0, 0 }, { "/File/Export solution/As HTML+_SVG...", 0, m_fileexport, 0x444, 0, 0 }, { "/File/Export solution/As HTML+_PNG...", 0, m_fileexport, 0x445, 0, 0 }, { "/File/Export o_ther format", 0, 0, 0, "", 0 }, { "/File/Export other format/_Crossword Compiler XML...", 0, m_fileexport, 0x451, 0, 0 }, { "/File/sep2", 0, 0, 0, "", 0 }, { "/File/I_mport free light paths", 0, m_importvls, 0, 0, 0 }, { "/File/E_xport free light paths", 0, m_exportvls, 0, 0, 0 }, { "/File/sep3", 0, 0, 0, "", 0 }, { "/File/_Quit", "Q", m_filequit, 0, "", GTK_STOCK_QUIT }, { "/_Edit", 0, 0, 0, "", 0 }, { "/Edit/_Undo", "Z", m_undo, 0, "", GTK_STOCK_UNDO }, { "/Edit/_Redo", "Y", m_redo, 0, "", GTK_STOCK_REDO }, { "/Edit/sep1", 0, 0, 0, "", 0 }, { "/Edit/_Solid block", "Insert", m_editblock, 0, 0, 0 }, { "/Edit/_Bar before", "Return", m_editbarb, 0, 0, 0 }, { "/Edit/_Empty", "Delete", m_editempty, 0, 0, 0 }, { "/Edit/_Cutout", "C", m_editcutout, 0, 0, 0 }, { "/Edit/_Merge with next", "M", m_editmerge, 0, 0, 0 }, { "/Edit/sep2", 0, 0, 0, "", 0 }, { "/Edit/Cell c_ontents...", "I", m_cellcont, 0, 0, 0 }, { "/Edit/_Light contents...", "L", m_editlight, 0, 0, 0 }, { "/Edit/Clear _all cells", "X", m_eraseall, 0, "", GTK_STOCK_CLEAR }, { "/Edit/C_lear selected cells", "X", m_erasesel, 0xf100, "", GTK_STOCK_CLEAR }, { "/Edit/sep3", 0, 0, 0, "", 0 }, // { "/Edit/sep4", 0, 0, 0, "", 0 }, // { "/Edit/_Write clue", "W", m_writeclue, 0, 0, 0 }, // { "/Edit/sep5", 0, 0, 0, "", 0 }, { "/Edit/_Free light", 0, 0, 0, "", 0 }, { "/Edit/Free light/_Start new", 0, m_vlnew, 0xf200, 0, 0 }, { "/Edit/Free light/_Extend selected", "E", m_vlextend, 0xf201, 0, 0 }, { "/Edit/Free light/_Shorten selected", "D", m_vlcurtail, 0xf202, 0, 0 }, { "/Edit/Free light/_Modify selected", 0, m_vlmodify, 0xf203, 0, 0 }, { "/Edit/Free light/_Delete selected", 0, m_vldelete, 0xf204, 0, 0 }, { "/Edit/sep6", 0, 0, 0, "", 0 }, { "/Edit/Flip in main dia_gonal", 0, m_editflip, 0xf000, 0, 0 }, { "/Edit/Rotate cloc_kwise", "greater", m_editrot, 0xf001, 0, 0 }, { "/Edit/Rotate a_nticlockwise", "less", m_editrot, 0xf002, 0, 0 }, { "/Edit/_Delete", 0, 0, 0, "", 0 }, { "/Edit/Delete/_Row or annulus", 0, m_delrow, 0, 0, 0 }, { "/Edit/Delete/_Column or radius", 0, m_delcol, 0, 0, 0 }, { "/Edit/_Insert", 0, 0, 0, "", 0 }, { "/Edit/Insert/Row _above or outer annulus", 0, m_insrow, 0, 0, 0 }, { "/Edit/Insert/Row _below or inner annulus", 0, m_insrow, 1, 0, 0 }, { "/Edit/Insert/Column to _left or previous radius", 0, m_inscol, 0, 0, 0 }, { "/Edit/Insert/Column to _right or next radius", 0, m_inscol, 1, 0, 0 }, { "/Edit/sep7", 0, 0, 0, "", 0 }, { "/Edit/_Zoom", 0, 0, 0, "", 0 }, { "/Edit/Zoom/_Out", "minus", m_zoom, -2, 0, 0 }, { "/Edit/Zoom/_1 50%", "8", m_zoom, 0, 0, 0 }, { "/Edit/Zoom/_2 71%", "9", m_zoom, 1, 0, 0 }, { "/Edit/Zoom/_3 100%", "0", m_zoom, 2, 0, 0 }, { "/Edit/Zoom/_4 141%", "1", m_zoom, 3, 0, 0 }, { "/Edit/Zoom/_5 200%", "2", m_zoom, 4, 0, 0 }, { "/Edit/Zoom/_In", "plus", m_zoom, -1, 0, 0 }, { "/Edit/Show s_tatistics", 0, m_showstats, 0, 0, 0 }, { "/Edit/_Preferences...", 0, m_editprefs, 0, "", GTK_STOCK_PREFERENCES }, { "/_Properties", 0, 0, 0, "", 0 }, { "/Properties/_Grid properties...", 0, m_editgprop, 0, "", GTK_STOCK_PROPERTIES }, { "/Properties/Default _cell properties...", 0, m_dsprop, 0, 0, 0 }, { "/Properties/Selected c_ell properties...", 0, m_sprop, 0xf300, 0, 0 }, { "/Properties/Default _light properties...", 0, m_dlprop, 0, 0, 0 }, { "/Properties/Selected l_ight properties...", 0, m_lprop, 0xf301, 0, 0 }, { "/_Select", 0, 0, 0, "", 0 }, { "/Select/Current _cell", "C", m_selcell, 0, 0, 0 }, { "/Select/Current _light", "L", m_sellight, 0, 0, 0 }, { "/Select/Cell _mode <> light mode", "M", m_selmode, 0, 0, 0 }, { "/Select/_Free light", "F", m_selfvl, 0, 0, 0 }, { "/Select/sep0", 0, 0, 0, "", 0 }, { "/Select/_All", "A", m_selall, 0, 0, 0 }, { "/Select/_Invert", "I", m_selinv, 0, 0, 0 }, { "/Select/_Nothing", "N", m_selnone, 0, 0, 0 }, { "/Select/sep1", 0, 0, 0, "", 0 }, { "/Select/Cell_s", 0, 0, 0, "", 0 }, { "/Select/Cells/overriding default _properties", 0, m_selcover, 0, 0, 0 }, { "/Select/Cells/flagged for _answer treatment", 0, m_selctreat, 0, 0, 0 }, { "/Select/Cells/that are _unchecked", 0, m_selcunch, 0, 0, 0 }, { "/Select/Li_ghts", 0, 0, 0, "", 0 }, { "/Select/Lights/_in current direction", 0, m_sellpar, 0, 0, 0 }, { "/Select/Lights/overriding default _properties", 0, m_sellover, 0, 0, 0 }, { "/Select/Lights/with answer treatment _enabled", 0, m_selltreat, 0, 0, 0 }, { "/Select/Lights/with _double or more unches", 0, m_selviol, 1, 0, 0 }, { "/Select/Lights/with _triple or more unches", 0, m_selviol, 2, 0, 0 }, { "/Select/Lights/that are _underchecked", 0, m_selviol, 4, 0, 0 }, { "/Select/Lights/that are _overchecked", 0, m_selviol, 8, 0, 0 }, { "/Sy_mmetry", 0, 0, 0, "", 0 }, { "/Symmetry/_None", 0, m_symmclr, 0, 0, 0 }, { "/Symmetry/sep1", 0, 0, 0, "", 0 }, { "/Symmetry/N_o rotational", 0, m_symm0, 0x0101, "", 0 }, { "/Symmetry/_Twofold rotational", 0, m_symm0, 0x0102, "/Symmetry/No rotational" , 0 }, { "/Symmetry/Threefold rotational", 0, m_symm0, 0x0103, "/Symmetry/Twofold rotational" , 0 }, { "/Symmetry/_Fourfold rotational", 0, m_symm0, 0x0104, "/Symmetry/Threefold rotational" , 0 }, { "/Symmetry/Fivefold rotational", 0, m_symm0, 0x0105, "/Symmetry/Fourfold rotational" , 0 }, { "/Symmetry/Sixfold rotational", 0, m_symm0, 0x0106, "/Symmetry/Fivefold rotational" , 0 }, { "/Symmetry/Sevenfold rotational", 0, m_symm0, 0x0107, "/Symmetry/Sixfold rotational" , 0 }, { "/Symmetry/Eightfold rotational", 0, m_symm0, 0x0108, "/Symmetry/Sevenfold rotational" , 0 }, { "/Symmetry/Ninefold rotational", 0, m_symm0, 0x0109, "/Symmetry/Eightfold rotational" , 0 }, { "/Symmetry/Tenfold rotational", 0, m_symm0, 0x010a, "/Symmetry/Ninefold rotational" , 0 }, { "/Symmetry/Elevenfold rotational", 0, m_symm0, 0x010b, "/Symmetry/Tenfold rotational" , 0 }, { "/Symmetry/Twelvefold rotational", 0, m_symm0, 0x010c, "/Symmetry/Elevenfold rotational", 0 }, { "/Symmetry/sep2", 0, 0, 0, "", 0 }, { "/Symmetry/No mirror", 0, m_symm1, 0x0200, "", 0 }, { "/Symmetry/Left-right mirror", 0, m_symm1, 0x0201, "/Symmetry/No mirror", 0 }, { "/Symmetry/Up-down mirror", 0, m_symm1, 0x0202, "/Symmetry/Left-right mirror", 0 }, { "/Symmetry/Both", 0, m_symm1, 0x0203, "/Symmetry/Up-down mirror", 0 }, { "/Symmetry/sep3", 0, 0, 0, "", 0 }, { "/Symmetry/No duplication", 0, m_symm2, 0x0300, "", 0 }, { "/Symmetry/Left-right duplication", 0, m_symm2, 0x0301, "/Symmetry/No duplication", 0 }, { "/Symmetry/Up-down duplication", 0, m_symm2, 0x0302, "/Symmetry/Left-right duplication", 0 }, { "/Symmetry/Both", 0, m_symm2, 0x0303, "/Symmetry/Up-down duplication", 0 }, { "/_Autofill", 0, 0, 0, "", 0 }, { "/Autofill/_Dictionaries...", 0, m_dictionaries, 0, 0, 0 }, { "/Autofill/Anal_yse dictionaries...", 0, m_dstats, 0, 0, 0 }, { "/Autofill/_Alphabet...", 0, m_alphabet, 0, 0, 0 }, { "/Autofill/Answer _treatment...", 0, m_afctreat, 0, 0, 0 }, { "/Autofill/sep1", 0, 0, 0, "", 0 }, { "/Autofill/Auto_fill", "G", m_autofill, 1, "", GTK_STOCK_EXECUTE }, { "/Autofill/Autofill _selected cells", "G", m_autofill, 2, "", GTK_STOCK_EXECUTE }, { "/Autofill/sep2", 0, 0, 0, "", 0 }, { "/Autofill/_Interactive assistance", 0, 0, 0, "", 0 }, { "/Autofill/Interactive assistance/_Off", 0, m_ifamode, 0x0500, "", 0 }, { "/Autofill/Interactive assistance/_Light only", 0, m_ifamode, 0x0501, "/Autofill/Interactive assistance/Off", 0 }, { "/Autofill/Interactive assistance/_Entire grid", 0, m_ifamode, 0x0502, "/Autofill/Interactive assistance/Light only", 0 }, { "/Autofill/Accept _hints", "A", m_accept, 0, 0, 0 }, { "/Autofill/sep2", 0, 0, 0, "", 0 }, { "/Autofill/_Unban all answers", 0, m_unban, 0, 0, 0 }, { "/_Help", 0, 0, 0, "", 0 }, { "/Help/_About", 0, m_helpabout, 0, "", GTK_STOCK_ABOUT }, }; // build main window and other initialisation void startgtk(void) { GtkAccelGroup*accel_group; GtkWidget *vbox,*hbox,*menubar,*zmin,*zmout; // main window and content int w,h; pxsq=zoompx[zoomf]; mainw=gtk_window_new(GTK_WINDOW_TOPLEVEL); // main window gtk_widget_set_name(mainw,"Qxw"); w=gdk_screen_get_width (gdk_display_get_default_screen(gdk_display_get_default())); h=gdk_screen_get_height(gdk_display_get_default_screen(gdk_display_get_default())); if(h<300||h>MAINWHEIGHT) h=MAINWHEIGHT; if(w<400||w>MAINWWIDTH ) w=MAINWWIDTH ; gtk_window_set_default_size(GTK_WINDOW(mainw),w,h); gtk_window_set_title(GTK_WINDOW(mainw),"Qxw"); gtk_window_set_position(GTK_WINDOW(mainw),GTK_WIN_POS_CENTER); // box in the window vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(mainw),vbox); // menu in the vbox accel_group=gtk_accel_group_new(); item_factory=gtk_item_factory_new(GTK_TYPE_MENU_BAR,"
",accel_group); gtk_item_factory_create_items(item_factory,sizeof(menu_items)/sizeof(menu_items[0]),menu_items,NULL); gtk_window_add_accel_group(GTK_WINDOW(mainw),accel_group); menubar=gtk_item_factory_get_widget(item_factory,"
"); gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0); // window is divided into two parts, or `panes' paned=gtk_hpaned_new(); gtk_box_pack_start(GTK_BOX(vbox),paned,TRUE,TRUE,0); // scrolled windows in the panes grid_sw=gtk_scrolled_window_new(NULL,NULL); gtk_container_set_border_width(GTK_CONTAINER(grid_sw),10); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(grid_sw),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_paned_pack1(GTK_PANED(paned),grid_sw,1,1); list_sw=gtk_scrolled_window_new(NULL,NULL); gtk_container_set_border_width(GTK_CONTAINER(list_sw),10); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(list_sw),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_paned_pack2(GTK_PANED(paned),list_sw,0,1); gtk_paned_set_position(GTK_PANED(paned),MAINWWIDTH-FLISTWIDTH); // drawing area for grid and events it captures grid_da=gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(grid_da),100,100); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(grid_sw),grid_da); GTK_WIDGET_SET_FLAGS(grid_da,GTK_CAN_FOCUS); gtk_widget_set_events(grid_da,GDK_EXPOSURE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_KEY_PRESS_MASK|GDK_POINTER_MOTION_MASK|GDK_SCROLL_MASK); // list of feasible words // clist=gtk_clist_new(2); clist=gtk_clist_new(1); gtk_clist_set_column_width(GTK_CLIST(clist),0,FLISTWIDTH-38); // gtk_clist_set_column_width(GTK_CLIST(clist),1,80); gtk_clist_set_column_title(GTK_CLIST(clist),0,"Feasible words"); // gtk_clist_set_column_title(GTK_CLIST(clist),1,"Scores"); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_container_add(GTK_CONTAINER(list_sw),clist); g_signal_connect(clist,"button-press-event",GTK_SIGNAL_FUNC(clist_button),NULL); // box for widgets across the bottom of the window hbox=gtk_hbox_new(FALSE,0); zmout=gtk_button_new(); gtk_button_set_image(GTK_BUTTON(zmout),gtk_image_new_from_stock(GTK_STOCK_ZOOM_OUT,GTK_ICON_SIZE_MENU)); gtk_box_pack_start(GTK_BOX(hbox),zmout,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(zmout),"clicked",GTK_SIGNAL_FUNC(m_zoom),(gpointer)-2); zmin =gtk_button_new(); gtk_button_set_image(GTK_BUTTON(zmin ),gtk_image_new_from_stock(GTK_STOCK_ZOOM_IN ,GTK_ICON_SIZE_MENU)); gtk_box_pack_start(GTK_BOX(hbox),zmin ,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(zmin ),"clicked",GTK_SIGNAL_FUNC(m_zoom),(gpointer)-1); poss_label=gtk_label_new(" Feasible characters:"); gtk_box_pack_start(GTK_BOX(hbox),poss_label,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(grid_da),"expose_event",GTK_SIGNAL_FUNC(expose_event),NULL); gtk_signal_connect(GTK_OBJECT(grid_da),"configure_event",GTK_SIGNAL_FUNC(configure_event),NULL); gtk_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(selrow),NULL); gtk_signal_connect(GTK_OBJECT(grid_da),"button_press_event",GTK_SIGNAL_FUNC(button_press_event),NULL); gtk_signal_connect(GTK_OBJECT(grid_da),"button_release_event",GTK_SIGNAL_FUNC(button_press_event),NULL); gtk_signal_connect_after(GTK_OBJECT(grid_da),"key_press_event",GTK_SIGNAL_FUNC(keypress),NULL); gtk_signal_connect(GTK_OBJECT(grid_da),"motion_notify_event",GTK_SIGNAL_FUNC(mousemove),NULL); gtk_signal_connect(GTK_OBJECT(grid_da),"scroll-event",GTK_SIGNAL_FUNC(mousescroll),NULL); gtk_signal_connect(GTK_OBJECT(mainw),"delete_event",GTK_SIGNAL_FUNC(w_delete),NULL); gtk_signal_connect(GTK_OBJECT(mainw),"destroy",GTK_SIGNAL_FUNC(w_destroy),NULL); gtk_widget_show_all(mainw); gtk_window_set_focus(GTK_WINDOW(mainw),grid_da); } void stopgtk(void) { } qxw-20200708/qxw.c0000664000175000017500000022660313674706260011416 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #ifdef _WIN32 #include #include #include #include "pfgetopt.h" #else #include #include #endif #include #include #include #include #include #include #include #include #include "common.h" #include "qxw.h" #include "filler.h" #include "dicts.h" #include "treatment.h" #include "gui.h" #include "draw.h" #include "deck.h" #include "alphabets.h" // GLOBAL PARAMETERS // these are saved: int width=12,height=12; // grid size int gtype=0; // grid type: 0=square, 1=hexH, 2=hexV, 3=circleA (edge at 12 o'clock), 4=circleB (cell at 12 o'clock) // 5=cylinder L-R, 6=cylinder T-B, 7=Moebius L-R, 8=Moebius T-B, 9=torus int symmr=2,symmm=0,symmd=0; // symmetry mode flags (rotation, mirror, up-and-down/left-and-right) int nvl=0; // number of virtual lights struct sprop dsp; // default square properties struct lprop dlp; // default light properties char gtitle[SLEN]=""; char gauthor[SLEN]=""; // these are not saved: int debug=0; // debug level int usegui=1; // 0=use text console; 1=use GUI unsigned int fseed; // force filler srand() argument if non-zero char filename[SLEN+50]; // result from filedia() char filenamebase[SLEN]; // base to use for constructing default filenames int havesavefn; // do we have a validated filename to save to? int curx=0,cury=0,curdir=0,curmux=0; // cursor position, direction and multiplex int curent=-1; // entry pointed to by cursor (set by bldstructs(); -1 if not set) int curword=-1; // word pointed to by cursor (set by bldstructs(); -1 if not set) int unsaved=0; // edited-since-save flag int cwperm[MAXICC]; int ndir[NGTYPE] ={2,3,3,2,2, 2,2,2,2,2,2,2,2}; // number of directions per grid type int gshape[NGTYPE]={0,1,2,3,4, 0,0,0,0,0,0,0,0}; // basic shape of grid int dhflip[NGTYPE][MAXNDIR*2]={ {2,1,0,3}, {4,3,2,1,0,5}, {3,2,1,0,5,4}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3}, {2,1,0,3} }; int dvflip[NGTYPE][MAXNDIR*2]={ {0,3,2,1}, {1,0,5,4,3,2}, {0,5,4,3,2,1}, {2,1,0,3}, {2,1,0,3}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1}, {0,3,2,1} }; static unsigned char log2lut[65536]; int cbits(ABM x) {ABM i; int j; for(i=1,j=0;i>16)&0xffff; if(u) return log2lut[u]+16; u=(x>>32)&0xffff; if(u) return log2lut[u]+32; u=(x>>48)&0xffff; if(u) return log2lut[u]+48; return -1; } int*llistp=0; // ptr to matching lights int llistn=0; // number of matching lights unsigned int llistdm=0; // dictionary mask applicable to matching lights int llistwlen=0; // word length (less tags if any) applicable to matching lights int llistem=0; // entry method mask applicable to matching lights int*llist=0; // buffer for light index list int ifamode=2; // interactive fill assist mode // GRID struct square gsq[MXSZ][MXSZ]; struct vl vls[NVL]; int getnumber(int x,int y) { return gsq[x][y].number; } int getflags(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return gsq[xr][yr].fl; } int getbgcol(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return (gsq[xr][yr].sp.spor?gsq[xr][yr].sp.bgcol:dsp.bgcol)&0xffffff; } int getfgcol(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return (gsq[xr][yr].sp.spor?gsq[xr][yr].sp.fgcol:dsp.fgcol)&0xffffff; } int getmkcol(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return (gsq[xr][yr].sp.spor?gsq[xr][yr].sp.mkcol:dsp.mkcol)&0xffffff; } int getfstyle(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return gsq[xr][yr].sp.spor?gsq[xr][yr].sp.fstyle:dsp.fstyle; } int getdech(int x,int y) {int xr,yr; getmergerep(&xr,&yr,x,y); return gsq[xr][yr].sp.spor?gsq[xr][yr].sp.dech:dsp.dech; } int getctlen(int x,int y,int d) {int xr,yr; getmergerep(&xr,&yr,x,y); if((gsq[xr][yr].sp.spor?gsq[xr][yr].sp.dech:dsp.dech)==0) d=0; return gsq[xr][yr].ctlen[d]; } struct lprop*getvlprop(int d) { return vls[d].lp.lpor?&vls[d].lp:&dlp; } struct lprop*getlprop(int x,int y,int d) { if(d>=100) return getvlprop(d-100); return gsq[x][y].lp[d].lpor?&gsq[x][y].lp[d]:&dlp; } // returns 0 for error int getmaxmux(int x,int y,int d) { int tx[MXCL],ty[MXCL],i,l,m,u; if(!ismux(x,y,d)) return 1; m=1; l=getlight(tx,ty,x,y,d); if(l<1) return 0; for(i=0;im) m=u; } return m; } void getmk(char*s,int x,int y,int c) {int d,nd,nd2,xr,yr; char*t; strcpy(s,""); getmergerep(&xr,&yr,x,y); t=gsq[xr][yr].sp.spor?gsq[xr][yr].sp.mk[c]:dsp.mk[c]; if(!strcmp(t,"\\#")) goto ew0; // if number, put it wherever necessary if(!strcmp(t,"\\o")) { // if circle, only do in first cell of group if(x!=xr||y!=yr) return; goto ew0; } d=getmergedir(x,y); // otherwise only in extreme corners of merge group nd=ndir[gtype]; nd2=nd+nd; if(d>=0) { if(!ismerge(x,y,d )&&(c-1-d+nd2)%nd2< nd) goto ew0; // end of group d=0:1,2/d=1:2,3 if(!ismerge(x,y,d+nd)&&(c-1-d+nd2)%nd2>=nd) goto ew0; else return; } ew0: strcpy(s,t); } // move backwards one cell in direction d void stepback(int*x,int*y,int d) { // printf("stepback(%d,%d,%d)\n",*x,*y,d); if(d>=ndir[gtype]) {stepforw(x,y,d-ndir[gtype]); return;} if(gtype==1) { switch(d) { case 0: if(((*x)&1)==1) (*y)++; (*x)--; break; case 1: if(((*x)&1)==0) (*y)--; (*x)--; break; case 2: (*y)--;break; } return; } if(gtype==2) { switch(d) { case 2: if(((*y)&1)==1) (*x)++; (*y)--; break; case 1: if(((*y)&1)==0) (*x)--; (*y)--; break; case 0: (*x)--;break; } return; } // rectangular grid cases if(d) (*y)--; else (*x)--; if(gtype==3||gtype==4||gtype==5||gtype==7||gtype==9||gtype==10||gtype==11||gtype==12) { // loop in x direction if(*x<0) { *x+=width; if(gtype==7||gtype==10||gtype==12) *y=height-1-*y; } } if(gtype==6||gtype==8||gtype==9||gtype==10||gtype==11||gtype==12) { // loop in y direction if(*y<0) { *y+=height; if(gtype==8||gtype==11||gtype==12) *x=width-1-*x; } } // printf("=(%d,%d)\n",*x,*y); } // move forwards one cell in direction d void stepforw(int*x,int*y,int d) { // printf("stepforw(%d,%d,%d)\n",*x,*y,d); if(d>=ndir[gtype]) {stepback(x,y,d-ndir[gtype]); return;} if(gtype==1) { switch(d) { case 0: (*x)++; if(((*x)&1)==1) (*y)--; break; case 1: (*x)++; if(((*x)&1)==0) (*y)++; break; case 2: (*y)++;break; } return; } if(gtype==2) { switch(d) { case 2: (*y)++; if(((*y)&1)==1) (*x)--; break; case 1: (*y)++; if(((*y)&1)==0) (*x)++; break; case 0: (*x)++;break; } return; } // rectangular grid cases if(d) (*y)++; else (*x)++; if(gtype==3||gtype==4||gtype==5||gtype==7||gtype==9||gtype==10||gtype==11||gtype==12) { // loop in x direction if(*x>=width) { *x-=width; if(gtype==7||gtype==10||gtype==12) *y=height-1-*y; } } if(gtype==6||gtype==8||gtype==9||gtype==10||gtype==11||gtype==12) { // loop in y direction if(*y>=height) { *y-=height; if(gtype==8||gtype==11||gtype==12) *x=width-1-*x; } } // printf("=(%d,%d)\n",*x,*y); } int isingrid(int x,int y) { if(x<0||y<0||x>=width||y>=height) return 0; if(gshape[gtype]==1&&ODD(width )&&ODD(x)&&y==height-1) return 0; if(gshape[gtype]==2&&ODD(height)&&ODD(y)&&x==width -1) return 0; return 1; } int isclear(int x,int y) { if(!isingrid(x,y)) return 0; if(gsq[x][y].fl&0x09) return 0; return 1; } int isbar(int x,int y,int d) {int u; if(d>=ndir[gtype]) {d-=ndir[gtype];stepback(&x,&y,d);} if(!isingrid(x,y)) return 0; u=(gsq[x][y].bars>>d)&1; // DEB_GR printf(" x=%d y=%d d=%d u=%d g[x,y].bars=%08x\n",x,y,d,u,gsq[x][y].bars); stepforw(&x,&y,d); if(!isingrid(x,y)) return 0; return u; } int ismerge(int x,int y,int d) {int u; if(d>=ndir[gtype]) {d-=ndir[gtype];stepback(&x,&y,d);} if(!isingrid(x,y)) return 0; u=(gsq[x][y].merge>>d)&1; stepforw(&x,&y,d); if(!isingrid(x,y)) return 0; return u; } int sqexists(int i,int j) { // is a square within the grid (and not cut out)? if(!isingrid(i,j)) return 0; return !(gsq[i][j].fl&8); } // is a step backwards clear? (not obstructed by a bar, block, cutout or edge of grid) int clearbefore(int x,int y,int d) {int tx,ty; tx=x;ty=y;stepback(&tx,&ty,d); if(!isingrid(tx,ty)) return 0; if(!isclear(tx,ty)) return 0; if(isbar(tx,ty,d)) return 0; return 1; } // is a step forwards clear? int clearafter(int x,int y,int d) {int tx,ty; tx=x;ty=y;stepforw(&tx,&ty,d); if(!isingrid(tx,ty)) return 0; if(!isclear(tx,ty)) return 0; if(isbar(x,y,d)) return 0; return 1; } // move forwards one (merged) cell in direction d static void stepforwm(int*x,int*y,int d) {int x0,y0; x0=*x;y0=*y; while(ismerge(*x,*y,d)) {stepforw(x,y,d);if(*x==x0&&*y==y0) return;} // can loop e.g. in circular grids stepforw(x,y,d); } // move backwards one (merged) cell in direction d static void stepbackm(int*x,int*y,int d) {int x0,y0,od; x0=*x;y0=*y; od=(d+ndir[gtype])%(ndir[gtype]*2); // opposite direction stepback(x,y,d); if(*x==x0&&*y==y0) return; while(ismerge(*x,*y,od)) {stepback(x,y,d);if(*x==x0&&*y==y0) return;} } // is a step forwards clear? static int clearafterm(int x,int y,int d) {int tx,ty; tx=x;ty=y;stepforwm(&tx,&ty,d); if(x==tx&&y==ty) return 0; if(!isingrid(tx,ty)) return 0; if(!isclear(tx,ty)) return 0; stepback(&tx,&ty,d); if(isbar(tx,ty,d)) return 0; return 1; } int stepbackifingrid (int*x,int*y,int d) {int tx,ty; tx=*x;ty=*y; stepback (&tx,&ty,d);if(!isingrid(tx,ty)) return 0; *x=tx;*y=ty; return 1;} //static int stepforwifingrid (int*x,int*y,int d) {int tx,ty; tx=*x;ty=*y; stepforw (&tx,&ty,d);if(!isingrid(tx,ty)) return 0; *x=tx;*y=ty; return 1;} // not currently used int stepforwmifingrid(int*x,int*y,int d) {int tx,ty; tx=*x;ty=*y; stepforwm(&tx,&ty,d);if(!isingrid(tx,ty)) return 0; *x=tx;*y=ty; return 1;} int stepbackmifingrid(int*x,int*y,int d) {int tx,ty; tx=*x;ty=*y; stepbackm(&tx,&ty,d);if(!isingrid(tx,ty)) return 0; *x=tx;*y=ty; return 1;} void getmergerepd(int*mx,int*my,int x,int y,int d) {int x0,y0; // find merge representative, direction d (0<=d=0); return getmergegroupd(gx,gy,x,y,d); } int isstartoflight(int x,int y,int d) { if(!isclear(x,y)) return 0; if(clearbefore(x,y,d)) return 0; if(clearafterm(x,y,d)) return 1; return 0; } // returns: // -1: looped, no light found // 0: blocked, no light found // 1: light found, start (not mergerep'ed) stored in *lx,*ly static int getstartoflight(int*lx,int*ly,int x,int y,int d) {int x0,y0; if(!isclear(x,y)) return 0; x0=x;y0=y; while(clearbefore(x,y,d)) { stepback(&x,&y,d); // to start of light if(x==x0&&y==y0) return -1; // loop found } *lx=x;*ly=y; return 1; } int ismux(int x,int y,int d) { int l,lx,ly; if(d>=100) return 0; // virtual light? l=getstartoflight(&lx,&ly,x,y,d); if(l<1) return 0; if(!isstartoflight(lx,ly,d)) return 0; // not actually a light return getlprop(lx,ly,d)->mux; } // is light selected? int issellight(int x,int y,int d) {int l,lx,ly; l=getstartoflight(&lx,&ly,x,y,d); if(l<1) return 0; if(!isstartoflight(lx,ly,d)) return 0; // not actually a light return (gsq[lx][ly].dsel>>d)&1; } // set selected flag on a light to k void sellight(int x,int y,int d,int k) {int l,lx,ly; DEB_GR printf("sellight(%d,%d,%d,%d)\n",x,y,d,k); l=getstartoflight(&lx,&ly,x,y,d); if(l<1) return; if(!isstartoflight(lx,ly,d)) return; // not actually a light gsq[lx][ly].dsel=(gsq[lx][ly].dsel&(~(1<=2: length of light (lx[0..n-1], ly[0..n-1] set), can be up to MXCL for VL, up to MXSZ*2 in Mobius case // if d>=100 returns data for VL #d-100 // result is independent of multiplex property of light int getlightd(int*lx,int*ly,int x,int y,int d) {int i,j; if(d>=100) { d-=100; for(i=0,j=0;i=100 returns data for VL #d-100 // errors as for getlightd() // result is independent of multiplex property of light int getlight(int*lx,int*ly,int x,int y,int d) {int i,l; l=getlightd(lx,ly,x,y,d); for(i=0;i=100 returns data for VL #d-100 // for non-mux light mx=0; for multiplexed light mx=desired multiplex number // returns -2 if light overflows plus errors as for getlightd() // lp: bitmap ptrs (<=MXLE) // lx: mergerep square x (<=MXLE) // ly: mergerep square y (<=MXLE) // ls: index of contributing string (<=MXLE) // lo: offset in contributing string (<=MXLE) // le: entry number (<=MXLE) int getlightdat(ABM**lp,int*lx,int*ly,int*ls,int*lo,struct entry**le,int x0,int y0,int d,int mx) { int c,i,j,k,k0,k1,l,m,tx[MXCL],ty[MXCL],x,y; l=getlight(tx,ty,x0,y0,d); if(l<1) return l; if(!ismux(x0,y0,d)) mx=-1; for(i=0,m=0;i=ndir[gtype]) {d-=ndir[gtype];stepback(&x,&y,d);} if(!isingrid(x,y)) return; if(k) k=1; gsq[x][y].merge&=~(1<=ndir[gtype]) {d-=ndir[gtype];stepback(&x,&y,d);} if(!isingrid(x,y)) return; if(k) k=1; gsq[x][y].bars &=~(1<=width) i=(i-width)|1;} // special case for hexH grid else i=i0; if(isclear(i,j)) { if(isownmergerep(i,j)&&(gsq[i][j].sp.spor?gsq[i][j].sp.ten:dsp.ten)) gsq[i][j].goi=goi++; for(d=0;ddnran) {gsq[i][j].number=num++; break;} } } } } // add word to filler data, starting at (i,j) in direction d // if d>=100, add virtual light #d-100 // for non-mux light mx=0; for multiplexed light mx=desired multiplex number // return: // 0: OK // 1: too long // 2: ignored as dmask is zero static int addwordfd(int i,int j,int d,int mx) { int k,l,lx[MXLE],ly[MXLE]; struct entry*le[MXLE]; ABM*lcp[MXLE]; struct lprop*lp; lp=getlprop(i,j,d); if(lp->dmask==0) return 2; // skip if dictionary mask empty l=getlightdat(lcp,lx,ly,0,0,le,i,j,d,mx); if(l<1) return 1; // too long: ignore DEB_BS printf("new word %d: l=%d mx=%d\n",nw,l,mx); words[nw].gx0=i; words[nw].gy0=j; if(d<100) { gsq[i][j].w[d][mx]=words+nw; words[nw].ldir=d; } else { vls[d-100].w=words+nw; words[nw].ldir=d; } words[nw].lp=lp; for(k=0;kten&&treatmode>0) ntw++; return 0; } void freewords() { int i; if(words) for(i=0;iten) { if(treatorder[i]>0) entries[ne].flbm=treatcstr[i][l]; else entries[ne].flbm=ABM_ALL; entries[ne].sel=1; // make sure we fill even if only in "fill selection" mode entries[ne].checking=2; if(l==MXFL) st_tmtlf=1; // too many treated lights for filler to use discretion if(l0) nw++; // don't create an empty word, and don't create one for first come first served entry } } } // build structures for solver and compile statistics // 0: OK // 1: too complex // Ensure filler is stopped before calling this (reallocates e.g. words[]) static int bldstructs(void) { int cnw,cne,d,i,j,k,l,m,nd,v; int ml,mm,curk,curl; unsigned char unch[MXLE]; ABM c; curent=-1; curword=-1; initstructs(); cnw=0; // count words for(d=0;d=100) curk=0; // cursor "points" at first character in case of VL for(k=0;kchecking++; st_ce=0; for(i=0;i1) st_ce++; // number of checked squares st_sc=0;st_2u=0;st_3u=0; for(i=0;ichecking<=1); if(!unch[j]) k++; // count checked cells in word if(j>0&&unch[j]&&unch[j-1] ) v|=1; // double unch? if(j>1&&unch[j]&&unch[j-1]&&unch[j-2]) v|=2; // triple+ unch? } if(v&1) st_2u++; // double+ unch? if(v&2) st_3u++; // triple+ unch? // k is now number of checked cells (out of l total) if( k *100l*maxcheck) st_locc[l]++,v|=8; st_lsc[l]+=k; if(kst_lmxc[l]) st_lmxc[l]=k; st_sc+=k; if(words[i].ldir=0;i--) { if((i*symmr)%6==0) { rot6(&x0,&y0,x,y,i); x0+=mx;y0+=my; assert(x0%6==0); x0/=6; y0-=(x0&1)*2; assert(y0%4==0); y0/=4; symmdo1(f,k,x0,y0,(d+i)%6); } } break; case 2: getcrot(&mx,&my); x=x*4+(y&1)*2-mx;y=y*6-my; for(i=5;i>=0;i--) { if((i*symmr)%6==0) { rot6(&y0,&x0,y,x,i); x0+=mx;y0+=my; assert(y0%6==0); y0/=6; x0-=(y0&1)*2; assert(x0%4==0); x0/=4; symmdo1(f,k,x0,y0,(d-i+6)%6); } } break; case 3: case 4: if(symmr==0) break; // assertion for(i=symmr-1;i>=0;i--) symmdo1(f,k,(x+i*width/symmr)%width,y,d); break; } } // basic grid editing commands (candidates for f() in symmdo above) void a_editblock (int k,int x,int y,int d) {int l,gx[MXCL],gy[MXCL]; l=getmergegroup(gx,gy,x,y); gsq[x][y].fl=(gsq[x][y].fl&0x06)|1; demerge(x,y); refreshsqlist(l,gx,gy); } void a_editempty (int k,int x,int y,int d) { gsq[x][y].fl= gsq[x][y].fl&0x16; refreshsqmg(x,y); } void a_editcutout(int k,int x,int y,int d) {int l,gx[MXCL],gy[MXCL]; l=getmergegroup(gx,gy,x,y); gsq[x][y].fl=(gsq[x][y].fl&0x06)|8; demerge(x,y); refreshsqlist(l,gx,gy); } // set bar state in direction d to k void a_editbar(int k,int x,int y,int d) {int tx,ty; if(!isingrid(x,y)) return; tx=x;ty=y; stepforw(&tx,&ty,d); // printf("<%d,%d %d,%d %d>\n",x,y,tx,ty,d); if(!isingrid(tx,ty)) return; setbars(x,y,d,k); refreshsqmg(x,y); refreshsqmg(tx,ty); donumbers(); } // set merge state in direction d to k, deal with consequences void a_editmerge(int k,int x,int y,int d) {int f,i,l,tl,tx,ty,gx[MXCL],gy[MXCL],tgx[MXCL],tgy[MXCL]; if(!isclear(x,y)) return; tx=x;ty=y; stepforw(&tx,&ty,d); if(!isclear(tx,ty)) return; l=getmergegroup(gx,gy,x,y); tl=getmergegroup(tgx,tgy,tx,ty); if(k) for(i=0;ipw_dir)>SLEN-20) return 0; strcpy(s,p->pw_dir); strcat(s,"/.qxw"); if(mode==0) mkdir(s,0777); strcat(s,"/preferences"); return g_fopen(s,mode?"r":"w"); #endif } // read preferences from file // fail silently static void loadprefs() { FILE*fp; char s[SLEN],*q; int i,u; fp=openprefs(1); if(!fp) return; while (fgets(s, SLEN, fp)) { q=strchr(s,' '); if(!q) continue; *q++=0; i=strlen(q); while(i>0&&iscntrl((unsigned char)q[i-1])) q[--i]=0; for(i=0;iprefmaxv[i]) u=prefmaxv[i]; prefdata[i]=u; break; case 1: strcpy(prefstring[i],q); break; default: break; } } } fclose(fp); } // write preferences to file // fail silently void saveprefs(void) { FILE*fp; int i; fp=openprefs(0); if(!fp) return; for(i=0;i=ndir[gtype]) curdir=0; if(curx>=width) curx=width -1; if(cury>=height) cury=height-1; } static char*defaultmk(int k) {return k?"":"\\#";} // default mark is just number in NW corner // convert ABM to UTF-8 choice string of the form [a-eghq-z0-39], using inverting notation if inv==1 and // including "-" if dash==1 // return number of characters in UTF-8 string static int abmtocs(char*s,ABM b,int inv,int dash) { int c0,c1,w=0; *s=0; strcat(s,"["),w++; if(inv) strcat(s,"^"),w++,b^=dash?ABM_ALL:ABM_NRM; b&=abm_use|ABM_DASH; for(c0=1;;) { for(;c01&&!iccseq[c1-1]) break; } strcat(s,icctoutf8[c0]),w++; if(c1-c0>1) { if(c1-c0>2) strcat(s,"-"),w++; strcat(s,icctoutf8[c1-1]),w++; } c0=c1; } if(dash&&(b&ABM_DASH)) strcat(s,"-"),w++; strcat(s,"]"),w++; return w; } // convert ABM to UTF-8 string of the form "s" or "[aeiou]" or whatever // MAXICC*16+4 is a very safe upper bound on the resulting length void abmtostr(char*s,ABM b,int dash) { int w0,w1; char s0[MAXICC*16+4],s1[MAXICC*16+4]; b&=dash?ABM_ALL:ABM_NRM; if((b&(abm_use|ABM_DASH))==(abm_use|ABM_DASH)) {strcpy(s,"?"); return;} if((b& abm_use )== abm_use ) {strcpy(s,"."); return;} if(b==abm_vow) {strcpy(s,"@"); return;} if(b==abm_con) {strcpy(s,"#"); return;} if(onebit(b)) {strcpy(s,icctoutf8[abmtoicc(b)]); return;} w0=abmtocs(s0,b,0,dash); w1=abmtocs(s1,b,1,dash); // printf("abmtostr: %016llx %s %s\n",b,s0,s1); if(w0<=w1) strcpy(s,s0); // choose shorter of the two representations else strcpy(s,s1); } // convert sequence of ABMs to UTF-8 string in compact format suitable for display void abmstodispstr(char*s,ABM*b,int l) {int c,i; s[0]=0; for(i=0;i%s<",s0); // for(i=0;t[i];i++) printf(" %08x",t[i]); // printf("\n"); for(i=0,s=t;*s&&ic0) c1=c; else c0=c; // found a range: sort bounds s+=2; } } for(c=c0;c<=c1;c++) b|=ICCTOABM(c); s++; } if(*s==']') s++; if(f) b^=dash?ABM_ALL:ABM_NRM; // negation flag } else if(c>0) b=ICCTOABM(c),s++; else {s++; continue;} // skip unrecognised characters (includes BOM) b&=dash?ABM_ALL:ABM_NRM; p[i++]=b; } return i; } static void resetsp(struct sprop*p) {int k; p->bgcol=0xffffff; p->fgcol=0x000000; p->mkcol=0x000000; p->fstyle=0; p->dech=0; p->ten=0; // for(k=0;kmk[k],"%c",k+'a'); // for testing for(k=0;kmk[k],defaultmk(k)); p->spor=0; } void resetlp(struct lprop*p) { p->dmask=1; p->emask=EM_FWD; p->ten=0; p->dnran=0; p->mux=0; p->lpor=0; } // generate "codeword" permutation cwperm mapping ICC to ICC void initcodeword() { int i,j,k,p[MAXICC],u0,u1; for(i=1,j=0;i=0&&iccusedtogroup[k]==0) { // skip non-letters cwperm[i]=j+1; // count from 1 p[j]=i; j++; } } // here there are j permutable letters, indices in p[] if(j>1) // something worth permuting? for(i=0;ibgcol&=0xffffff; sp->fgcol&=0xffffff; sp->mkcol&=0xffffff; // if(sp->fstyle<0) sp->fstyle=0; if(sp->fstyle>3) sp->fstyle=3; sp->ten=!!sp->ten; // if(sp->dech<0) sp->dech=0; if(sp->dech>2) sp->dech=2; sp->spor=!!sp->spor; } // tidy up light properties structure static void fixlp(struct lprop*lp) { lp->dmask&=(1<emask&=(1<emask==0) lp->emask=EM_FWD; lp->ten=!!lp->ten; lp->lpor=!!lp->lpor; lp->dnran=!!lp->dnran; } // FILE SAVE/LOAD FILE* q_fopen(char* filename, char* mode) { #ifdef _WIN32 wchar_t wfilename[SLEN]; wchar_t wmode[4]; MultiByteToWideChar(CP_UTF8, 0, filename, -1, wfilename, SLEN); MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, 4); return _wfopen(wfilename, wmode); #else return g_fopen(filename, mode); #endif } // flags b23..16: grid width // flags b15..8: grid height // flags b7..0: grain void a_filenew(int flags) { char*p; int u,v,x,y; filler_stop(); resetstate(); u=(flags>>16)&0xff; v=(flags>>8)&0xff; if(u>0&&u<=MXSZ&&v>0&&vSLEN-20) strcpy(filenamebase,""); else strcat(filenamebase,"\\"); } else strcpy(filenamebase,""); #else struct passwd*pw; pw=getpwuid(getuid()); if(!pw||strlen(pw->pw_dir)>SLEN-20) strcpy(filenamebase,""); else strcpy(filenamebase,pw->pw_dir),strcat(filenamebase,"/"); #endif } else { // we have a path to start from p=strrchr(filenamebase,DIR_SEP_CHAR); if(p) strcpy(p,DIR_SEP_STR); else strcpy(filenamebase,""); } strcat(filenamebase,"untitled"); havesavefn=0; donumbers(); undo_push(); unsaved=0; } #define SAVE_VERSION 5 // read next line from file, strip terminators so compatible with MS-DOS and Unix #define NEXTL {if(!fgets(s,SLEN*4-1,fp)) goto ew1; l=strlen(s); while(l>0&&iscntrl((unsigned char)s[l-1])) s[--l]='\0';} #define NEXTLN {if(!fgets(s,SLEN*4-1,fp)) goto ew4; l=strlen(s); while(l>0&&iscntrl((unsigned char)s[l-1])) s[--l]='\0';} // fail gracefully on EOF // load state from file void a_load(void) { int d,i,j,k,l,n,u,t0,t1,t2,t3,b,m,f,wf,ver; char *p,s[SLEN*4],s0[SLEN*4],*t,c; struct sprop sp; struct lprop lp; FILE*fp; filler_stop(); DEB_GR printf("filler stopped: loading\n"); setfilenamebase(filename); fp=q_fopen(filename,"r"); if(!fp) {fserror();return;} resetstate(); initalphamap(alphainitdata[ALPHABET_AZ09]); // default for legacy save files and .SYM *gtitle=0; *gauthor=0; NEXTL; wf=0; if(STRSTARTS(s,"#QXW2")) { // #QXW2 load ver=0; if(s[5]=='v'&&isdigit((unsigned char)s[6])) ver=atoi(s+6); if(ver>SAVE_VERSION) wf=1; // check if the file was saved using a newer version if(ver>=4) clearalphamap(); // ver>=4 will include alphabet information NEXTL; if(sscanf(s,"GP %d %d %d %d %d %d\n",>ype,&width,&height,&symmr,&symmm,&symmd)!=6) goto ew1; if(gtype<0||gtype>=NGTYPE|| // validate basic parameters width<1||width>MXSZ|| height<1||height>MXSZ) goto ew1; if(symmr<1||symmr>12) symmr=1; if(symmm<0||symmm>3) symmm=0; if(symmd<0||symmd>3) symmd=0; if((symmr&symmrmask())==0) symmr=1; draw_init(); NEXTL; if(strcmp(s,"TTL")) goto ew1; NEXTL; if(s[0]!='+') goto ew1; strncpy(gtitle,s+1,SLEN-1); gtitle[SLEN-1]=0; NEXTL; if(strcmp(s,"AUT")) goto ew1; NEXTL; if(s[0]!='+') goto ew1; strncpy(gauthor,s+1,SLEN-1); gauthor[SLEN-1]=0; DEB_GR printf("L0\n"); NEXTL; while(STRSTARTS(s,"ALP ")) { if(sscanf(s,"ALP %d %d %d %d\n",&i,&t0,&t1,&t2)<4) goto ew1; NEXTL; if(s[0]!='+') goto ew1; strcpy(s0,s); NEXTL; if(s[0]!='+') goto ew1; if(s0[1]) addalphamapentry(i,s0+1,s+1,!!t0,!!t1,!!t2); // add entry if non-empty NEXTL; } if(STRSTARTS(s,"GLP ")) { int ten,lpor,dnran=0,mux=0; resetlp(&dlp); if(sscanf(s,"GLP %u %u %d %d %d %d\n",&dlp.dmask,&dlp.emask,&ten,&lpor,&dnran,&mux)<4) goto ew1; dlp.ten=ten; // using %hhd above fails in Visual C dlp.lpor=0; dlp.dnran=dnran; dlp.mux=mux; fixlp(&dlp); NEXTL; } while(STRSTARTS(s,"GSP ")) { int ten,spor,fstyle=0,dech=0; resetsp(&dsp); if(sscanf(s,"GSP %x %x %d %d %d %d %x\n",&dsp.bgcol,&dsp.fgcol,&ten,&spor,&fstyle,&dech,&dsp.mkcol)<4) goto ew1; dsp.ten=ten; dsp.spor=0; dsp.fstyle=fstyle; dsp.dech=dech; fixsp(&dsp); NEXTL; } while(STRSTARTS(s,"GSPMK ")) { if(sscanf(s,"GSPMK %d\n",&k)<1) goto ew1; if(k<0||k>=MAXNMK) continue; NEXTL; if(s[0]=='+') { strncpy(dsp.mk[k],s+1,MXMK); dsp.mk[k][MXMK]='\0'; } NEXTL; } while(STRSTARTS(s,"TM ")) { t2=0; t3=0; if(sscanf(s,"TM %d %d %d %d %d\n",&j,&t0,&t1,&t2,&t3)<3) goto ew1; NEXTL; if(j==0&&s[0]=='+') { if(t0<0||t0>=NATREAT) continue; treatmode=t0,tambaw=!!t1; if(t2<0||t2>2) t2=0; treatorder[0]=t2; if(t3<0||t3>2) t3=0; treatorder[1]=t3; if(treatmode==TREAT_PLUGIN) { strncpy(tpifname,s+1,SLEN-1); tpifname[SLEN-1]=0; } NEXTL; } } while(STRSTARTS(s,"TMSG ")) { if(sscanf(s,"TMSG %d %d\n",&j,&t0)!=2) goto ew1; NEXTL; if(j==0&&s[0]=='+') { if(t0<0||t0>=NMSG) continue; strncpy(treatmsg[t0],s+1,sizeof(treatmsg[0])-1); treatmsg[t0][sizeof(treatmsg[0])-1]=0; NEXTL; } } while(STRSTARTS(s,"TCST ")) { if(sscanf(s,"TCST %d %d %s\n",&i,&j,s0)!=3) goto ew1; if(i>=0&&i=0&&j=MAXNDICTS) continue; if(s[0]=='+') { strncpy(dfnames[j],s+1,SLEN-1); dfnames[j][SLEN-1]=0; NEXTL; } } while(STRSTARTS(s,"DSF ")) { if(sscanf(s,"DSF %d\n",&j)!=1) goto ew1; NEXTL; if(j<0||j>=MAXNDICTS) continue; if(s[0]=='+') { strncpy(dsfilters[j],s+1,SLEN-1); dsfilters[j][SLEN-1]=0; NEXTL; } } while(STRSTARTS(s,"DAF ")) { if(sscanf(s,"DAF %d\n",&j)!=1) goto ew1; NEXTL; if(j<0||j>=MAXNDICTS) continue; if(s[0]=='+') { strncpy(dafilters[j],s+1,SLEN-1); dafilters[j][SLEN-1]=0; NEXTL; } } DEB_GR printf("L1: %s\n",s); while(STRSTARTS(s,"SQ ")) { c=' '; // DEB_GR printf("SQ: "); if(sscanf(s,"SQ %d %d %d %d %d %c\n",&i,&j,&b,&m,&f,&c)<5) goto ew1; // DEB_GR printf("%d,%d %d\n",i,j,b); if(i<0||i>=MXSZ||j<0||j>=MXSZ) continue; gsq[i][j].bars =b&((1<=MXSZ||j<0||j>=MXSZ) continue; sp.ten=ten; sp.spor=spor; sp.fstyle=fstyle; sp.dech=dech; fixsp(&sp); gsq[i][j].sp=sp; NEXTL; } while(STRSTARTS(s,"SQSPMK ")) { if(sscanf(s,"SQSPMK %d %d %d\n",&i,&j,&k)<3) goto ew1; if(i<0||i>=MXSZ||j<0||j>=MXSZ||k<0||k>=MAXNMK) continue; NEXTL; if(s[0]=='+') { strncpy(gsq[i][j].sp.mk[k],s+1,MXMK); gsq[i][j].sp.mk[k][MXMK]='\0'; } NEXTL; } while(STRSTARTS(s,"SQLP ")) { int ten,lpor,dnran=0,mux=0; resetlp(&lp); if(sscanf(s,"SQLP %d %d %d %u %u %d %d %d %d\n",&i,&j,&d,&lp.dmask,&lp.emask,&ten,&lpor,&dnran,&mux)<7) goto ew1; if(i<0||i>=MXSZ||j<0||j>=MXSZ||d<0||d>=ndir[gtype]) continue; lp.ten=ten; lp.lpor=lpor; lp.dnran=dnran; lp.mux=mux; fixlp(&lp); gsq[i][j].lp[d]=lp; NEXTL; } while(STRSTARTS(s,"VL ")) { if(sscanf(s,"VL %d %d %d %d\n",&d,&n,&i,&j)!=4) goto ew1; if(i<0||i>=MXSZ||j<0||j>=MXSZ||n<0||n>=MXCL||d<0||d>=NVL) continue; vls[d].x[n]=i; vls[d].y[n]=j; if(n>=vls[d].l) vls[d].l=n+1; if(d>=nvl) nvl=d+1; NEXTL; } while(STRSTARTS(s,"VLP ")) { int ten,lpor,dnran=0,mux=0; resetlp(&lp); if(sscanf(s,"VLP %d %u %u %d %d %d %d\n",&d,&lp.dmask,&lp.emask,&ten,&lpor,&dnran,&mux)<5) goto ew1; if(d<0||d>=NVL) continue; lp.ten=ten; lp.lpor=lpor; lp.dnran=dnran; lp.mux=mux; fixlp(&lp); vls[d].lp=lp; NEXTL; } while(STRSTARTS(s,"SQCT ")) { if(sscanf(s,"SQCT %d %d %d %s\n",&i,&j,&d,s0)!=4) goto ew1; if(i<0||i>=MXSZ||j<0||j>=MXSZ||d<0||d>=MAXNDIR) continue; p=s0; l=strlen(p); if(l>1&&*p=='\"'&&p[l-1]=='\"') p[l-1]=0,p++; // strip double quote marks if any gsq[i][j].ctlen[d]=strtoabms(gsq[i][j].ctbm[d],MXCT,p,0); NEXTL; } if(ver>=4) initcodeword(); // ver>=4 may have updated alphabet information } else if(strlen(s)>3&&STRSTARTS(s+2,"ympath")) { // necessarily incomplete as we don't have documentation int chkt=0,symt=0,blkh=0,x0,x1,y0,y1,dir; NEXTL; if(sscanf(s,"[Grid %d %d]",&width,&height)!=2) goto ew1; if(width<1||width>MXSZ|| // validate basic parameters height<1||height>MXSZ) goto ew1; draw_init(); for(;;) { NEXTL; if(STRSTARTS(s,"[Light ")) break; if(STRSTARTS(s,"#Title=" )) { strncpy(gtitle ,s+7,SLEN-1); gtitle [SLEN-1]=0; continue; } if(STRSTARTS(s,"#Author=")) { strncpy(gauthor,s+8,SLEN-1); gauthor[SLEN-1]=0; continue; } if(STRSTARTS(s,"BlockHole=" )) { blkh=atoi(s+10); continue; } if(STRSTARTS(s,"CheckingType=")) { chkt=atoi(s+13); continue; } if(STRSTARTS(s,"SymmetryType=")) { symt=atoi(s+13); continue; } DEB_GR printf("Unprocessed: <%s>\n",s); } DEB_GR printf("chkt=%d symt=%d; now processing lights\n",chkt,symt); if(chkt==0) { // barred? add bars everywhere for(j=0;jwidth||y0<0||y0>height) goto ew1; if(x1<0||x1>width||y1<0||y1>height) goto ew1; if(y0==y1) { // across for(i=x0;i\n",s); } } ew4: for(j=0;j0) gsq[i-1][j ].bars&=~1; if(j>0) gsq[i ][j-1].bars&=~2; } } else { // LEGACY LOAD gtype=0; if(sscanf(s,"%d %d %d %d %d\n",&width,&height,&symmr,&symmm,&symmd)!=5) goto ew1; if(width<1||width>MXSZ|| // validate basic parameters height<1||height>MXSZ|| symmr<0||symmr>2|| symmm<0||symmm>3|| symmd<0||symmd>3) goto ew1; if (symmr==1) symmr=2; else if(symmr==2) symmr=4; else symmr=1; draw_init(); for(j=0;j31) goto ew1; gsq[i][j].fl=u&0x09; gsq[i][j].bars=(u>>1)&3; gsq[i][j].merge=0; } } for(j=0;j'Z')&&(c<'0'||c>'9')&&c!=' ') goto ew1; gsq[i][j].ctbm[0][0]=ICCTOABM(uchartoICC((int)c)); } if(fgetc(fp)!='\n') goto ew1; } } if(fclose(fp)) goto ew3; reloadtpi(); donumbers(); loaddicts(0); undo_push();unsaved=0; if(wf) repwarn("File was saved using\na newer version of Qxw.\nSome features may be lost."); havesavefn=1; bldstructs(); return; // no errors ew1:fclose(fp);syncgui();reperr("File format error");goto ew2; ew3:fserror(); ew2: a_filenew(0); initalphamap(alphainitdata[startup_al]); // use preferences value of default alphabet loaddefdicts(); bldstructs(); } // write state to file void a_save(void) { int d,i,j,k,l; char s0[MXCT*(MAXICC*16+4)]; FILE*fp; setfilenamebase(filename); fp=q_fopen(filename,"w"); if(!fp) {fserror();return;} if(fprintf(fp,"#QXW2v%d http://www.quinapalus.com\n",SAVE_VERSION)<0) goto ew0; if(fprintf(fp,"GP %d %d %d %d %d %d\n",gtype,width,height,symmr,symmm,symmd)<0) goto ew0; if(fprintf(fp,"TTL\n+%s\n",gtitle)<0) goto ew0; if(fprintf(fp,"AUT\n+%s\n",gauthor)<0) goto ew0; for(i=1;i0&&!isprint((unsigned char)s[l-1])) s[--l]='\0'; if(l==0) break; // end of this vl if(s[0]=='#') continue; // comment line? if(i>=MXCL) goto ew1; if(sscanf(s,"%d %d",tvls[d].x+i,tvls[d].y+i)<2) goto ew1; if(tvls[d].x[i]<0||tvls[d].x[i]>=MXSZ) goto ew1; if(tvls[d].y[i]<0||tvls[d].y[i]>=MXSZ) goto ew1; i++; tvls[d].l=i; } if(tvls[d].l>0) d++; } ew0: if(fclose(fp)) goto ew3; if(tvls[d].l>0) d++; memcpy(vls,tvls,d*sizeof(struct vl)); nvl=d; undo_push();unsaved=0;syncgui();compute(0); return; ew3:fserror();return; ew1:fclose(fp);syncgui();reperr("File format error"); } void a_exportvls(char*fn) { int d,i; FILE*fp; fp=q_fopen(fn,"w"); if(!fp) {fserror();return;} if(fprintf(fp,"# Free light export file created by Qxw %s http://www.quinapalus.com\n",RELEASE)<0) goto ew0; for(d=0;d] [-d ]* []\n",argv[0]); printf(" OR: %s -b [-a ] [-d ]* \n",argv[0]); printf("\n" "-b enables batch mode: GUI is disabled and a Qxw deck is read from the\n" " specified file\n\n"); printf("Available alphabets and corresponding names and codes:\n"); for(i=0;i1) printf(", "); printf("%s",alphaname[i][j]); } printf("\n"); } return 0; } #ifdef _WIN32 if (optind < wArgc && wcslen(wArgv[optind]) < SLEN) WideCharToMultiByte(CP_UTF8, 0, wArgv[optind], -1, filename, SLEN, NULL, NULL); else strcpy(filename, ""); #else if (optind < argc && strlen(argv[optind]) < SLEN) strcpy(filename, argv[optind]); else strcpy(filename, ""); #endif if(deckmode) usegui=0; if(debug) { printf("Qxw release %s\n",RELEASE); printf("debug=0x%08x\n",debug); printf("rseed=0x%08x (set this using -R)\n",rseed); printf("glib version %d.%d.%d\n",glib_major_version,glib_minor_version,glib_micro_version); printf("gtk version %d.%d.%d\n",gtk_major_version,gtk_minor_version,gtk_micro_version); draw_printversions(); } srand(rseed); g_thread_init(0); gdk_threads_init(); gdk_threads_enter(); filler_init(); if(usegui) { gtk_init(&argc,&argv); startgtk(); } a_filenew(0); // reset grid loadprefdefaults(); if(usegui) loadprefs(); // load preferences file (silently failing to defaults) draw_init(); if(alphabet[0]==0) { // no alphabet specified on command line initalphamap(alphainitdata[startup_al]); // so use preferences value } else if(initalphamapbycode(alphabet)) { rc=16; reperr("Unrecognised alphabet"); if(deckmode) goto ew1; } if(deckmode) { rc=loaddeck(nd>0); if(rc==0) { if(filler_start(1)) { fprintf(stderr,"Failed to initialise filler\n"); rc=16; } else { filler_wait(); rc=dumpdeck(); } } } else { // GUI mode if(filename[0]) { // we have a filename from the command line a_load(); } else { // otherwise attempt to load dictionaries specified on command line if(nd) loaddicts(0); else // or, if not, try the preferences defaults and then final fallbacks if(loaddefdicts()) repwarn("No dictionaries loaded"); strcpy(filenamebase,""); } syncgui(); compute(0); if(debug==0&&!strcmp(RELEASE+strlen(RELEASE)-4,"beta")) { while(gtk_events_pending()) gtk_main_iteration_do(0); reperr(" This is a beta release of Qxw. \n Please do not distribute. "); } gtk_main(); filler_stop(); } ew1: draw_finit(); if(usegui) stopgtk(); filler_finit(); gdk_threads_leave(); freedicts(); FREEX(llist); freewords(); FREEX(entries); return rc; } // INTERFACE TO FILLER // (re-)start the filler when an edit has been made // Return non-zero if cannot start filler int compute(int mode) { filler_stop(); // stop if already running setposslabel(""); if(bldstructs()) return 1; // failed? if(filler_start(mode)) return 1; if(ifamode>0) setposslabel(" Working..."); return 0; } // get all word lists up-to-date prior to exporting answers // return 1 if something goes wrong and word lists are not valid int preexport(void) { DEB_EX printf("preexport()\n"); filler_stop(); // stop if already running if(bldstructs()) return 1; // failed? if(filler_start(3)) return 1; // need to run as far as init+settle done filler_wait(); return 0; } void postexport(void) { DEB_EX printf("postexport()\n"); filler_stop(); compute(0); // restore everything } // comparison function for sorting feasible word list by score static int cmpscores(const void*p,const void*q) {double f,g; if(lts[*(int*)p].ans<0) return 0; if(lts[*(int*)q].ans<0) return 0; f=ansp[lts[*(int*)p].ans]->score; // negative ans values should not occur here g=ansp[lts[*(int*)q].ans]->score; if(fg) return -1; return (char*)p-(char*)q; // stabilise sort } // called by filler when a list of feasible words through the cursor has been found void mkfeas(void) {int l; int*p; struct word*w=0; llistp=NULL;llistn=0; // default answer: no list if(curword==-1||words[curword].flist==0||ifamode==0) {llistp=NULL;llistn=0;return;} // no list w=words+curword; p=w->flist; l=w->flistlen; FREEX(llist); llist=(int*)malloc(l*sizeof(int)); // space for feasible word list if(llist==NULL) return; memcpy(llist,p,l*sizeof(int)); llistp=llist; llistn=l; llistwlen=w->wlen; llistdm=w->lp->dmask; // copy list across llistem=w->lp->emask; DEB_FL printf("llist=%p p=%p l=%d dm=%08x llistwlen=%d llistdm=%08x\n",(void*)llist,(void*)p,l,w->lp->dmask,llistwlen,llistdm); qsort(llistp,llistn,sizeof(int),&cmpscores); // DEB_FL printf("mkfeas: %d matches; dm=%08x\n",llistn,llistdm); } // provide progress info to display void updategrid(void) {int i; for(i=0;i or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __ALPHABETS_H__ #define __ALPHABETS_H__ #define NALPHAINIT 20 #define ALPHABET_AZ 0 #define ALPHABET_09 1 #define ALPHABET_AZ09 2 #define NALPHACODES 5 extern const char*alphaname[NALPHAINIT][NALPHACODES+1]; extern struct alphaentry alphainitdata[NALPHAINIT][MAXICC]; #endif qxw-20200708/draw.h0000664000175000017500000000614113674705417011535 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2020 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __DRAW_H__ #define __DRAW_H__ #include extern double gscale; // extern void moveto(cairo_t*cc,double x,double y); // extern void lineto(cairo_t*cc,double x,double y); // extern void rmoveto(cairo_t*cc,double x,double y); // extern void rlineto(cairo_t*cc,double x,double y); // extern void setlinewidth(cairo_t*cc,double w); // extern void setlinecap(cairo_t*cc,int c); // extern void closepath(cairo_t*cc); // extern void fill(cairo_t*cc); // extern void stroke(cairo_t*cc); // extern void strokepreserve(cairo_t*cc); // extern void clip(cairo_t*cc); extern void gsave(cairo_t*cc); extern void grestore(cairo_t*cc); // extern void setrgbcolor(cairo_t*cc,double r,double g, double b); // extern void setrgbacolor(cairo_t*cc,double r,double g, double b,double a); // extern void setfontstyle(cairo_t*cc,int fs); // extern void setfontsize(cairo_t*cc,double h); // extern void arc(cairo_t*cc,double x,double y,double r,double t0,double t1); // extern void arcn(cairo_t*cc,double x,double y,double r,double t0,double t1); // extern void setrgbcolor24(cairo_t*cc,int c); extern void ltext(cairo_t*cc,char*s,double h,int fs); extern void ctext(cairo_t*cc,char*s,double x,double y,double h,int fs,int ocm); extern void ansform(char*t0,int t0l,int ln,int wlen,unsigned int dmask); extern int bawdpx; // extern int hbawdpx; extern void draw_init(); extern void draw_finit(); extern void draw_printversions(); extern void repaint(cairo_t*cr); // extern void refreshsq(int x,int y); extern void refreshsqlist(int l,int*gx,int*gy); extern void refreshsqmg(int x,int y); extern void refreshsel(); extern void refreshcur(); extern void refreshnum(); extern void refreshhin(); extern void refreshall(); extern int dawidth(void); extern int daheight(void); extern void a_exportg(char*fn,int f0,int f1); extern void a_exportgh(int f,char*url); extern void a_exporta(int f); extern void a_exporthp(int f,int f0,int f1); extern void a_exportccwxml(char*fn); extern void edgecoords(double*x0,double*y0,double*x1,double*y1,int x,int y,int d); // extern void getsqbbox(double*x0,double*y0,double*x1,double*y1,int x,int y); // extern void getmgbbox(double*x0,double*y0,double*x1,double*y1,int x,int y); extern void mgcentre(double*u,double*v,int x,int y,int d,int l); extern char*dname[NGTYPE][MAXNDIR]; #endif qxw-20200708/LICENCE0000664000175000017500000004310313674704262011410 0ustar momo GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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 Lesser General Public License instead of this License. qxw-20200708/qxw.xpm0000664000175000017500000000772713674704262012004 0ustar momo/* XPM */ static char * icon_xpm[] = { "32 32 114 2", " g #FFFFFF", ". g #FCFCFC", "+ g #E7E7E7", "@ g #E1E1E1", "# g #E2E2E2", "$ g #696969", "% g #777777", "& g #7B7B7B", "* g #4E4E4E", "= g #6E6E6E", "- g #7D7D7D", "; g #F3F3F3", "> g #FAFAFA", ", g #F8F8F8", "' g #F9F9F9", ") g #707070", "! g #D0D0D0", "~ g #FDFDFD", "{ g #DEDEDE", "] g #E0E0E0", "^ g #747474", "/ g #D6D6D6", "( g #D8D8D8", "_ g #B6B6B6", ": g #FEFEFE", "< g #FBFBFB", "[ g #ECECEC", "} g #9B9B9B", "| g #5E5E5E", "1 g #737373", "2 g #D7D7D7", "3 g #F0F0F0", "4 g #B8B8B8", "5 g #676767", "6 g #525252", "7 g #D5D5D5", "8 g #575757", "9 g #797979", "0 g #464646", "a g #E5E5E5", "b g #7C7C7C", "c g #959595", "d g #AFAFAF", "e g #C3C3C3", "f g #F6F6F6", "g g #A7A7A7", "h g #B1B1B1", "i g #888888", "j g #3D3D3D", "k g #303030", "l g #404040", "m g #8E8E8E", "n g #484848", "o g #1D1D1D", "p g #999999", "q g #C4C4C4", "r g #939393", "s g #202020", "t g #585858", "u g #7A7A7A", "v g #0C0C0C", "w g #BBBBBB", "x g #0D0D0D", "y g #A3A3A3", "z g #EDEDED", "A g #474747", "B g #333333", "C g #CECECE", "D g #171717", "E g #818181", "F g #030303", "G g #C7C7C7", "H g #121212", "I g #BCBCBC", "J g #8D8D8D", "K g #000000", "L g #A2A2A2", "M g #717171", "N g #0E0E0E", "O g #494949", "P g #313131", "Q g #555555", "R g #ABABAB", "S g #060606", "T g #808080", "U g #D4D4D4", "V g #929292", "W g #050505", "X g #2C2C2C", "Y g #5C5C5C", "Z g #2A2A2A", "` g #0A0A0A", " . g #E8E8E8", ".. g #2B2B2B", "+. g #606060", "@. g #EEEEEE", "#. g #3B3B3B", "$. g #989898", "%. g #E6E6E6", "&. g #757575", "*. g #B2B2B2", "=. g #D9D9D9", "-. g #F7F7F7", ";. g #9A9A9A", ">. g #848484", ",. g #9C9C9C", "'. g #E9E9E9", "). g #4F4F4F", "!. g #979797", "~. g #BABABA", "{. g #BDBDBD", "]. g #A6A6A6", "^. g #DFDFDF", "/. g #8C8C8C", " ", " . + @ # # # # # # # # # # # # # # # # # # # # # # # # # # # # ", " + $ % & & & & & & & & & & & & & & & & & & & & & & * = - & & & ", " @ % ; > . . , ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' > ) ! ~ . > ", " # & > { ] ^ / ( _ : ", " # & < [ } | 1 2 3 4 _ 5 ", " # & ' 6 1 7 8 ", " # & ' 6 : 1 7 > 9 ( ", " # & ' ~ 2 0 a : : : 1 / b c 7 ", " # & ' < d } e : f : 1 / ; d g h ", " # & ' : : < i j k l m > 1 7 ", " # & ' : , n o p q r s t < : 1 7 ", " # & ' : u v ] : : w x y 1 7 ", " # & ' z k 1 ~ : A B : 1 7 ", " # & ' C D d : : E F 1 7 ", " # & ' G H I : J K 1 7 ", " # & ' 7 o L ~ : M N 1 7 ", " # & ' ~ l O : : P Q : 1 7 ", " # & ' R S r T F U 1 7 ", " # & ' : V W X Y Z ` d ~ : 1 7 ", " # & ' : : .r M ..+.@. 1 7 ", " # & ' : U #.$.< 1 7 ", " # & ' : %.! . 1 7 ", " # & ' : 1 7 ", " # & ' 1 7 ", " # & > ^ / ", " # * ) ^ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ^ B +.&.1 1 1 ", " # = ! / / / 7 7 / / 7 7 7 7 7 7 7 7 7 7 7 7 7 7 / +.*.=.7 7 7 ", " # - ~ ~ , -. &.=. ", " # & < 3 ;.>. # ,.>.@ : 1 7 ", " # & ' < '.). q !.~.L . 1 7 ", " # & ' 6 {.].^./.< 1 7 "}; qxw-20200708/icon-48x48.png0000664000175000017500000000243513674704262012661 0ustar momoPNG  IHDR00WsRGBbKGD pHYs B(xtIME#IhIDAThYMh[=әMbI %4]BK1(m .\u.}A"BWlEAR ihI mƙ%6ן``;{{LZ+¾wtX^iI>0b2].)H$vr 8U8N i*Sh4Ǐc||\}6nݺwAjeYe}}tTU-$ϟ,<~?}FHe׮]39D___}nlB",Al4 0 x%Aa~]!IR4#b̧X˸>|>>|xlVtUXu(ܹs"L'>WVVpB!AܸqwE<:'1t=󀑔J%J%2V+CQ 'Zr"$944DY,:L&z ###'& /^^/jb{{;GBSE`,~-zx޽kD( R<zzzj;00ł?6%d;E \t 6-!~?, ~a;;; Q4Bv{`X42I麎R0%Vkfb(PUp|.i wێˊϟ,D.3UU ۄ:&''kl=33D"bE +Wos11I~6ׯ_suuϟ?,@Y(\2~pysʙ$4~iB@ 4wZjt 455mR),,,`llㄔ fFdf8pCwo QE$v5M( $ @"4E6Ze|ŸF+vMU#sݍZ>+ 0<<ɪÇD"ÈF)p>}D|rFiIRUUvttׯ_R#;Rb$_~{>GoooWy&E1 3L&Su/^l#,ޮ $Ij?z( ? IENDB`qxw-20200708/examples/0000775000175000017500000000000013701320335012222 5ustar momoqxw-20200708/examples/xmas-filled.qxw0000664000175000017500000004505613674704262015220 0ustar momo#QXW2 http://www.quinapalus.com GP 0 15 15 2 0 0 TTL +Season AUT +Oleg GLP 1 1 0 0 GSP ffffff 000000 0 0 TM 0 0 0 + TMSG 0 0 + TMSG 0 1 + DFN 0 +/usr/share/dict/words DFN 1 + DFN 2 + DFN 3 + DFN 4 + DFN 5 + DFN 6 + DFN 7 + DFN 8 + DSF 0 +^.*+(? or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include typedef unsigned int uchar; #define ICC_DASH 61 // internal character code for `-' #define MXSZ 63 // maximum grid dimension #define MXLE 250 // maximum entries in light extern int treatedanswer(const char*light); extern int treatedanswerU(const uchar*light); extern int treatedanswerICC(const char*light); extern int isword(const char*light); extern int iswordU(const uchar*light); extern int iswordICC(const char*light); extern int ICCtoclass(char c); extern char uchartoICC(int c); extern uchar ICCtouchar(char c); extern void printU(uchar c); extern void printUs(const uchar*s); extern void printICC(char c); extern void printICCs(const char*s); #ifdef _WIN32 __declspec(dllexport) void init(); __declspec(dllexport) void finit(); __declspec(dllexport) int treat(const char*answer); __declspec(dllimport) int clueorderindex; __declspec(dllimport) int gridorderindex[]; __declspec(dllimport) int checking[]; __declspec(dllimport) int lightlength; __declspec(dllimport) int lightx; __declspec(dllimport) int lighty; __declspec(dllimport) int lightdir; __declspec(dllimport) char *treatmessage[]; __declspec(dllimport) uchar*treatmessageU[]; __declspec(dllimport) char *treatmessageICC[]; __declspec(dllimport) char *treatmessageICCAZ[]; __declspec(dllimport) char *treatmessageICCAZ09[]; __declspec(dllimport) uchar*treatmessageUAZ[]; __declspec(dllimport) uchar*treatmessageUAZ09[]; __declspec(dllimport) char *treatmessageAZ[]; __declspec(dllimport) char *treatmessageAZ09[]; __declspec(dllimport) char msgchar[]; __declspec(dllimport) uchar msgcharU[]; __declspec(dllimport) uchar msgcharUAZ[]; __declspec(dllimport) uchar msgcharUAZ09[]; __declspec(dllimport) char msgcharICC[]; __declspec(dllimport) char msgcharICCAZ[]; __declspec(dllimport) char msgcharICCAZ09[]; __declspec(dllimport) char msgcharAZ[]; __declspec(dllimport) char msgcharAZ09[]; __declspec(dllimport) char *answerICC; __declspec(dllimport) uchar*answerU; #else extern int clueorderindex; extern int*gridorderindex; extern int*checking; extern int lightlength; extern int lightx; extern int lighty; extern int lightdir; extern char *treatmessage[]; extern uchar*treatmessageU[]; extern char *treatmessageICC[]; extern char* treatmessageICCAZ[]; extern char* treatmessageICCAZ09[]; extern uchar*treatmessageUAZ[]; extern uchar*treatmessageUAZ09[]; extern char *treatmessageAZ[]; extern char *treatmessageAZ09[]; extern char msgchar[]; extern uchar msgcharU[]; extern uchar msgcharUAZ[]; extern uchar msgcharUAZ09[]; extern char msgcharICC[]; extern char msgcharICCAZ[]; extern char msgcharICCAZ09[]; extern char msgcharAZ[]; extern char msgcharAZ09[]; extern const char *answerICC; extern const uchar*answerU; #endif static char light [MXLE+1]; static uchar lightU[MXLE+1]; qxw-20200708/examples/deck4x4symm.qxd0000664000175000017500000000007213674704262015131 0ustar momo.RANDOM 2 00 01 02 03 01 04 05 06 02 05 07 08 03 06 08 09 qxw-20200708/examples/bar.qxw0000664000175000017500000002747413674704262013563 0ustar momo#QXW2 http://www.quinapalus.com GP 0 12 12 4 0 0 TTL + AUT + GLP 1 1 0 0 GSP ffffff 000000 0 0 TM 0 0 0 + TMSG 0 0 + TMSG 0 1 + DFN 0 +/usr/share/dict/words DFN 1 + DFN 2 + DFN 3 + DFN 4 + DFN 5 + DFN 6 + DFN 7 + DFN 8 + DSF 0 +^.*+(? or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // gcc -Wall -fPIC plugin_behead.c -o plugin_behead.so -shared #include int treat(const char*answer) { strcpy(light,answer+1); return treatedanswer(light); } qxw-20200708/examples/plugin_beheadICC.c0000664000175000017500000000201613674704560015511 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2019 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // gcc -Wall -fPIC plugin_behead.c -o plugin_behead.so -shared #include int treat(const char*answer) { strcpy(light,answerICC+1); return treatedanswerICC(light); } qxw-20200708/examples/windmills-filled.qxw0000664000175000017500000001251013674704262016237 0ustar momo#QXW2v1 http://www.quinapalus.com GP 0 7 7 2 0 0 TTL + AUT + GLP 1 1 0 0 GSP ffffff 000000 0 0 0 0 TM 0 0 0 + TMSG 0 0 + TMSG 0 1 + DFN 0 +/usr/share/dict/words DFN 1 + DFN 2 + DFN 3 + DFN 4 + DFN 5 + DFN 6 + DFN 7 + DFN 8 + DSF 0 + DSF 1 + DSF 2 + DSF 3 + DSF 4 + DSF 5 + DSF 6 + DSF 7 + DSF 8 + DAF 0 + DAF 1 +IN THE WINDMILLS OF YOUR MIND DAF 2 + DAF 3 + DAF 4 + DAF 5 + DAF 6 + DAF 7 + DAF 8 + SQ 0 0 0 0 0 U SQ 1 0 0 0 0 O SQ 2 0 2 0 0 Y SQ 3 0 0 0 0 F SQ 4 0 2 0 0 O SQ 5 0 0 0 0 S SQ 6 0 0 0 0 L SQ 0 1 0 0 0 R SQ 1 1 0 0 0 E SQ 2 1 0 0 0 P SQ 3 1 0 0 0 O SQ 4 1 0 0 0 S SQ 5 1 0 0 0 A SQ 6 1 0 0 0 L SQ 0 2 1 0 0 M SQ 1 2 2 0 0 R SQ 2 2 0 0 0 O SQ 3 2 0 0 0 O SQ 4 2 0 0 0 K SQ 5 2 1 0 0 S SQ 6 2 0 0 0 I SQ 0 3 0 0 0 I SQ 1 3 0 0 0 D SQ 2 3 0 0 0 O SQ 3 3 0 0 0 L SQ 4 3 0 0 0 I SQ 5 3 2 0 0 S SQ 6 3 0 0 0 M SQ 0 4 1 0 0 N SQ 1 4 0 0 0 A SQ 2 4 0 0 0 L SQ 3 4 0 0 0 I SQ 4 4 0 0 0 E SQ 5 4 1 0 0 N SQ 6 4 0 0 0 D SQ 0 5 0 0 0 D SQ 1 5 0 0 0 R SQ 2 5 2 0 0 E SQ 3 5 0 0 0 S SQ 4 5 2 0 0 D SQ 5 5 0 0 0 E SQ 6 5 0 0 0 N SQ 0 6 0 0 0 I SQ 1 6 0 0 0 N SQ 2 6 0 0 0 T SQ 3 6 0 0 0 H SQ 4 6 0 0 0 E SQ 5 6 0 0 0 W SQ 6 6 0 0 0 I SQSP 0 0 ffffff 000000 0 0 0 0 SQSP 1 0 ffffff 000000 0 0 0 0 SQSP 2 0 ffffff 000000 0 0 0 0 SQSP 3 0 ffffff 000000 0 0 0 0 SQSP 4 0 ffffff 000000 0 0 0 0 SQSP 5 0 ffffff 000000 0 0 0 0 SQSP 6 0 ffffff 000000 0 0 0 0 SQSP 0 1 ffffff 000000 0 0 0 0 SQSP 1 1 ffffff 000000 0 0 0 0 SQSP 2 1 ffffff 000000 0 0 0 0 SQSP 3 1 ffffff 000000 0 0 0 0 SQSP 4 1 ffffff 000000 0 0 0 0 SQSP 5 1 ffffff 000000 0 0 0 0 SQSP 6 1 ffffff 000000 0 0 0 0 SQSP 0 2 ffffff 000000 0 0 0 0 SQSP 1 2 ffffff 000000 0 0 0 0 SQSP 2 2 ffffff 000000 0 0 0 0 SQSP 3 2 ffffff 000000 0 0 0 0 SQSP 4 2 ffffff 000000 0 0 0 0 SQSP 5 2 ffffff 000000 0 0 0 0 SQSP 6 2 ffffff 000000 0 0 0 0 SQSP 0 3 ffffff 000000 0 0 0 0 SQSP 1 3 ffffff 000000 0 0 0 0 SQSP 2 3 ffffff 000000 0 0 0 0 SQSP 3 3 ffffff 000000 0 0 0 0 SQSP 4 3 ffffff 000000 0 0 0 0 SQSP 5 3 ffffff 000000 0 0 0 0 SQSP 6 3 ffffff 000000 0 0 0 0 SQSP 0 4 ffffff 000000 0 0 0 0 SQSP 1 4 ffffff 000000 0 0 0 0 SQSP 2 4 ffffff 000000 0 0 0 0 SQSP 3 4 ffffff 000000 0 0 0 0 SQSP 4 4 ffffff 000000 0 0 0 0 SQSP 5 4 ffffff 000000 0 0 0 0 SQSP 6 4 ffffff 000000 0 0 0 0 SQSP 0 5 ffffff 000000 0 0 0 0 SQSP 1 5 ffffff 000000 0 0 0 0 SQSP 2 5 ffffff 000000 0 0 0 0 SQSP 3 5 ffffff 000000 0 0 0 0 SQSP 4 5 ffffff 000000 0 0 0 0 SQSP 5 5 ffffff 000000 0 0 0 0 SQSP 6 5 ffffff 000000 0 0 0 0 SQSP 0 6 ffffff 000000 0 0 0 0 SQSP 1 6 ffffff 000000 0 0 0 0 SQSP 2 6 ffffff 000000 0 0 0 0 SQSP 3 6 ffffff 000000 0 0 0 0 SQSP 4 6 ffffff 000000 0 0 0 0 SQSP 5 6 ffffff 000000 0 0 0 0 SQSP 6 6 ffffff 000000 0 0 0 0 SQLP 0 0 0 0 1 0 1 SQLP 0 0 1 0 1 0 1 SQLP 1 0 0 1 1 0 0 SQLP 1 0 1 1 1 0 0 SQLP 2 0 0 1 1 0 0 SQLP 2 0 1 1 1 0 0 SQLP 3 0 0 1 1 0 0 SQLP 3 0 1 1 1 0 0 SQLP 4 0 0 1 1 0 0 SQLP 4 0 1 1 1 0 0 SQLP 5 0 0 1 1 0 0 SQLP 5 0 1 1 1 0 0 SQLP 6 0 0 1 1 0 0 SQLP 6 0 1 0 1 0 1 SQLP 0 1 0 1 1 0 0 SQLP 0 1 1 1 1 0 0 SQLP 1 1 0 1 1 0 0 SQLP 1 1 1 1 1 0 0 SQLP 2 1 0 1 1 0 0 SQLP 2 1 1 1 1 0 0 SQLP 3 1 0 1 1 0 0 SQLP 3 1 1 1 1 0 0 SQLP 4 1 0 1 1 0 0 SQLP 4 1 1 1 1 0 0 SQLP 5 1 0 1 1 0 0 SQLP 5 1 1 1 1 0 0 SQLP 6 1 0 1 1 0 0 SQLP 6 1 1 1 1 0 0 SQLP 0 2 0 1 1 0 0 SQLP 0 2 1 1 1 0 0 SQLP 1 2 0 1 1 0 0 SQLP 1 2 1 1 1 0 0 SQLP 2 2 0 1 1 0 0 SQLP 2 2 1 1 1 0 0 SQLP 3 2 0 1 1 0 0 SQLP 3 2 1 1 1 0 0 SQLP 4 2 0 1 1 0 0 SQLP 4 2 1 1 1 0 0 SQLP 5 2 0 1 1 0 0 SQLP 5 2 1 1 1 0 0 SQLP 6 2 0 1 1 0 0 SQLP 6 2 1 1 1 0 0 SQLP 0 3 0 1 1 0 0 SQLP 0 3 1 1 1 0 0 SQLP 1 3 0 1 1 0 0 SQLP 1 3 1 1 1 0 0 SQLP 2 3 0 1 1 0 0 SQLP 2 3 1 1 1 0 0 SQLP 3 3 0 1 1 0 0 SQLP 3 3 1 1 1 0 0 SQLP 4 3 0 1 1 0 0 SQLP 4 3 1 1 1 0 0 SQLP 5 3 0 1 1 0 0 SQLP 5 3 1 1 1 0 0 SQLP 6 3 0 1 1 0 0 SQLP 6 3 1 1 1 0 0 SQLP 0 4 0 1 1 0 0 SQLP 0 4 1 1 1 0 0 SQLP 1 4 0 1 1 0 0 SQLP 1 4 1 1 1 0 0 SQLP 2 4 0 1 1 0 0 SQLP 2 4 1 1 1 0 0 SQLP 3 4 0 1 1 0 0 SQLP 3 4 1 1 1 0 0 SQLP 4 4 0 1 1 0 0 SQLP 4 4 1 1 1 0 0 SQLP 5 4 0 1 1 0 0 SQLP 5 4 1 1 1 0 0 SQLP 6 4 0 1 1 0 0 SQLP 6 4 1 1 1 0 0 SQLP 0 5 0 1 1 0 0 SQLP 0 5 1 1 1 0 0 SQLP 1 5 0 1 1 0 0 SQLP 1 5 1 1 1 0 0 SQLP 2 5 0 1 1 0 0 SQLP 2 5 1 1 1 0 0 SQLP 3 5 0 1 1 0 0 SQLP 3 5 1 1 1 0 0 SQLP 4 5 0 1 1 0 0 SQLP 4 5 1 1 1 0 0 SQLP 5 5 0 1 1 0 0 SQLP 5 5 1 1 1 0 0 SQLP 6 5 0 1 1 0 0 SQLP 6 5 1 1 1 0 0 SQLP 0 6 0 0 1 0 1 SQLP 0 6 1 1 1 0 0 SQLP 1 6 0 1 1 0 0 SQLP 1 6 1 1 1 0 0 SQLP 2 6 0 1 1 0 0 SQLP 2 6 1 1 1 0 0 SQLP 3 6 0 1 1 0 0 SQLP 3 6 1 1 1 0 0 SQLP 4 6 0 1 1 0 0 SQLP 4 6 1 1 1 0 0 SQLP 5 6 0 1 1 0 0 SQLP 5 6 1 1 1 0 0 SQLP 6 6 0 1 1 0 0 SQLP 6 6 1 1 1 0 0 VL 0 0 0 0 VL 0 1 1 0 VL 0 2 2 0 VL 0 3 3 0 VL 0 4 4 0 VL 0 5 5 0 VL 0 6 6 0 VL 0 7 6 1 VL 0 8 6 2 VL 0 9 6 3 VL 0 10 6 4 VL 0 11 6 5 VL 0 12 6 6 VL 0 13 5 6 VL 0 14 4 6 VL 0 15 3 6 VL 0 16 2 6 VL 0 17 1 6 VL 0 18 0 6 VL 0 19 0 5 VL 0 20 0 4 VL 0 21 0 3 VL 0 22 0 2 VL 0 23 0 1 VLP 0 2 15 0 1 SQCT 0 0 0 U SQCT 1 0 0 O SQCT 2 0 0 Y SQCT 3 0 0 F SQCT 4 0 0 O SQCT 5 0 0 S SQCT 6 0 0 L SQCT 0 1 0 R SQCT 1 1 0 E SQCT 2 1 0 P SQCT 3 1 0 O SQCT 4 1 0 S SQCT 5 1 0 A SQCT 6 1 0 L SQCT 0 2 0 M SQCT 1 2 0 R SQCT 2 2 0 O SQCT 3 2 0 O SQCT 4 2 0 K SQCT 5 2 0 S SQCT 6 2 0 I SQCT 0 3 0 I SQCT 1 3 0 D SQCT 2 3 0 O SQCT 3 3 0 L SQCT 4 3 0 I SQCT 5 3 0 S SQCT 6 3 0 M SQCT 0 4 0 N SQCT 1 4 0 A SQCT 2 4 0 L SQCT 3 4 0 I SQCT 4 4 0 E SQCT 5 4 0 N SQCT 6 4 0 D SQCT 0 5 0 D SQCT 1 5 0 R SQCT 2 5 0 E SQCT 3 5 0 S SQCT 4 5 0 D SQCT 5 5 0 E SQCT 6 5 0 N SQCT 0 6 0 I SQCT 1 6 0 N SQCT 2 6 0 T SQCT 3 6 0 H SQCT 4 6 0 E SQCT 5 6 0 W SQCT 6 6 0 I END qxw-20200708/examples/herodotus.dict0000664000175000017500000041425213674704262015131 0ustar momoἡ ἔα αἲ αἶα Αἰγαί Αἰγαῖαι Αἴγειρα Αἰγιρόεσσα Αἴγίον Αἰγέος Αἰγύπτῳ Αἰγύπτιά Αἰγύπτιοι Αἰγύπτου Αἰγυπτίη Αἴγυπτον Αἰγυπτίους Αἰγυπτίῃσι Αἰγυπτίων αἰδῶ ἕαδε αἵδε αἰδεομένη αἰδεῖσθαι αἰδοίων αὐδήσει αἰεὶ αἰετὸς αὐθέντης αἰθρίης αὐλῇ αὐλέειν αὐλητὴν αὐλήν αὐλοῦ αὐλέοντος ἑαλωκότας ἑαλωκότων αἷμα αἱμασιὴ αἱμασιὰς αἵματος Αἶάν αἰῶνα αἰνεόμενος αἰνέσας αἰνέω αἰνέων αὐήνωσι αὐξανόμενα αὐξανομένην αὐξηθῆναι αὔξηται αὔξοιτο Αἰολέας Αἰολίδες Αἰολέες Αἰολεῦσι Αἰολέων αἰπόλια ἔαρ Ἰαρδάνου αἵρεε αἱρέει αἵρεσιν αἱρέεται αἱρέετο αἱρετώτερα ἔαρι αἱρέοντο ἔας ἔασιν αἴσχιστον αἴσχιστος αἰσχύνην αἰσχίονας αἰσχρόν αἰσχροκερδής αἰσχρῶς αἰσχυνθεῖσα αἰσχυνόμενον αὐτῷ αἰτίῃ αὐταὶ αὗται αὔταρκες αἰτίας αἰτέειν αἰτεῖς αὕτη αἰτίην αἰτίης αὐτόθεν αὐτόθι αἵτινές αἴτιον αἴτιος αὖτις αὐτίκα αὐτήν αἰτέο αὐτοὶ αὐτομόλεον αὐτονόμων αὐτοῖσί αὐτούς αὐτοῖσι αἰτίους αὐτοχειρίῃ αὐτάς αὐτῇσι αὐτόχθονας αὐτόχθονες αὐτέων αὕτως αἰχμῇ αἰχμαλώτῳ αὐχμώδεος αἰχμὴν αἰχμοφόροι αἰχμοφόρους αἰχμοφόρων αἰχμῇσί αἰχμῆς αὐχὴν αὐχέσι βίῳ Βαβύλῶνι Βαβυλών Βαβυλῶνα Βαβυλῶνι Βαβυλώνιοι Βαβυλώνιος Βαβυλῶνος Βαβυλωνίη Βαβυλωνίην Βαβυλωνίης Βαβυλωνίοισι Βαβυλωνίου Βαβυλωνίους Βαβυλωνίων βαθέα βαθέαν βαθὺς βαινόμεναι βίαιον βαλανηφάγοι βαλανηφόροισι Βίαντα Ἄβαντες Βίαντος βαρβάροισι βαρβάρου βαρβάρων βαρυσυμφορώτατος Ἄβας βασανίσῃ βασιλέα βασιλέας βασιλεῦ βασιλεύειν βασιλεύεσθαι βασιλείης βασιλεύοντα βασιλεύοντος βασιλέες βασιλεὺς βασιλεῦσαι βασιλεύσαντες βασιλεύσαντος βασιλεύσας βασιλεύσειν βασιληίη βασιληίην βασιληίης βασιληίοισι βασιληίου βασιληίων βασιλέι βασιλήια βασιλήιον βασιλήιος βασιλέος βασιλέων βασίλεια βασίλευε ἐβασίλευσε Ἄβδηρα ἑβδομήκοντα ἕβδομον Ἀβδήροισι βεβουλευμένα βεβρώκοι βόες ἡβηδόν Ἰβηρίην βάθεος βάθος βάθρον βιάζεσθαι Βιθυνοί βιώμενον βιώσιμον βίκους Βάκτριον βάλανον βλάβος βέλεα ἐβάλετο βληθεὶς βληθέντα βόλος Βήλου βλέψας Βούδιοι βοηθέειν βοηθέεις βοηθησάντων βοηθέουσι βοηθήσας Βοιωτῶν Βοιωτίῃσι βούλῃ βούλεαί βούλεαι βούλεσθαι βούλεται ἐβούλετο ἐβούλευον ἐβούλευσαν βούληται βούλοιτό βούλοιτο βούλονται ἐβούλοντο βούλου βίον βοῶν Βοῦρα βορέην βορῆς βορέω βίος Βοῦσαι βίου βουκόλῳ βουκόλια βουκόλον βουκόλος βουκόλου βουκόλων βουκολίαι βουλεύειν βουλεύεσθαι ἐβουλεύετο βουλεύηται βουλεύονται βουλεύσαντα ἐβουλεύσαντο βουλεύσασθαι βουλευόμενος βουλευομένοισι βουλευτήριον βουλεύων βουλεύωνται βουλόμενοι βουλόμενον βουλόμενος βουλόμενός βουλὴν βουλοίατό βουλομένῳ βουλομένοισι βουλήσεται Βραγχίδας Βραγχίδῃσι βραδύτερος βραχίονας βραχύτερα βάρβαρα βάρβαροι βάρβαρον βρεχούσας ὑβρίζοντα ὕβριος ὑβρισταὶ ἁβρὸν ὑβρίσαντι βρέφος βῶσαι βόσκων Βίτωνα Βίτωνι Βυβασσίης βυβλίον βωμοῦ βωμοὺς βωμός ἐβίωσε ἐγὼ γῇ ἤγαγε ἀγαγεῖν ἀγαγὼν ἀγαγομένη ἤγαγον ἀγαγέσθαι ἀγαθὰ ἀγαθὸν ἀγαθοί ἀγαθοεργῶν ἀγαθοεργοὶ ἀγαθός γαλαθηνὰ γαλακτοπόται ἄγαλμα γαμβρὸν γαμέει Ἀγαμεμνονίδην Ἀγαμέμνονος γαμέουσι Ἀγασικλέης γαστέρα ἡγέαται Ἀγβατάνων Ἀγβάτανα Γύγῃ Γύγεα ἀγγείλῃ ἀγγελίας ἀγγελίη ἀγγελιηφόρους ἄγγελοι ἄγγελον ἄγγελος ἀγγελέων ἄγγεος Γύγεω Γύγη Γύγην ἀγγηίοισι Γύγης ἐγγινομένου ἀγγέλους ἀγγέλων ἐγγίνεται γέγονε ἠγάγοντο ἄγγος ἐγγράφειν ἐγγὺς ἐγγυητὰς ἐγγυητέω ὀγδώκοντα γε ἦγε γεγόνασι ἐγεγόνεε ἐγεγόνεσαν γεγονέναι γεγονός γεγονότα γεγονότας γεγονότες γεγονότι γεγονυῖαι ἄγειν γειναμένους γεινάμενοι ἤγειρε ἤγειρον γελᾶν γελάσας ἡγεμονίη γενεῇ γενεᾶς γενεῇσι γενόμενα γενόμενοι γενόμενον γενόμενος γενόμενός γενναῖα γενναιότατα γενναιότατοι ἀγεννέστερος γενοίατο γενομένῃ γενομένη γενομένην γενομένης γενομένου γενομένων γενέσθαι ἀγείρας Γερμάνιοι ἄγεσθαι ἄγεσκον ἄγεται γευσάμενοι γεφύρας ἥγημαι ἥγηνται Ἡγησικλέος ὑγιέα ὑγιαίνω γινόμεθα γινόμενα γινόμενον γινόμενος γινομένης γινομένου γινομένων γινώσκειν γινώσκοι ἀγκῶνας ἔγκυος Γλαύκου ἠγάλλοντο ἀγάλματα ἀγάλματος γλώσσῃ γλῶσσαν γλώσσης γλῶσσάν ἀγόμενος γάμον γάμων γῆν γένῃ ἀγῶνα γύναι Γύνδῃ Γύνδεω Γύνδην Γύνδης γένεα ἐγένεο γένεος ἁγνεύουσι γίνεσθαι γίνεσθε γένεσις ἐγένετό γίνεται ἐγένετο γένηται ἀγῶνι ἀγώνισμα γνώμῃ γνῶμαι γνώμας ἀγνύμενος γνώμη γνώμην γνώμης γνώμῃσι γένοιτο γίνονται ἐγένοντο γένος γνοὺς γόνου γόνυ ἔγνωκας γένωνται ἔγνωσαν ἦγον γονέας γούνατα γονέος ἄγοντα ἄγονται ἄγοντες ἀγορή ἀγοραῖοι Γορδίεω ἀγορὴν ἀγορῆς ἀγορῇσι γουνάτων ἄγουσι γὰρ γραμμάτων ἄγρας γέρας γραφὴ ἠγόρευον ἄγρην ἀγρίης γράμμα γράμματα ἀγρῶν Γρύνεια ἀγροῦ γέροντας γράφοντες γράψαι γράψας γράψω Ἄγρων γέρων Ἄγρωνος γῆς ἡγήσαντο ἡγήσασθαι Γυγαίη Γυγάδας Ἀγυλλαῖοι Ἀγυλλαίοισι γυμνικὸν γυμνήν γυνή γυναικί γυναικηίῳ γυναικηίου γυναικῶν γυναικὸς γυναιξὶ γυναῖκα γυναῖκας γυναῖκες γυναῖκάς γέφυρα γέφυραν ἐγχειρίδιον ἐγχειριδίοισι ἄγχιστα ἀγχοῦ ἄγω ἔγωγε ἄγων γωνίης ἀγωνιζομένων ἀγωνισάμενος ἠγωνίσατο ἄγωνται ἄγωσι δ ὁδῷ ἰδίῃ δὲ δέῃ Δία δαιμόνων ἔδαισε δίαιτᾳ δίαιταν δαιτυμόνες δακρύοντα δακρύσασα δακτύλοισι δακτύλους δακτύλων δαίμονα δαίμοσί δαίμων ἐδαίνυντο δαπάνην Δαρδανέων Δαρείῳ Δαρεῖον Δαρεῖος Δαρείου Δασκύλου δαῖτα ὕδατι δατέονται ὕδατος ἐδίδοσαν ἐδίδου δίδωμί ἥδε δεῖ ἐδεδέατο δεδεμένον δεδήλωται δεδοικὼς ἐδεδούλωντο ἐδεδούλωτο ἔδεε δεηθεὶς δεηθέντος δεησομένους ἐδεήθησαν δεικνύντας δεικνὺς δειλίην δειλοὶ ἔδειμαν δειμαίνοντες δεινόν δεινοί ἐδεινολογέετο δεινούς δεινῶς δειρῆς ἔδεισά δεκατευθῆναι δεκαέτης ἀδελφεὸν ἀδελφεοῦ ἀδελφεούς ἀδελφεὸς ἀδελφιδέου Δελφῶν δελφῖνα δελφῖνος Δελφοὶ Δελφοὺς Δελφοῖσι δεόμενος ἰδεῖν δεῖν δενδρέων δεξιὰ δεξιῆς δεξιώτερον δεξάμενοι δεξόμενος δεῖπνον δείπνου Ἰάδες ἀδεῶς δείσαντα δείσας δέεσθαι δεσμῶν δεσποίνῃ δεσποτέων δεσπότας δεσπότεα δεσπότην ἐδέετό δεύτερα δεύτερον δεύτερος ἐδέετο Δευκαλίωνος δευτερεῖα Δευτέρῃ δευτέρῃ δευτέρα δευτέρης δευτέρου δευτέρους δίζησθαι ἐδίζητο δίζω ἤδη Δηιόκεα Δηιόκεω Δηιόκης δηλοῦσί δηλῶσαι δηλώσασα δηλήσι δηλώσω δηλωθῇ δημοσίῃ δημοσίου ἰδέην Δηρουσιαῖοι ἰδέης δῆθεν Διί δι διὰ ἴδια διαβαίνειν διαβατὸν διαβατὸς διαβεβλημένος διαβησομένου διαβῆναι διαβάντας διαβὰς διαβήσεσθαι διαβήσεται διαγνοίη διαθέντος διαθέωνται διαιτώμενον διαιτωμένῳ διακέαται διακελεύεαι διακελεύσομαι διακελευσαμένους διακλέψαι διακομίσαντες διακρῖναι διακρίνων διαλαβεῖν διαλαβών διαλέγονται διαλεγόμεναι διαλλαγή διαλυθέντος διαμετρησάμενοι διαμετρήσασθαι διαμιστύλας διαπεμπομένους διαπέμψας διαπορθμευόντων διαπρηξαμένους διαραίρηται διαίρεε διαρπάζει διαρπάσαντας διασκεδᾶν διαστάντας διαστοιβάζοντες διατελέῃ διατελέει διατίθεσθαι διατάξας διατρίβοντα διαφθαρείη διαφθαρεισέων διαφθαρῆναι διαφθεῖραι διαφθείρει διαφθείρειε διαφθείρεσκε διαφοιτέοντες διαφορέει διαφορῆς διαφέρουσι διαφυγεῖν διαχρεωμένους διαχρήσεσθαι διαχρᾶσθαί διαχρᾶται διαχρέωνται διάβαινε διάβασιν διάβασις διέβησαν διάγειν διδασκομένων διέδεξέ διέδεξε διδόναι διδόντα διδάξαντα διδοῖ διδοίη διάδοχος διεβίβασε διεκόσμησε διελεῖν διελθόντος διελὼν διελόντα διενειχθέντων διενείκας διεξελαύνοντι διεξελθεῖν διεξήιε διεξιόντες διεξέλθοι διεπέμποντο διεργάζεται διεσκέδασε διεσκεδασμένοι διεσπασμένον διετετάχατο διεφθαρμένοισι διεφθαρμένον διεφθαρμένων διεφθάρη διεφθάρησαν διεχρήσαντο διζήμενοι διζήμενος διηκοσίας διηκοσιέων διηκοσίων διηκόσια διθύραμβον δικαίῳ ἐδικαίευ δικαιῶ δικαιεῦσι δικαιοσύνην δικαιότερον δικασόμενοι δικασάντων δικαστήν δικαίως δικάζειν δικάζων ἀδικημάτων ἀδικίης ἀδικήματα ἀδικήματος ἀδικοῖεν ἄδικον ἀδικώτατον ἀδικέων διέλαβε διέλαχον Δινδυμήνης διάνοιαν διέξοδοι ἴδιον Διονύσῳ διάπειραν διέπεμπε διέπεμψε διέργει διώρυχα διώρυχας διώρυχι διώρυχάς Διὸς δισμυρίας δισμυριέων διέστησαν διάστροφα ἰδιώτῃ διέταξε ἰδιώτας ἰδιώτεω διότι διτάλαντα διέτριψαν διφασίας διέφερε διέφθαρτό διέφθαρτο διέφθειραν διέφθειρε διφθερέων διφθέρας διφάσια διέφυ διωρύχων ἰδιωτικός ἰδιωτέων δίκῃ δέκα ἐδίκαζε δίκαια δίκαιον δίκαιος δίκαν δίκας ἐδόκεε ἐδόκεον δέκεσθαι δέκεσθε δίκην δόκιμος ἀδίκοισι ἐδέκοντο δίκτυα δίκτυον ἀδίκων δόλῳ δῆλα Δῆλον Δήλου δόλου ὀδμή δήμῳ δώματ ἴδμεν ἰδόμενοι ἰδόμενος Δύμη Δήμητρος ὀδμὴν δῆμοι δῆμον δῆμος δήμου δήμους δήμων ὁδῶν δύναιτο δύναμαί δύναμιν δύνασθαι ἀδύνατα ἐδύνατο ἀδύνατον δένδρεα δένδρον ἰδόντα ἰδόντες δόντες ἰδόντι ὀδόντος δόντος δόξαι δόξαν ἐδέξαντο δόξας δόξει δόξω ὁδοῦ δύο Δάοι ἴδοι δέοιτο δοκέῃ δοκέει δοκέειν δοκέεις δοκιμώτατον δοκίμου δοκίμων δοκέοι δοκέοντα δοκέοντας δοκέουσι δοκέω δοκέων δούλῳ δούλης δοῦλον δούλου δούλους δολώσας δούλων δέομαι ῥόδον δέον δοῦναι ἡδονὴν δέοντα ἐδέοντο ἔδοξέ ἔδοξε δοράτια δορυφόροι δορυφόροισι δορυφόρος δορυφόρους δορυφόρων Ἰάδος ὁδοὺς δοὺς ἰδοῦσα δοῦσα ἔδοσαν ὁδοῖσι ἔδοσάν ἐδουλώθησαν δουλούμεθά δουλοπρεπέα δουλοσύνη δουλοσύνην δουλοσύνης δουλώσας δέους δέουσα δῶρά δῶρα ἔδραμον δόρασι δόρατά ἱδρύεσθαι Ἀδρίην Ἄδρηστε Ἄδρηστον Ἄδρηστος δέρμασι ἁδρύνεταί δώροισί δῶρον Δρύοπες Δροπικοὶ ὑδροποτέουσι Δώρου δρέπανον ἁδρός ἱδρύσαντο ἱδρυθέντων ἱδρυμένον Δρυοπίδα Δρυοπίδος ἱδρυσάμενοι ἵδρυται ἵδρυτο ἴδῃς δὶς δώσει δώσειν δώσεις ἴδῃσι δόσι δόσιν δέσποιναν δέσποτα δώσω ἀδύτου δότω δυώδεκα δυῶν δυναίμην δυναμένους δυνατοὶ δυνατὸς δυνατώτερος δυνατωτάτους δυνάμεθα δυνάμεναι δυνάμι δυοῖσι δυωδεκάτῳ ἐδάφεος δίχα δύω Δωδώνην ἔδωκέ ἔδωκα ἔδωκαν ἔδωκε ἑδωλίοισι ἴδωνται ἐδίωξαν ὕδωρ δωρέεται δωρησάμενος ἐδωρήθη Δωριέας Δωριέες Δωριεῦσι Δωρικὸν Δωρικοῦ Δωριέων δωτίνας δωτίνην εἰ Εὐβοίες εἶδέ εὐδαιμονίῃ εὐδαιμονέειν εὐδαιμονίη εὐδαιμονίην εὐδαιμονίης εὐδαιμονήσειν εὐδαίμονες εἶδε εἴδεα εἰδείης εἴδεος εἶδες εἴδεός εἶδόν εἰδέναι εὐδοκιμέειν εὐδοκιμήσας εἶδον εὕδοντι εἶδος εἰδὼς εἰδότες εἴδωλον εὕδων εὐειδεστάτας εὐειδεστάτη εὐειδεστάτην εὐειδής εὐειδέων εἶεν εὐεργεσίαι εὐεστοῖ εὐζώνῳ εἴη εὐηθείης εὐηθέστατον εἴην εἴησαν εὐθηνήθησαν ἄεθλον ἀεθλοφόροι ῥέεθρα ῥέεθρον ῥεέθρου ῥεέθρων εὐθὺς ῥέει ἀεικείῃ ῥέειν εἰκάζων εἰκόνα εἰκόνας εἴκοσί εἰκοσαέτεος εἴκοσι εἰκάσαι εἴλῃ εἰλαδὸν εἴλας εἷλε εἷλκον εἷλον εἵλοντο εἰμὶ εἷμα εἵμασι εἵματα εἰμι εἰμὲν εὔμορφοι εἶναί εἶναι ἀείναον ἀείναος εἴνατον εἵνεκα εἵνεκεν εὐνήν εὐνομίην εὐνομήθησαν εὐνομήσεται εὐνούχων εἴξαντα εὔξασθαι Εὔξεινον Εὐξείνῳ Εὐξείνου εὐπαθείας εὐπαθείῃσι εὔπαις εἶπαν εἶπας εἶπε εἰπεῖν εἵπετό εἵπετο εὐπετέως εἰπόντα εἰπόντος εἶπον εἵποντό εἵποντο εὐπρεπέστατον εἰρίῳ εὐρέα εὗρε εἴρεό εὑρεθείη εἰρεσίῃ εἴρετό εἴρετο εἴρηκας εἰρημένῳ εἰρημένα εἰρημένον εἰρημένους εἴρηταί εἴρηται ἀερθέντας ἀερθέντες εὕρισκε εὑρήκοι εὑρὼν εἰρίνεον εἰρήνην εἰρήνης εὑρόντες εἰρομένου εὖρος εὑροῦσα Εὐρώπην Εὐρώπης εὑρήσεις εἰρέσθαι εἰρήσθω εὑρίσκῃ εὑρίσκεται εὑρίσκουσι εὑρίσκω εὑρίσκων εἰρώτα εἰρώτευν εὐρυτάτη εἰρωτώμενον εἰρωτᾶν εἰρωτῶσι εἰσὶ εἷς ἀεῖσαι ἵεσαν ἀείσας εἰσβάντες εἱσάμενοι ὕεται εἴτε εὔτυκα εὐτυχέα εὐτυχέειν εὐτυχέες εὐτυχίη εὐτυχέοντες εὐτυχέοντος εὐτυχέος Ἠετίωνος Εὐφρήτεω Εὐφρήτην Εὐφρήτης εἶχέ εὐχαρίστως εἶχε εὐώχεε εὔχεσθαι εὔχετο εὐχὴν εἶχον εὐωνύμου εὐωχήθησαν ζόῃ ζῷα ῥίζαν ῥίζας ἐζώγρησαν ζῳδίων ζεύγεϊ ζεύγλην ζεῦγος ἵζει ζώειν Ζεὺς ἔζεσαν ζευγνὺς ζευγνύων ζευγέων ζημίην Ζηνὶ ζόης ἵζηται ζητέεις ζητέοιεν ἀζήμιος ζώνας ζῶντα ἱζομένην ζώοντα ζώουσι ζάπλουτοι ζῶσάν ἐζήτεον ζήτησιν ζέφυρον ζωγρηθείς ἐζωγρήθη ἐζωγρήθησαν ζωόντων ζωὸς ζωστῆρας ηὗδον ῥηθὲν Ἀηθναίη ῥηθέντα ῥητόν ἰητροῖσι ἰθὺ θαλάμους Θαλῆν Θαλῆς θαλάσσῃ θαλάσσης θανατώσων θανάτῳ θαρσέειν θαρσέομεν θαρσέοντα ἰθέας ἐώθασι ἔθαψά ἔθαψαν ἔθαψε Θήβῃσι θεῷ θείῃ ἤθεα ἔθεε ἐώθεε θεησάμενον θεησάμενος ὠθέει θύειν θειοτέρως θειότερον ἤθελε ἐθελοκάκεόν ἐθελοντὴν ἐθελοντής ἐθελῆσαί ἐθελῆσαι θελῆσαι ἐθελήσει ἐθελήσεις ἐθελήσομεν θεμένη ὅθεν θεὸν θεῖναὶ θεῖναι ἔθεντο θεοὶ θεοβλαβὴς θεογονίην Θεοδώρου ἔθεον θεῖον θεοπροπίου θεοπρόπια θεοπρόπιον θεοπρόποι θεοπρόποισι θεοπρόπους θεούς θεοσεβέα θεοῖσι Θεοφανίοισι θεοφιλὴς θεραπεύουσι θεραπηίη θερείην θερμῇ θερμοῦ θεράποντες θεράποντος θεὸς ἐώθεσαν θεήσασθαι θεήσεαι θεσπισάσης θεσπίσῃ Θεσσαλιῶτιν θύεται ἔθετο θεωρίης θεωρέοντι Θηβαιέος Θηβαῖοι Θηβέων ἐθηεῖτο ἔθηκε θηλέας Ἀθηναίῃ Ἀθηναῖε Ἀθηναίη Ἀθηναίης Ἀθηναῖοι Ἀθηναίοισι Ἀθηναῖον Ἀθηναῖος Ἀθηναίους Ἀθηναίων Ἀθηνέων θηρία θηρεύσαντες θηρευτῇ θηριωδέστατα θηριωδέστατον θηρίον θηρίου θέης θησαυρῷ θησαυροί θησαυρούς θησαυρός ἴθι θήκας θήκην θῶκοι θέλῃ θάλαμον θάλασσα θάλασσαν θήλεα θήλεαν ἐθέλει θέλει ἐθέλειν θέλειν ἀέθλεον ἠθέλετε Θάλεω ἠθέλησαν ἐθέλοι θέλοι ἐθέλοντα ἐθέλοντες θέλοντες ἐθέλουσι θέλων θῶμα ἐθώμαζες θώματα θώματι θώματος ἐθάμβεον θέμεναι θώμιγγος θέμις ἰθὺν Ἀθῆναι Ἀθήνας θάνατον ἀθάνατος ἔθνεα ἔθνεϊ ἔθνεος ἰθύνεται θνητῶν θύννοι ἔθνος ἐθνέων θοίνῃ ἐθοίνησε θύοντι θύουσί θύουσι θάπτεται θάπτουσι θύρας Θρασύβουλον Θρασύβουλος Θρασυβούλῳ θραυομένης θώρηκας Θρηίκης Θρηίκων θύρην θώρηξ θύρης Θρήικες θρόμβους Θόρνακι θρῆνοι θρόνον θρόνος θρόνου θέρος θάρσεέ θάρσεε Ὀθρυάδην Ὀθρυάδης θρέψειν ἰθύς θύσαντος θύσας θήσει ἰθύσειε θύσιμα θέσμια ἐθέσπισε θᾶσσον θῆται θυγατρὶ θυγατέρα θυγατέρες θυγατρὸς θυγατράσι θυγάτηρ θυμῷ θυμαλγέα θυμίημα ἀθυμίην θυμὸν θυμός Θυνοί Θυρέας Θυρέης Θυρέῃσι θυρέων θυρωροὺς θυσίας ἔθυσε θυσίη θυσίης ἔθυσάν θυσίῃσι θάψειν θάψον θωμαστά θωμάζω ἠθέων ἤιέ ἤια ἤιε ἤισαν κ ἐκ ὅκῃ κῇ καὶ Καδμείη Καδμεῖοι Καδμείων Καείρας Καείρης καίεσθαι καθαρθεὶς καθαρὸν καθαροῦ καθαρὸς καθαρσίου καθήραντα καθήραντος καθήρας καθάρσιον καιόμενον καιομένῳ καιριώτατα καιρὸν κακῷ Καύκασος ἐκακώθησαν κακόν κακοῦ κακοδαιμονίῃ κακονομώτατοι κακοῦργοι κακός κακίστῳ κακίστους Καύκωνας καλὰ καλέει καλέειν καλεόμενοι καλεόμενον καλεόμενος καλεομένῃ καλεομένας καλεομένη καλεομένην καλεομένης καλεομένοισι καλεομένου καλεομένους καλεομένῃσι καλεομένων καλέεται καλλιστευούσας καλλίστῳ καλλίστην καλλίω καλάμην καλάμης καλάμων καλὸν καλοί καλέοι καλέονται καλέοντες ἐκαλέοντο καλέουσι καλῶς καλέσας Καλυνδικῶν καλέων Καμβύσῃ Καμβύσεω Καμβύσης καμήλῳ καμήλους καμήλων καμίνοισι ἔκαμνον καμπὰς καμάρῃσι κανέῳ Κανδαύλῃ Κανδαύλεα Κανδαύλεω Κανδαύλης ἀκανθώδης Καύνιοι Καῦνον ἱκανὰς καίπερ καπηλεύειν Καππαδόκαι Καππαδόκας Καππαδοκίην Καππαδοκίης Καρίῃ Καρίην Καρικὸν Καρικοῖσι Καρῶν Ἀκαρνὰν Καρίου καρπῷ καρπὸν καρποῦ καρποὺς καρποφόροι καρπὸς Καρσί Καρὸς καρτερὰ καρτερόν καρτερῆς Καρχηδόνιοι κασιγνήτοισι Κασπίη Κασπίην Κασπίης ἕκαστα ἕκαστοι ἕκαστον ἕκαστος ἑκαστάτω κατ κατὰ καταβιβάζειν καταβιβάσαντα καταβῆναι καταβάντα καταβὰς καταβάσιας καταγίζουσι καταγιεῖν καταγιζόμενον καταγιζομένου καταγωγή καταδικάζεις καταδέξαντες καταινέουσι καταιρεθεῖσα καταιρέειν καταιρήσειν κατακαέντα κατακαυθῆναι κατακειράμενοι κατακεκαλυμμένα κατακεκαλυμμένην κατακεχρυσωμένους κατακηρώσαντες κατακληίσαντες κατακλίνας κατακοιμηθέντες κατακρύπτει κατακυλισθεῖσαν κατακόψαι κατακόψαντας κατακόψας καταλαβεῖν καταλαμβάνοντες καταλευσθέντες καταλιπών καταλλάσσετο καταλέξας καταλέξασθαι καταλέξει καταλύσειν καταμεθύσαντες καταντίον καταπαῦσαι καταπαύσαντα καταπαύσοντα καταπλεύσαντες καταπλέοντες καταπλώσαντας καταπλώσαντες καταπορνεύει καταπορνεύουσι καταργυρωμένους καταρκέει καταρραγῆναι καταρρωδήσαντες καταρρωδήσας κατασβεσθῆναί κατασιτέονται κατασκόπους κατασπάσαντες καταστησάμενος καταστῆναι καταστρεφόμενος καταστρεψάμενος καταστροφὴ καταστροφὴν καταστρέψασθαι καταστρέψεσθαι καταστὰς καταστήσαντα καταστήσας καταστήσεις κατασχόντας κατέαται κατατίθεσθαι κατατέτμηται καταφαίνεται καταφερομένου καταφρονήσαντες καταφρονήσας καταφυγόντες καταχεάμενος καταχρᾷ καταχρήσασθαι κατέβαινε κατέβαλλε κατέβαλον κατέβη κατάγει κατάγουσι κατόδῳ κατάδηλος κατέδοξα κατεδόκεε κατεδούλωσε κατειληθέντες κατειλήθησαν κατειπεῖν κατεκαίετο κατεκαύθη κατεκερτόμεε κατεῖλε κατελεῖν κατελύθησαν κατελθὼν κατελέλειπτο κατεπαύσθη κατεπόντωσαν κατεργασμένου κατεργασμένων κατεργάσασθαι κατεῖσέ κατεσκευασμένη κατεσκευάσατο κατεστεώσας κατεστεῶσι κατεστεῶτα κατεστήκεε κατεστραμμένη κατεστραμμένου κατεστραμμένων κατεστράφατο κατεστρέφετο κατεστράφθησαν κατεστρέψατο κατεστᾶσι κατευωχέονται κατεφόνευσαν κατεύχεται κατείχετο κατεχόμενόν κατείχοντο κατεχρήσαο κατίζειν κατίζοντες κατηκόντων κατηλόγησε κατιόντας κατιόντος κατιρῶσαι κατιρώσας κατέκαιε κατήκοοι κατήκουσα κατέλευσαν κατήμενον ἑκατόν ἐκέατο κατοικημένων κατοικῆσθαι κατοικτείρει κατοίκηνται κατορθοῦσθαι ἑκατοστῇ κατύπερθε κατέπεσε ἑκατέρῳ κατάρας κατέργαστο κατάρην κατέρχεται ἑκατέρων κατήσθιον κατάσκοποί κατέστηκε κατῆστο κατάσχῃ κατέτεινε κατυβρίσας κατυπερτέρους κατυπέρτεροι κατέφυγον κατέχαιρέ κατέχει κατέχοντα Καυκάσιον Καυνικόν Καυνίους ἐκβαλόντας ἐκβαλόντες ἐκβαίνειν ἐκβάλλειν κύβους κύβων κἀγαθοί ἐκγενόμενα ἐκγόνοισι ἔκγονος κέγχρου ἐκδεκόμενος ἐκδημέουσι ἐκδημήσας ἐκδιδόναι ἐκδιδόντος ἐκδιδοῖ ἐκδιδοῦσι ἐκδέκεται ἐκδέκηται ἐκδύνουσα ἐκδόντες ἐκδοῦναι κήδονται Κόδρου ἐκδόσιος ἐκδυομένῳ ἧκε ἐκεῖ ἄκεα κεῖθεν ἐκεῖθι κειμένη κειμένων κεινῇσι ἥκεις ἔκειτο κεκακωμένων κεκλῆσθαι ἐκεκοσμέατὸ κεκοσμημένον κεκόσμηται ἐκεκόσμητο κελεύῃ κελεύει κελεύειν κελεύεις κελεύοντα κελεύοντες κελεῦσαι κελεύσαντος κελεύσασι κελευόμενα κελευόντων κελευσμοσύνης κελεύω κελεύων κείμενα κείμενον ἐκείνῳ ἐκεῖνα ἐκείνη ἐκείνην κεῖνόν ἐκεῖνο ἐκεῖνοι κεῖνοι ἐκείνοισι ἐκεῖνον ἐκεῖνος ἐκείνου ἐκείνους ἐκείνων κείνως κεραΐζεις κεραΐζοντας Κεραμεικὸς κερδανέεις κέεται κεῖται ἵκετο ἱκετέων κεφαλῇ κεφαλὴν κεφαλάς κεφαλῇσι κεχαρισμένον κεχώρηκε κεχρημένον κεχυμένον κεχωρίδαται κεχωρισμένοισι κεχωρίσθαι ἀκηκοὼς ἀκηκοότα ἀκηκοότες κηλωνηίοισι κάθαρσις ὁκόθεν κόθεν ἐκθεῖναί ἐκθεῖναι ἐκάθηρα ἐκάθηρε ἐκθέσιος κιβδήλῳ κιβδήλου κιθαρῳδὸν κιθαρίζειν κιθῶνα κιθῶνας κιθῶνι κιθῶνάς κιθάρην Κιλίκων Κιμμερίους Κιμμερίων Κιμμέριοι κινδύνων κινέειν κιόνων ἥκιστα ἐκκαλύψας ἐκκειμένῳ ἐκκείμενον κάκιον κάκιστα κύκλῳ ἐκκληιόμενοι κέκληται ἐκέκλητο κύκλον κύκλος κύκλου κύκλων ἐκκομίζουσι ἐκκομίσας Κλαζομεναὶ Κλαζομενάς Κλαζομενίων Κλαζομένιος κλαυθμῷ κλαυθμὸν κλαίων ἐκλέγονται ἀκλεᾶ Κλεόβι ἐκάλεε Κλειὼ ἐκέλευε κέλευε ἐκέλευον ἐκέλευσε κληθέντας κληρῶσαι ἐκλήθη ἐκλήθησαν κλιθέντες Κίλιξ ἐκλιπεῖν ἐκλιπόντας ἐκλιπόντες Κίλλα κόλλησιν κάλλιόν κάλλιστα κάλλιστον κάλλιστος κλίνας κλίνη κλίνης Κλέοβίν κλῶπες κόλπος κλέπτοιεν κλήρους Κόλχους Κόλχων κώμῳ ἀκμαζούσας ἐκμαθεῖν κῶμαι ἐκμανθάνοιεν κώμας Κάμειρος ἐκμεμαθηκέναι Κύμη κάμηλοι κάμηλον Κύμην κόμην κώμης κάμνοντα κάμνοντας κάμνων ἄκμονα κώμῃσι κύνα κύνας Κνίδιοι Κνίδος κίνδυνος ἀκίνητος Κνιδίη Κνιδίης Κνιδίων ἑκόντες ἀκόντια κνάφου ἀκοῇ κού κοίῃ κοῖαι ἀκούειν κοίη κοθόρνους κοιμώμεθα κοιμᾶται κοινῷ κέοιτο κολλητόν Κολοφὼν Κολοφῶνος Κολοφωνίους Κολοφωνίων Κολχίδα Κολχίδος κολωνὸς κομίζειν κομίζεσθαι κομίζουσαι κομίζωνται κομισθῆναι κομισσάμενος κομᾶν κομῶντες κομίσας ἐκομίσθη ἀκοὴν ὁκοῖόν ἥκοντες ἀκοντίζων ἥκοντι ὁκοῖον κοῖος Κορινθίοισι Κορινθίων κορύνας Κορίνθῳ Κορίνθιοί Κορίνθιοι Κορίνθου κορέσω κορυνηφόροι ἀκούσαντα ἀκούσας ἀκούσεσθαι ἡκούσης κοσμέονται κοσμήσας κοσμέων ἀκούσω κοτὲ κοτε κοίτην κοίτης κοῖτον ὁκοτέρην κου ὅκου ἤκουε κουριδίας ἤκουσα ἤκουσαν ἤκουσε κουφότατα κοψάμενοι ἀκούω ἀκούων ἐκπεπέτασται ἐκπεσόντας ἐκπεφευγὼς ἐκπηδᾶν κάπηλοι ἐκπλαγεὶς ἐκπλαγέντας ἐκπλύνεσθαι ἐκπλῆσαι ἐκπλώσαςἵνα ἐκπέμπει ἐκπέμπειν ἐκπέμπεν ἐκπέμπεσκε ἐκπέμπουσι ἐκπέμψαι Κύπου Κύπρῳ Κύπριοι Κύπρου Κύρῳ κρέα Κᾶρας κραταιρίνοιο κρατερῆς κρατῦναι ἐκρατύνθη κρατίστη κραυγανόμενον Κῦρε κρεμάμεναι κρεμάμενον κρεῶν Κᾶρες κρέεσσιν ἄκρη κρηπῖδα κρηπὶς ἐκύρησε Κρηστῶνα Κρηστωνιῆται Κρητικοῖσι κρητὴρ κρητῆρά κρητῆρα κρητῆρας κρητῆρες Κρᾶθις κριθέων ἔκριναν Κόρινθον ἔκρινάν Κῦρόν Κύρνῳ κράνεα κρίνεις Κύρνον κρίνον κρίνω ἀκροθίνια Κῦρον ἀκροπόλι ἀκροπόλιος Κροίσῳ Κῦρος ἄκρος Κροῖσε Κροῖσόν Κροῖσον Κροῖσος Κροίσου Κύρου ἀκρόπολιν ἀκρόπολις κρύπτουσι κρύπτων Κῦρός κρέσσονες Κρήτῃ κύρτῃ κάρτα Κρῆτες Κρήτην Κρήτης ἐκράτησας ἐκράτησε κράτος ἀκρήτου ἐκράτυνε κήρυκα κήρυκας κήρυκος κῆρυξ ἐκήρυξαν ἔκρυπτε κρυπτόμενα ἐκήρυσσε ἄκρων Κῶς κῶς ὁκόσα ἀκέσασθαι κόσμῳ κόσμον κόσοι ἑκάστῳ ἑκάστας ἑκάστην ἑκάστης ἑκάστοισι ἑκάστοτε ἑκάστου ἑκάστους ἐκστρατευσάμενοι ἑκάστων ἕκτῃ ἱκέται ὀκτακοσίων ὀκτακόσιοι ἱκέτας ἐκτελέσαι κτεῖνε κτείνει κτείνειν κτείνοντες κτείνουσι ὁκότερα κότερα ὁκότεροι ἑκάτερον κότερον ἱκέτευε κτίζειν ἕκτην ἱκέτην κτηνέων ἱκέτης ἔκτισαν κτισθεῖσαν κάτισον κτήνεά κτῆνος κτῶνται κάτοδον ἐκτραπόμενοι ἐκτραπόμενος ἐκτρέφον ἐκτρέψασα κτίσαι κτίσαντες ἐκτήσαντο κτίσας ἐκτῆσθαι ἱκέτῃσι κτῆσιν κάτω ὀκτωκαίδεκα Κυαξάρῃ Κυαξάρεω Κυαξάρης Κυθηρίη Κυθήροισι κυκλοτερέα Κυμαῖοι Κυμαίους Κυνὼ κυάνεοι κυνηγέσιον κυνέην κυνῶν κυνὸς κυρίην κυρῆσαι κυρήσει κυσί Κυψέλου ἐκφερομένην ἐκφήναντος ἐκφορέουσι ἐκφέρει ἐκφέρειν ἐκφέροντας ἐκφυγὼν ἐκφυγόντα κω κωμέων ἥκων ἀέκων κύων κως ὅκως κωφοῦ κωφός ἁλῷ ἡλίῳ ἐλαίῳ ἔλαβέ ἔλαβε λαβεῖν λαβὼν Λαβύνητος λαβόντα λαβόντες λαβομένη ἔλαβον λαβροτάτῳ λαβέτω Λαβυνήτου λαγὸν λαγοῦ λαγχανούσῃ ἐλαίην Λακεδαιμόνιοι ΛακεδαιμόνιοιἈρκάδων Λακεδαιμόνιος Λακεδαιμονίης Λακεδαιμονίοισι Λακεδαιμονίοσσι Λακεδαιμονίους Λακεδαιμονίων Λακεδαίμονα Λακεδαίμονι Λακρίνης Λακωνικῆς Ἀλαλίη Ἀλαλίην λαμβανόμενον λαμβάνειν λαμβάνοντας λαμπρὸν λαμπροτάτη ἐλαύνῃ ἐλαύνειν ἐλαύνοντα ἐλαύνοντες ἐλαύνων λαῦραι ἁλέας ἤλασε ἱλασάμενοι ἔλασσον ἤλαυνε ἤλαυνον ἐλαφρῷ ἔλαχόν λαχόντας ἐλαχίστη ἐλαχίστην ἐλαχίστου ὀλβία λάβε Λέβεδος λέβητες λέβητι ὄλβια ὄλβιον ὄλβιος ὀλβιώτατά ὀλβιώτατον ὀλβιώτατος ὀλβιώτερος λάβοι ὄλβον ὀλβίους ὀλίγῳ λόγῳ ὀλίγα Λύγδαμις λέγει λέγειν λέγεις λέγεται ὀλίγης λόγιμον λόγιοι ὀλίγοι λέγοι λέγοιεν ὀλίγοισι λόγοισι ὀλίγον λόγον λέγοντα λέγονται λέγοντες λέγοντι λέγοντος ὀλίγος λόγος λόγου λέγουσί λόγους λέγουσαν λέγουσι λόγχῃσι λέγω ὀλίγων λέγων Λίδη Λύδιος ἕλεά ἔλεγέ ἔλεγε λεγόμενα λεγόντων λεγομένας λεγομένοισι λεγομένων ἔλεγον ἐλεγχόμενος ἐλεγχομένους ἔλεγχον ἐλεύθεροι λειμῶνα λειπόμενοι λειφθέντας λειφθέντος λεύκην λελουμένους λείμματα ἑλεῖν λεὼν λεήναντες Ὤλενος ἔλεξέ ἔλεξε ἀλεξομένους λείπεται λεπτὰ Λεσβίοισι ἐλευθερίην ἐλευθερίης ἐλευθερώθησαν ἐλευθεροῦντο ἐλευθερωτέρη ἐλευθέρους λευκῶν λευκοῦ λευκὰς λευρῷ Ἐλευσῖνι λεχθείσῃσι λεχθὲν Λεωβώτεω λεωφόρων Ὑέλη ληίην ἀληθέα ἀληθείῃ ἀληθείην ἀληθίζεσθαι ἀληθέι ἀληθέως ἐληλαμένας ἐληλύθεε ἁλίην ληίου ὕλης Ἀλέης ἕληται ἦλθε ἐλθεῖν ἐλύθη λήθην ἔλθητε ἐλθὸν ἐλθόντα ἐλθόντας ἐλθόντες ἐλθόντος λίθοι λίθοισι λίθος ἐλθοῦσι λίθους ὀλέθρῳ ἔλθω λίθων Λιβύῃ λιβανωτοῦ Λιβύης ὀλιγοχρόνιον ὀλιγωρίης ἠλιθίου ἡλικίῃ Ἁλικαρνησσεύς Ἁλικαρνησσόν Ἁλικαρνησσοῦ Ἁλικαρνησσέος ἡλικίην ἡλικίης Ἑλικωνίῳ Ἀλιλάτ Λιμενηίῳ λιμὸν λιμένος λινέῳ ἐλινύειν ἥλιον λήιον λιπαρεόντων λιπαρέοντας ἔλιπον ἅλις ἁλισθεῖεν ἁλισθῆναι ἁλισκομένου λιτάς λιτῇσι Ἀλκαίου ἕλκει ἡλώκεσαν Ἑλίκη ἄλκιμον ἀλκιμώτερον ἀλκιμώτερος Λύκιοι Ἀλκμεωνιδέων Ἀλκμέωνος Ἀλκήνωρ ἡλώκοι ἕλκοντα Λύκος Λύκου ἕλκουσαν ἑλκύσαντες ἑλκυσθῇ Λάκων ἕλκων ἡλίκων ἀλλ ἄλλῃ ἄλλα ἄλλας ἐλήλαται Ἑλλάδα Ἑλλάδι Ἑλλάδος Λέλεγες ἔλλεσχα ἄλλη λέληθέ λέληθε ἄλληλα ἄλλην Ἕλληνα Ἕλληνας Ἕλληνες Ἑλληνικὰ Ἑλληνικὸν Ἑλληνικοῦ Ἑλληνικοῖσι Ἕλληνος Ἕλληνές ἄλλης Ἕλλησι Ἑλλησπόντῳ ἀλλόθροον ἀλλήλοισι ἀλλήλους ἀλλήλων ἐλλάμψεσθαι Ἑλλήνων ἄλλο ἀλλογνώσας ἄλλοι ἄλλοισι ἄλλον Ὕλλος ἄλλοτε ἀλλοτριοῦται ἄλλου ἄλλους ἄλλῃσι ἐλήλυθας Ἰλλυριῶν ἄλλων ἀλλέων ἄλλως ἐλάμβανον ἑλόμενος λίμνῃ λίμνη λίμνην λίμνης ὅλμον Ὀλύμπῳ Ὀλύμπια λάμψεαι ἑλὼν Λίνδος Ἑλένην ἐλάνθανε ἁλόντες Ἀλέξανδρον λογάδας λογάδες λογίζομαι λογιμώτατον λογισάμενος λογάσι λογίων λοιπὰ λοιπαὶ λοιπὸν λοιποῦ λοιποὺς λοιποῖσι λοιπῇσι λέοντα λοῦνται Λέοντος λέοντος Λοξίεω Λοξίης ἕλος ἁλοὺς λούσωνται Ἰλίου ὅλους ἐλπίδος ἐλίπετο ἐλπίζων λίποιεν ἔλπομαι λέπρην ἐλπίς ἐλπίσαντα ἐλπίσας ἀέλπτου Λήρισαι ἐλάσῃ ἐλᾷς λῦσαι ἁλίσας λύσας ἐλάσασαι Λέσβῳ Λέσβιοι Λέσβον Λέσβου ἁλώσεαι ἁλέσι ἱλάσκετο ἁλίσκηται λίσσεσθαι ἐλάσσω ἐλάσσων Λυγδάμι Λυδὲ Λυδίῃ Λυδίη Λυδίην Λυδικῆς Λυδῶν Λυδοῦ Λυδούς Λυδοῖσι Λυδίου Λυδὸς λυθῆναι Λυκίης Λυκούργῳ Λυκόοργε Λυκοῦργον Λυκοῦργος Λυκούργου Λυκίους Λυκίων λυμαινομένη Ὄλυμπον Ἅλυν ὄλυνθοι Ἅλυος λυπεοίατο Ἅλυς λυσιτελέειν Ἰήλυσός ἔλυτρον Ἀλυάττῃ Ἀλυάττεα Ἀλυάττεω Ἀλυάττης λόφους Λίχης ἐλόχισε ἐλάχιστον ἥλω ἑάλωκε ἡλωκέναι ἡλωκότι λέων ἥλωσαν ἅλωσιν μ ἅμ ἐμέ μὴ ἅμα μία Μαγνησίην Μαδύης Μαζάρεα Μαζάρεος Μαζάρης ἀμαθέα ἔμαθε μαθεῖν μαθήματα μαθὼν μαθόντα μαθόντες ἔμαθον μαθοῦσὰ μαθοῦσι Μαιάνδρου Μαιήτιδος Μακεδνὸν μακρῇ ἐμακάριζον μακρὸν μακροτέρην μακροτέρης μακρῇσι μακρότατον μακρότερα μακρότερον Μαλέων ὁμαίμους μίαν Μανδάνη Μανδάνην Μανδάνης μαίνεσθε μαίνεται μανέεται μανθάνειν μανθάνεις μαντείου μαντεύσομαι μαντευσόμενος μαντείων μαντηίῳ μαντηίοισι μαντηίου μαντηίων μαντήια μαντήιον ἅμαξαι ἅμαξαν μαξάμενος Μαραθῶνα Μαραθῶνος Μαριανδυνοί ἁμαρτάδα ἡμαρτηκέναι ἁμαρτὼν ἁμαρτάνει ἁμαρτόντα ἁμαρτὰς μαρτυρόμενος Μαράφιοι ἡμέας Μασαγετέων Ἄμασιν Μασσαγετέων Μασσαγέται Μασσαγέτας Μασσαγέτης μαστιγέων μασχαλιστῆρας ἤματι Ματιηνῶν Ματιηνοὺς Ματιηνοῖσι ἱματίων μαχεσαμένων μαχεσάμενοι μαχεσάμενον μαχεσάμενος ἀμαχητὶ μαχόμενοι ἄμαχόν μαχομένοισι μαχομένους μαχομένων ἄμαχος μαχέσασθαι ἰάμβῳ ἐμβαλὼν ἐμβαλόντα ἐμβαλόντι ἐμβόλιμοι ἐμβόλους ἐμβολίμου ἐμβολῆς Ὀμβρικούς ἀμβώσας ἐμβάσι μέγα μέγαθος μέγαν μέγαρον μέγας μόγις μέγιστα μέγιστόν μέγιστον μέγιστος ὁμόγλωσσοι Μάγοι Μάγος Μάγου Μάγους Μάγων Μίδεω Μίδην Μίδης Μῆδοι Μήδοισι Μῆδον Μῆδος Μήδου Μήδους μύδρον Μήδων με ἐμεῦ ἀμείβεσθαι ἀμείβεται ἀμείβετο Μεγακλέα Μεγακλέης Μεγακλέος μεγαλοπρεπείῃ Μεγαρέας μεγαίρω μεγάθεα μεγάθεϊ μεγάθεος μεγάλῳ μεγάλα μεγάλαι μεγάλας μεγάλη μεγάλην μεγάλοισι μεγάλου μεγάλους μεγάλῃσι μεγάλων μεγάλως μεγίστη μεγίστην μεδίμνου μεθύσκεσθαι μεθυσκόμενοι ἄμεινον ἀμειψάμενος ἔμελλε μελλόντων Μελάνθου μελέτω μεμηχάνηται μεμουνωμένοι μεμυρισμένοι μεμφθεὶς μεμφόμενος ἔμενον ἀμείνονος ἀμείνω Μερμνάδαι Μερμνάδας ἡμερολογέοντας ἵμερος ἡμερέων ἡμεῖς μεσαμβρίην μεσαμβρίης μεσόγαιαν μεσόγαιοι μεσοῦντι μεστή μετ μετὰ μεταβαλόντες μεταβαίνοντες μεταβολῇ μεταβουλεύσασθαι μεταγινώσκω μεταγνόντα μεταδοῦναι μεταλλαγὴν μεταλλάξας μεταξὺ μεταπεμψάμενος μεταπέμπεται μεταπέμψαιτο μεταστησάμενος μετασχεῖν μεταῦτις μετέβαλε μετέβαλον μετέβη μετάγνωσιν μετείθη μετεκινήθησαν μετεμέλησέ μετεῖναι μετεξέτεραι μετεξέτεροι μετεπέμπετο μετεπέμψατο μετεὶς μετεστεώσης ἐμετίετο μετεφόρεε μετίημί μετιεῖσι μετιέντα μετιέντες μετέμαθε μετονομασθῆναι μετοχῆς μετέπειτα ἡμετέρῳ μετρεόμενον ἡμετέρη ἡμετέρην ἡμετέρου μετρίου ἡμετέρους μετρήσας ἡμετέρων μετρίως μετέστησε μετέσχον μετέχουσι μετέωρον μευ ἀμείψασθαι ἀμείψατο ἐμεωυτόν ἐμεωυτοῦ μᾶζαν μέζονα μέζονας μέζονος μέζοσι μέζω μέζων ῥώμη μηδ μηδέ μηδαμὰ μηδαμοὺς μηδαμοῖσι μηδαμῶς Μηδείην Μηδείης μηδεμίαν μηδεμιῇ μηδενός Μηδικῇ Μηδικήν Μηδικοῦ Μηδικῆς μηδὲν μηδένα Μηδὶς Μηθυμναῖοι Μηθυμναῖον μηλέων ῥώμην μηνὶ μηνῶν μηνοειδέα μηνὸς μηνύσας μηρὸν μητρί μητέρα μητέρας μητρόθεν μητροπάτορα μητρὸς μητέρων μηχανὴ μηχανησάμενος μηχανῶνται μηχανήσασθαι ἐμηχανήσατο ἀμηχανήσεις μηχανήσομαι μηχανᾶται ἐμηχανᾶτο Μηίων μάθε μιῇ Μιλύαι ὁμιλίην Μιλησίην Μιλησίης Μιλησίοισι Μιλησίου Μιλησίους Μιλησίων ὅμιλος Μιλήσιοι Μιλήσιος Μιλήτῳ Μιλήτου Μιλυάδα Μιλυάς ἐμιμήσαντο μιν Μινύαι ἡμιόνεαι ἡμιόνου ἡμιόνους ἡμιπλινθίων ἡμιπλίνθια μιῆς μισθῷ ἐμισθοῦτο μισθώσασθαι μισθωτοὶ ἡμιτάλαντον Μιτραδάτην Μιτραδάτης μιχθῇ μιχθῆναι μήκεϊ μῆκος μάλα μέλανες μέλεα μέλει Μήλης Μίλητόν Μίλητον Μίλητος μέλι ὁμήλικας ὁμήλικες μάλιστά μάλιστα μέλιτι Μύλιττα μέλλει μᾶλλόν μέλλοι μέλλοιεν μᾶλλον μέλλοντα μέλλοντες μέλλουσι μέλλω μῆλον ὁμίλου ὄμμασι ἔμμεναι ἁμμένης μέμφεται Ἄμμωνα ἐμὴν μὲν μόνῃ μῆνα μῆνας μνέας μένειν μῆνες Μάνεω μνημονεύων μνημόσυνα μνημόσυνον μνησθῆτε ἀμύνηται μνώμενον μνώμενος μνήμην ὀμνύντες μένουσαν μένουσι ἐμνᾶτο μέντοι Μίνω μένων Μίνως ἁμάξης μῖξιν ἐμέο ἐμοὶ ὁμοεθνέων ὁμοίην μοι ὅμοια ἔμοιγε ὅμοιοί ὁμοιούμενος ὅμοιον μοιρέων ὤμοισι μοιχίδια μολύβδῳ ὁμολογίῃ ὁμολογίην ὁμολογέουσι ὁμολογήσαντος Μολοσσοὶ ὁμομήτριος μούνῃ μοῦνα μοῦναι μούνας μούνη μοῦνοί μοῦνοι μούνοισι ἡμίονον μοῦνον ἡμίονος μοῦνος μούνου μούνους μούνων μοίρῃ μοῖρα μοῖραν μοίρας μοίρης ἀμορφεστάτην ἄμορφοι ὁμούρων ὠμοὺς Μοῦσαι ὤμοσαν ὁμοσιτῆσαι μου μουναρχίη μουνόθεν μουνόκωλα ὅμουροι ὤμους ὁμοφωνέουσι ὁμοχροίην ὁμοίως ἀμπαύεσθαι ἔμπαλιν ἀμπαύονται ἀμπαυστήριοι ἐμπόδιος ἀμπελίνῳ ἄμπελον ἔμπηρα ἔμπηρος ἐμπιπλάμενοι ἐμπιπραμένου ἔμπλεοι ἐμποδὼν ἐμπόριον ἐμπήρους ἐμπέσῃ ἐμπτύουσι ἡμέρῃ μόρῳ ἡμέραι ἡμέρας Μάρδοι Μάρδος μέρεα μέρεϊ ἡμέρη ἡμέρην ἡμέρης Μύρινα μύρμηκάς μόρον μέρος ὁμήρους ἡμέρῃσι Μύρσου ἁμάρτω ἀμόρφους μέσῳ ἐμῆς ἐμέσαι ἐμίσγετό μίσγεται ἐμίσγετο μίσγονται μέση μέσην μέσης μέσον μέσου Μάσπιοι μέτα μήτε μέτες μέτεστι μήτηρ μέτρα Μίτραν μέτρον μίτρῃσι μέτωπον Μυκάλη Μυκάλης Μυλάσοισι Μυοῦς μυρία μυρίαι μυρίην Μυρσίλον μυρσίνῃ Μυσίῳ Μυσίης Μυσῶν Μυσοί Μυσοῖσι Μυτιληναῖοι Μυτιληναῖον Μυτιληναίων Μυτιλήνην ἀμφὶ ἐμφανέα ἐμφανέος ἐμφανέως ἀμφίβληστρον Ἀμφιάρεῳ Ἀμφιάρεω Ἀμφιάρεων Ἀμφίλυτος ἀμφορέας ἀμφοτέρῃ ἀμφοτέρων ἀμφὶς ἀμφότερα ἀμφότεραι ἀμφότεροι μάχῃ μάχαι ἀμήχανον μάχεσθαι μάχη μάχην μάχης μόχθον ἐμάχοντο Μέχρι μέχρι ἔμψυχον ὤμων ἡμέων μωρίη μωρίην ὅμως ὦν ἐὸν ἀνά νόῳ ἵνα νέα ναὶ ἀναβαίνοντες ἀναβαίνοντος ἀναβεβήκεε ἀναβιβάσας ἀναβῆναι ἀναβάντες ἀναβάσιος ἐναγίζουσί ἀναγκαίῃ ἀναγκαίην ἀναγκαίης ἀναγκασθῇ ἀναγκαίως ἀναγκάζεις ἠναγκάζετο ἐναγέων ἀναδιδοῖ ἀναδέονται ἀναζητεόμενα ἀναθεῖναί ἀναθημάτων ἀναθήματα ἀναθέντος ἰέναι ἀναισιμώθη ἀναισιμοῦνται ἀναισίμου ἀναιτίους ἀνακαίουσι ἀνακαύσωνται ἀνακέαται ἀνακείμενον ἀνακῶς ἀνακτήσεσθαι ἀνακτᾶσθαι ἀναλαβὼν ἀναλαβόντα ἀναλείχουσι ἀναμεμίχαται ἀναμὶξ ἀναμάξας ἀναμάρτητον ἀναμάρτητος ἀναμίσγεσθαι ἀνανεμέεται ἐναντία ἐναντίην ἐναντίους ὦναξ Ἀναξανδρίδεώ ἀναξυρίδας ἀναπαυομένου ἀναπείσας ἀναπείσει ἀναπεφυρμένα ἐναπῆκε ἀναπλῶσαι ἐναπονίζονται ἀναπτύξας ἀναπτύσσων ἀναρίθμητοι ἀναρτημένου νέας ἀνασώσωνται ἀναστενάξαντα ἀναστάτου ἀναστάτους ἀνασχετὸν ἀνασχίσας ἀνατιθέναι ἀνατέλλοντα ἀνατολάς ναυβάται ναυκλήρῳ ἐναυλίζεται ναυμαχίῃ ναυπηγέεσθαι ναυπηγίην ναυπηγίης ναυτιλίῃσι ναυτίλλονται ἐναυτίλλοντο ἀναφανῆναι ἀναφέρειν ἀναχωρησάντων ἀναχωρέοντες ἀναχωρῆσαι ἀνέβαινε ἀνέβαινον ἀνάβασις ἐνέβησε ἀνέβωσε ἀνήγαγε ἀνέῳγες ἀνάγκας ἠνάγκασε ἀνάγκη ἀνάγκην ἀνάγκης ἀνέγνωσαν ἀνέγνωσε ἀνάγνωσις ἐνδέειν ἕνδεκα ἑνδεκάτου ἐνδεξαμένου ἐνδεές Ἰνδικῶν ἐνδύντα ἐνδύντες ἔνδον ἀνδρὶ ἄνδρα ἀνδραγαθίη ἀνδραγαθίην ἠνδραπόδισαν ἀνδραποδισθέντας ἠνδραποδίσατο ἄνδρας ἀνδρεώνων ἄνδρες ἀνδρευμένῳ ἀνδρηιοτάτῳ ἀνδρηιότερον ἀνδρηίου ἀνδριάντα ἀνδριάντι ἀνδριὰς ἀνδρῶν ἀνδρὸς ἀνδράσι ἐνέδωκαν ἀνεβίβασε νεόγαμός ἐνόεε νεηνίαι νεηνίας νεηνίης νεηνιέων νεηνίῃσι ὀνειδίζω ὀνειδίσαι ἄνειμι ὄνειρον ὀνειροπόλοι ὀνειροπόλοισι ὀνειροπόλους ὄνειρος ὀνειράτων ἐνείκῃ ἐνεῖκαι ἠνείκαντο ἐνεκεκόλαπτο ἐνεκόλαψε νεκρῷ νεκρόν νεκροῦ νεκροὺς νεκρὸς ἀνεῖλέ ἀνελόμενον νεήλυδα ἔνεμε ἄνεμοι νεμομένους ἄνεμον ἐνεὸν νεῶν ἀνενεικάμενόν ἀνενειχθεὶς ἀνενειχθέντα ἀνενειχθέντων νενικηκότες νενικημένος νενόμισται νενομίκασι νενοσσευμένα νεογάμῳ νεογάμου ὠνεομένοισι ἀνεπιτήδεον ἐνεπλήσθη ἐνεπίμπρη ἐνεργαζόμεναι ἀνεῦρε ἀνεύρηται ἔνερθε ὀνείρου νέες νεὸς ὠνέεσθαι ἀνεσκολόπισε ἀνεσώσαντο ἐνεσταλμένους ἐνεστεῶτα ἐνεστεῶτος ἐνεστεώτων ἔνεστι ἀνεστήσαντο ἐνεστᾶσι ἐνετείλατο νεώτερα νεώτερον ἐνετέλλεο ἐνετέλλετο ἤνετο Ἐνετοὺς ἄνευ ὠνευμένοισι ἀνευρεθῆναι ἀνευρεῖν ἀνεφάνη ἐνεφορέετο ἐνεῖχε ἐνεχείρισε ἐνείχετο ἀνεχόμενοι νεωστὶ νηί ἀνηκούστεέ νηὸν νηνεμίης νηοῦ νηοὺς νέης νηὸς νησιῶται νησιώτας νησιώτῃσι ἀνόητος νηυσὶ νηυσιπέρητον νηυσιπέρητος ἔνθ ἔνθα ἐνθαῦτά ἐνθαῦτα ἐνθάδε ἐνθεάζων ἔνθεν ἀνέθεσαν ἐνθεῦτεν ἀνέθηκέ ἀνέθηκε ἀνάθημα ἠνθισμένοι ἀνθρώπῳ ὤνθρώπε ἀνθρώπινον ἀνθρώποισι ἀνθρώπου ἀνθρώπους ἀνθρώπων ὤνθρωπε ἀνθρωπηίην ἀνθρωπηίου ἀνθρωπηίων ἄνθρωποι ἄνθρωπον ἄνθρωπος ἀνθρωποφυέας ἔνι ἔνια ἐνιαυτόν ἐνιαυτοὶ ἐνιαχῇ ἐνιδρύσαντο ἐνιδρύσασθαι ἐνιδρυμένον νικηθέντες νικηθῇς νικᾶν νικῶντες νικᾷς νικήσαντες νικήσαντος νικήσας νικήσεις νικῶσι νικῶσάν ἀνιέναι ἄνιπποι ἀνιστὰς ἀνέκαθεν ἀνῆκε ἀνήκεστον νίκη ἐνίκησαν ἐνίκησε νύκτα νύκτας νέκυν νέκυς ἐνίκων ἀνέλῃ ἀνέλαβον ἀνόλβῳ ἀνόλβιοι ἀνόλβιος ἀνόλβου ἀνάλωτοι ἀνέμῳ νόμῳ νόμαια νέμεσθαι νέμεσις ἐνόμιζέ νόμιμα ἐνόμισαν ἐνόμισε νόμισμα νόμοι ἀνέμοισι νόμοισι νόμον νέμοντα νέμονται νόμος ἀνέμου νόμου ἀνέμους νόμους ἀνόμων νόμων νῦν ἀνήνεικαν Νίνον Νίνος Νίνου ἐννώσαντα ἐννώσας ἐνένωτο νὺξ ἀνάξια Νάξιός Νάξον νοῶ ἀνοιγομένης ἀνοικοδόμησε ἐνοικέοντα ἐνοικίσθη ἄνοιξα νομέας ὀνομασθῆναι ὀνομασθέντα ὀνομασθέντος ὀνομαστότατον νομάδες νομάδων νομίζειν νομίζεσθαι ὀνομάζομαι ὀνομάζονται νομίζοντας νομίζοντες ὀνομάζουσι νομίζουσι ὀνομάζων νομίζων ἀνομίης νομιζόμενα νομιζόμενος νομὸν νομὰς ὀνομάσαι ὀνομάσαντα ἀνομήσαντας νομίσαντες νομίσας ἐνομίσθη Νέον ὄνον νόον ὠνέοντο ἀνοίξῃ ἀνοίξας ἐνορῴη ἀνορθώσωσι ἐνορᾶν ἀνορύξας ἐνορέω νούσῳ ὄνος νέος ἀνοῖσαι νοσέειν ἀνοσιώτατε νοῦσον νούσου νοστήσαντα νοστήσαντας νοστήσαντος ἀνοήτων ἐνουρέουσι ὄνους νέους ἄνουσος νοέων ἀνέπειθε ἀνέπεισε ἀνάπεισον νήπιε ἐνύπνιὸν ἐνύπνιον ἐνέπρησαν ἀνὴρ ἐνώρα Ἐνάρεας ἀνάρσια ἑνὸς Νίσαιάν νήσας ἐνόσησε ἐνέσκηψε νήσοισι νῆσον νῆσος νήσους ἀνίστασθαι ἀνάστατα ἀνάστατοι ἀνέστη ἀνέστησαν ἀνέστρεφον ἀνέσχισε νήσων ἀντ ἀντὶ ἐόντα ἀντία ἀντίαζον ἀνταποδιδόντες ἐόντας ἐντειλάμενος ἐντειλάμενός ἀντείρετο ἐόντες ἀντεστρατοπεδεύσατο ἐντεταλμένα ἐντεταλμένον ἐντεταμένως ἤντησε ἐόντι ἀντιδοῦναι ἀντιθήσω ἥντινα Νότιον ἠντιοῦτο ἀντιουμένους ἀντιπρήσσοντα ἀντιάσας ἀντιστασιώτης ἐντέλλεται ἀντίξοον ἐντολὰς ἀντίον νότον ἐόντος ἀντίος νώτου ἀνέτρεψε ἐντός ἀντέσχον ἀντίτυπον ἀντίτυπος ἐντυγχάνοντες ἀντέχεσθαι Νίτωκρις ἐόντων νυκτὶ νυκτομαχίην νυκτὸς νυν ἐνυπνίου ἤνυσέ ἐνυφανθέντα νέφεα νήφοντες νήφουσι ἀνέχεται ἀνέχευ Ἰνάχου ἄνω ἄνωθεν ἐνωμοτίας Ἰώνων ἐνωρῶμεν ἀνωτέρω ἐξ ἐξαγαγὼν ἐξαγαγόντες ἐξαγγέλθη ἐξαιρέθησαν ἐξαιτέονται ἐξαιτέοντι ἑξακισχιλιέων ἑξακισχίλιαι ἑξακοσίους ἑξακοσίων ἐξαμαρτεῖν ἑξαμέτρῳ ἐξαναστάντες ἐξαναστήσῃς ἐξαναχωρέειν ἐξανδραποδιούμενοι ἐξανδραποδίσασθαι ἐξανεχώρεε Ξανθίων ἐξανέστη ἐξανέστησαν ἐξαπατηθεὶς ἐξαπατᾶν ἐξαπατῶσι ἑξαπάλαιστα ἑξαπόλιος ἐξαπόλωλε ἐξαπίνης ἐξαραιρημένος ἐξαίρεε ἐξήγαγε ἐξῆγε ἐξόδῳ ἐξέδοσαν ἐξεγένετο ἐξεδίδοσαν ἐξεδίδου ἐξεδόθη ἐξεδέξατο ἥξει ἥξειν ἐξεινίζετο ξεινίην ξεινίης ξεινικὰ ξεινικῶν ξεινικοὺς ξεινικός ξεινίσαντες ἐξειρύσαι ἐξεκλήισαν ἐξελαύνειν ἐξελαύνουσί ἐξελαύνουσι ἐξελασθεὶς ἐξελασάντων ἐξελαυνόμενον ἐξελεῖν ἐξελεύσεσθαι ἐξεληλαμένος ἐξελθόντες ἐξελάσαντες ἐξεμπολημένων ξείνῳ ἐξεῖναι ξεῖνε ἐξενειχθέντα ἐξενεῖκαι ξείνην ξεῖνοι ξείνοισι ξεῖνον ξεῖνος ξείνου ξείνους ξείνων ἐξεπήδησε ἐξεπιστάμενοι ἐξεπιστάμενος ἐξεπλάγη ἐξεποιήθη ἐξεργάσαντο ἐξεργάσαο ἐξεῦρε ἐξερεύγεται ἐξεύρεσιν ἐξεύρημα ἐξεύρηται ἔξεστι ἐξετετόξευτο ἐξευρεθῆναι ἐξευρεῖν ἐξευρημένους ἐξευρημάτων ἐξευρήκασι ἐξευρήκεε ἐξευρήματα ἐξευρόντα ἐξευρόντας ἐξευρῆσθαι ἐξευρέσιος ἐξεχώρησε ἐξηγητέων ἐξηγέρθη ἐξηγέωνται ἐξημεληκότα ἐξημερῶσαι ἀξίην ἐξηνδραποδίσατο ἐξηρτυμένοι ἐξέθρεψε ἄξια ἀξιαπηγητότατα ἐξιεῖ ἐξικέσθαι ἐξιέναι ἐξιόντα ἐξιόντες ἀξιοθέητα ἀξιοθέητον ἀξιούμεναι ἄξιον ἄξιος ἄξιός ἀξιόχρεον ἐξήκειν ἑξήκόντα ἑξήκοντά ἑξήκοντα ξύλα ἐξήλασε ἐξήλαυνε ἐξέλιπον ἐξέλωμεν ξύλων ἐξῆν Ξάνθιοι Ξάνθιον Ξάνθον ἥξοι ἐξορύξας ἀξίους ἐξέπεμπε ἐξέπλησε ἐξέργαστο ἐξήρτυτο ἐξίτηλα ξυστὸν ἐξέφηνέ ἐξέφυγε ἐξάψαντες ἔξω ἔξωθεν ἀξίων ἐξωνέοντο ἐξίωσι οὐ οἷά οἷα οἷαι οὐδ οὐδὲ οἶδα οὐδαμὰ οὐδαμῶν οὐδαμοὶ οὐδαμοῖσι οὐδαμῶς οἵδε οὐδεμία οὐδενὶ οὐδενὸς οὐδεὶς οὐδετέρους οὐδέν οὐδένα οὐδέτεροι οὐδέτερον οἰηκίζοντες οἵην ἀοιδὴν ἀοιδοῦ ἔοικε οὐκ οἴκῳ οἰκία οἰκίας οἴκασι οἰκέαται οἴκεε οἰκέειν οἰκεόντων οἰκεομένας οἴκεον οἰκετέων οἰκηίῳ οἰκηίης οἰκηιεῦνται οἰκηιοῦνται οἴκημα οἰκημενέων οἰκημένην οἰκημένοισι οἰκημένον οἰκημένους οἰκημένων οἰκημάτων οἰκίης οἰκησάντων οἴκηται οἴκητο οἰκήιά οἰκήια οἰκήιον οἰκιέων οἰκήματα οἰκοδόμεε οἰκοδόμησε οἰκοδόμηται οἰκοδομέῃ οἰκοδομέει οἰκοδομέειν οἰκοδομεόμενος οἰκοδομηθέντων οἰκοδομέουσί οἰκοδομῆσαι οἰκίοισι οἰκέοντας οἰκέοντες οἶκος οἴκου οἰκέουσι οἰκοφθορήθησαν οἰκός οἰκῆσαι οἰκήσαντας οἰκότα οἰκέτας οὐκέτι οἶκτος οἰκότος οὔκω οὔκων οὐλὰς οὐλῇσι οἰμήσουσι Ἰοῦν οἷόν οἴνῳ οὐνόματά οὐνόματα οὐνόματι οὐνόματος οὔνομά οὔνομα οἶνον οἶνος Οἰνούσσας οἴνου Οἰνουσσέων ῥέοντα ῥέοντες ῥέοντος Οἰνωτπίης οἷοί Οὐρανίῃ οὐρανίης οὐρανοῦ οὖροι οὖρον οὖρος οὐρῆσαι οὔρων οἷσί Ἰοῦς οὓς οἷός ἐοῦσα ἐοῦσαι ἐοῦσαν ἐούσας οἴσεσθαι οὐσίην ἰούσης οὐσίης ἐοῦσι οὔτ οὕτῳ οὔτε οὕτερος οὔτι οἵτινες οὗτοί οὗτοι οὗτος οὗτός Οὕτω οὕτω ἐουσέων οἴχεσθαι οἴχετο οἰχώκεε οἰχόμενον οἰχομένου οἴχοντο οἵων ἀπ ἐπὶ παῖ ἀπαγαγεῖν ἐπαγαγομένους ἀπαγγεῖλαι ἐπαγγείλαντι ἐπαγγείλας ἀπαγγέλλει ἀπαγγέλλειν ἀπαγινέοντας ἀπαγορεύοντα ἀπαγωγήν παῖδά παῖδα παῖδας παῖδες παῖδάς παίδων ἐπαείδει ἐπαείρας ἐπαερθεὶς ἐπαερθῇς ἐπαείροντα παύεσθέ παύεσθαι παίζειν παίζοντες ἔπαθε παθεῖν ἀπαθέες παθήματα παθών παθόντα παθόντες ἀπαθὴς Παιανιέι παιγνίας παιγνιέων παιδὶ παιδίῳ παιδεύειν παιδεύουσι παιδισκέων παιδίον παιδίου παιδὸς παιδίσκαι ἔπαιζε ἔπαινον ἀπαιρεθείησαν ἀπαιρεόμενοι ἀπαιρεόμενος ἀπαιρέεσκον ἀπαιρήσεαι παισί ἅπαις ἐπαισχύνεσθαι ἐπαισχύνεται ἀπαιτέειν ἀπαιτεόντων ἐπαιτιώμενος Πακτύῃ Πακτύεω Πακτύην Πακτύης παλαιὸν παλαιοῦ παλαιῆς παλαιστιαῖα Παλαιστίνῃ παλαιτέρου ἐπαλιλλόγησε ἐπαλιλλόγητο ἀπαλλαγὴ ἐπαλλαγὴν παλλακὴ παλλακὴν παλλακὰς ἀπαλλασσομένῃ ἀπαλλαχθέντας Παλληνίδος παλλομένους ἀπαλλάσσεσθαι ἀπαλλάσσεται ἀπαλλάσσετο ἀπαλλάσσονται ἀπαλλάσσοντο ἁπαλωτάτην ἐπαμμέναι ἀπαμύνοιεν ἅπαν ἐπαναπλέειν ἐπαναστησόμενον ἐπαναστάντες Πανδίονος ἐπανεβάλετο ἐπανειρόμενος πανηγύριος Πανθιαλαῖοι Πανιώνια Πανιώνιον πανοπλίῃ Πανόρμου πανστρατιῇ παντὶ Πανταλέοντι Πανταλέων ἅπαντας ἅπαντες παντοῖα παντοίας παντοδαπὰς παντὸς ἅπαξ ἐπαοιδήν παρ παρὰ παραβαίνειν παραβάλῃ παραγαγεῖν παραγινόμεναι παραγίνεται παραγίνονται παραγωγέων παραδίδωμι παραδεξαμένη παραδεξάμενοι παραδεξάμενος παραδιδοῖ παραδούς παραινεούσης παραινέουσι παραινέσαντος παραινέσας παραιτεόμενον παραιτεόμενος παραιτέοιτο παραιτήσασθαι παρακαλέσας παρακελευόμεθα παρακέεται παραλαβὼν παραλαβόντες παραλαβοῦσα παραλαμβανόμενα παραμειβόμενος παραμειβομένοισι παραμεινάντων παραμειψαμένους παραμείναντα παραμένειν παραμένοντα παραμίσγοντας παραίνεσε παραπλησίας παραπλησίη παραπλησίοισι παραπλησίως παραπλήσια παραπλήσιοι παραπλήσιος παρασκευαζομένου παρασκευάζεαι παραστῆναι παρασχόντων παρατείνει παρατείνουσα παρατυχὼν παραυτίκα παραφορέεται παραφέροιτο παραφρονήσει παραχέουσα παραχρήσῃ ἐπαργύρους παρέδοσαν παρέδωκα παρέδωκε παρεγύμνου παρεγίνοντο παρεδίδου παρεῖδες παρεδόθη παρεδέξατο παρειὰς παρελύθη παρελθὼν παρελθούσῃ παρεὸν παρεῖναι παρενθήκην παρεόντα παρεόντας παρεόντες παρεόντι παρεόντος παρεόντων παρεξελθεῖν παρεξελθόντων παρεοῦσαν παρεούσης παρεουσέων παρείς παρεσκεύαζε παρεσκευασμένοισι παρεσκευάζοντο παρεστεὼς παρετιθέατο παρευρίσκειν παρεῖχε παρείχετο παρεχόμενα παρεχόντων παρημελήκεε Παρητακηνοὶ παρθένοι παρθένον παρθένους παρθένων παριδὼν παριείς παριέναι παριόντα παρέλαβε παρέλαβον παράλων παρῆν παρέξει παροιχομένῃ παράπαν παρῆσαν παρήσομεν παρέσται παρίσταται παρέστησαν παρέσχε παρέσχον παρέφερον παρέχειν παρέχεται ἀπαρχήν ὑπαρχόντων παρέχονται παρέχοντες παρέχουσα παρέχων παρέχωσε παῖς παῦσαι ἅπασαν ἐπαύσαντο Πασαργάδαι παύσασθαι παύσεσθαι ἅπασι παύσονται ἔπασχον ἁπασέων πασέων Ἀπατούρια πατρὶ πατέρα πατέρας πατρίδας πατρίδος Πατρέες πατέρες πατριαὶ πατρώιόν Πατάροισι πατρίοισι πατρὸς πατέρων πατρωίων ἔπαυλιν παυομένους παυσάμενος Παφλαγόνας Παφλαγόνες Παφλαγόνων ἀπέβαλε ἐπέβαλλον ἀπέβαλον ἀπήγαγε ἐπίγαμοι ἀπήγγειλαν ἐπῆγε ἀπάγεσθαι ἀπόγονοὶ ἀπόγονον ἀπόγονος ἐπέγραψε πάγχυ πώγωνα πέδαι πέδας ἀπέδεξε ἀπόδεξις ἀπέδοντο ἀπέδοξέ ἐπίδοξα ἀπέδοξε ἐπέδραμε ἐπέδρης πέδῃσι ἐπεὶ ἔπεα ἐπεγένετο πεδίῳ ἀπεδείκνυε ἀπεδείκνυντο ἐπεδείκνυσαν ἀπεδείκνυτο ὑπεδέκετο ἀπεδήμησε ὑπεδέξαντο ἐπεδέξατο πεδίον ἄπεδος πεδίου πεζὸν πεζοῦ πείθειν πείθεσθαί πείθεσθαι ἐπεθήκατο ἀπεθώμαζέ ἀπεθώμαζε ἐπεθύμησε πείθομαι ἐπείθοντο πείθουσι ἐπειδή ἐπειδὰν ἔπειθε πειθόμενοι πειθόμενον πειθόμενος πειθομένων ἀπειληθέντα ἀπειλὴν ἀπειλήσας ἀπειλέων πεινῶντας ἄπειπε ἐπειπεῖν πειρῴατο πειρηθῆναι πειρησαμένης ἐπειρησόμενοι ἐπειρησομένους πειρώμενος ἐπειρῶντο ἄπειροι ἤπειρον ἐπειρέσθαι πειρᾶσθαι πειρήσονται ἐπειρώτα πειρᾶται ἠπειρώτας ἠπειρώτιδες ἐπειρᾶτο ἐπειρώτων πειρωμένους ἐπειρωτᾷ ἐπειρωτᾶν ἐπειρωτῶντας ἐπειρωτᾷς ἐπειρωτῶσι Πεισιστράτῳ Πεισιστράτου Πεισίστρατον Πεισίστρατος ἔπειτα ὑπεκδράμωσι ὑπεκδὺς ἐπεκηρυκεύετο ἀπεκρίθη ὑπεκρίναντο ὑπεκρίνατο ἐπεκράτεον ἐπεκράτησε ἐπεκόσμησαν πελαγίζειν ἀπελαύνοντος ἀπελαύνουσι ἐπελαύνων Πελασγικὰ Πελασγικὸν Πελασγικοῦ Πελασγῶν Πελασγοί πελάγεϊ ἐπελέγετο ὑπελείποντο ὑπελείφθησαν ἠπείλησα ἀπελθὼν ἐπελθόντες ἐπελθοῦσα ἐπελθούσης ὑπελέλειπτο Πελλήνη ἐπελήλυθας ἀπελόμενοι ἀπελὼν ἀπελοίατο Πελοπόννησον Πελοποννήσῳ Πελοποννήσου ἀπελάσαντος ἀπελάσας ἐπεμνήσθη ἐπεμνήσθην ἔπεμπε ἔπεμπον ἀπεμάχετο ἔπεμψε ἐπεὰν ἐπεῖναί ἐπενδύνει ἐπενόεε ἀπενειχθέντα ἐπενείκαντὲς πεντακισχιλίας πεντακισχιλίων πεντακόσια πενταπόλιος πενταέτεος πενταέτης πεντεκαίδεκα πεντηκοντέρῳ πεντηκοντέροισι πεντηκοντέρους πεντήκοντα ἐπεξελθόντες ἀπεξηρασμένου ἐπεξιών ἐπεξιόντες ὑπεξῆλθε ὑπεξίωσι ἔπεος πεπαίνῃ ἀπείπασθαι ἀπείπατο πεπαυμένων ἀπεπειρᾶτο πεπληγμένον ἐπεπόμφεε ἀπεπέμφθησαν πεπόνθασι πεποίηται ἐπεποίητο πεποιηκέναι πεποιημένῳ πεποιημένον ἐπεποιήκεε πεπονθέναι πεπονθὼς πεπονθότες πεπρωμένην πεπρωμένης ἐπεπτώκεσαν περ ὓπερ ἠπείρῳ περὶ ἐπεραιώθη ὑπερακρίων Περίανδρον Περίανδρος ὑπερέβαλον ὑπερβάλλοντες ὑπερβῆναι ἀπεργμένον ὑπερήδετο ὑπερεβάλοντο περίεις ὑπερεπαινέων περίεστί περίεστι ὑπερετίθετο ὑπερημίσεας ἐπείρηται ὑπερθέμενος περιβαλεῖν περιβαλλόμενος περιβαλόμενος περιβαλέσθαι περιβόλῳ περιβάλλουσι περιγεγόνασι περιγενέσθαι περιγένοιτο περιγένωνται περιῆγον περιόδου περιδέουσι περιίδῃς περιεβάλετο περιεβάλοντο περιεγένοντο περιελαύνοντες περιελαυνόμενος περιεὼν περιεῖναί περιεῖναι περιενειχθέντος περιενείκας περιεόντα περιεοῦσαι περιεῖπε περιημεκτέοντες περιημεκτέων περιημέκτεε περιθέει περιθεῖναι περιέθηκε περιιδεῖν περιιδόντες περιιζομένους περιιὼν περιιοῦσα περικατημένῳ περικείμενοι περιέλασιν περιλειφθέντα περιῆλθε περιῆλθον περιμήκεας Περιάνδρῳ περιήνεικε περιέξονται περιοικίδας περιοικεόντων περιοίκοισι περιοίκους περιοίκων περιορῶσι περιοψομένων περιπεμφθέντες περιποιήσῃς περιπίπτοντες περιπέσῃς περιρραντηρίων περιρραντήρια περιρρόου περισκεψάμενοι περιέσπε περισπεῖν περιστεράς περιστέλλοντας περιστάντες περιέσχατα περιτείνουσι περιυβρίσμεθα περιφερόμενος περιχαρής περιέχονται περιχωρέοι ἀπερύκει περίμετρον περίοδος ἀπερέοντα Πεῖρος ἠπείρου Περσεῖδαι ὑπερήσθη Περσικόν Περσικῆς Περσέων ὑπερφρονέουσαι ἄπες ἀπεὶς ἔπεσε ἕπεσθαι ἔπεσι πεσόντων ἐπεσέρχεται πεσσῶν ἐπεστεῶτες ἀπεστεώτων ἔπεστι ἀπεστράφατο ἀπεστᾶσι ἀπεσχίσθησαν ἕπεται ἐπείτε πετεινά ἐπετελέσθη ἐπετηδεύθη ὑπετίθετο ἀπετάκη ἐπετέλεον ἐπετρόπευσε ἐπετράποντο πεφευγότας πεφυκότες ἐπεῖχέ ἐπεῖχε ἐπεχείρησε ἀπείχετο ἀπεχθήσεαι ἀπεῖχον ἀπείχοντο ἀπεχρᾶτο ἀπεψημένου ἐπέζωσε πηγαὶ ἀπηγέεσθαι ἀπηγέετο ἀπηγημένου ἐπηγορέων ἀπηγήσασθαι ἀπηγήσομαι Πηδασέες ὑπηκόους πηκτίδων ἀπηλλαγμένον ἐπηπείλησε ὑπηρετέεσθαι ὑπηρετήσω ἄπηρος πηχέων ἀπέθανε ἀπέθανον πάθας πάθεα Πύθερμος ἐπύθετο ἐπέθηκαν ἐπέθηκε ἐπίθημα πάθην ἐπύθοντό ἐπύθοντο πάθος πίθους πύθωμαι ἐπιβαλλομένου ἐπιβέβηκε ἐπιβάλλειν ἐπιβάντι ἐπιβουλεύειν ἐπιβουλεύοιεν ἐπιβουλεύσας ἐπιβουλεύσειε ἐπιβουλεύων ἐπιβουλήν ἐπιβώσασθαι ἐπιγέγραπται ἐπιγινομένου ἀπιγμένοι ἀπιγμένοισι ἀπιγμένος ἐπιγραφόμενη Ἐπιδαύριοι ἐπιδέεσθαι ἐπιδέεται ἐπιδίζηται ἐπιδιαγινώσκουσι ἐπιδιείλοντο ἐπιδρομῆς πιεζόμενα ἐπιεικής ἀπιεῖσι ἐπιθαλασσίους πιθανώτατος ἐπιθείς ἄπιθι ἐπιθέμενόν ἐπιθέμενος ἐπιθέσθαι ἐπιθυμίην ἐπιθυμέοντα ἐπιθυμήσῃ ἐπιθυμῆσαι ἐπιθυμέων ἐπικαλεόμενον ἐπικαλεομένων ἐπικαλέεσθαι ἐπικαλέοιτο ἐπικαλέω ἐπικαμπαὶ ἐπικαρσίας ἐπικατακλύσαι ἐπικατασφάζει ἐπικατασφάξαι ἀπικόμενοι ἀπικόμενον ἀπικόμενος ἀπικνεομένους ἀπικνέεσθαι ἀπικνέεται ἀπικνέοιτο ἀπικνέονται ἀπικομένῳ ἀπικομένην ἀπικομένης ἀπικομένοισι ἀπικομένου ἀπικομένους ἀπικομένων ἐπικούροισί ἐπικούρους ἐπικρατῆσαι ἐπικίρναται πικροῦ πικρότητα ἀπικέσθαι ἐπιλαβόμενοι ἐπιλόγῳ ἐπιλεγόμενος ἐπιλεγομένῳ ἐπιλεξάμενον ἐπιμελὲς ἐπιμεμαθήκασι ἐπιμεμφόμενος ἐπιμηχανᾶσθαι ἐπιμιξίης ἐπιμισγόμενοι ἐπιμέλεσθαι ἐπιμέμφεσθαι ἐπιμνησθέντες ἐπιμνήσομαι Ὦπιν ἐπιὼν ἀπιέναι ἐπινοήσας ἐπιόντα ἀπιόντες ἐπιόντι ἔπιπλα ἐπιπλώσαντες ἐπιπέμποντος ἐπιπολῆς ὄπισθε ἐπισκιάζειν ἐπισήμου ἐπισάξαντες ἐπισπόμενοι ἐπισπόμενος πιστὰ ἐπιέσται ὑπισταμένῳ πιστεύοντα ἀπιστίην ἀπιστίης ἐπιστάμενόν ἐπιστάμενοι ἐπιστάμενον ἐπιστάμενος ἀπιστάναι πιστοὺς πιστοτάτῳ πιστοτάτους ἐπιστραφείς ἐπιστρεφέως ἐπιστᾶσα ἐπιστάσθω ἐπιστᾶσι πιστότατόν ἀπιστότερα ἀπιστέων ἐπισχεῖν ἐπισχὼν ἐπιτασσόμενα ἐπιτελέα ἐπιτελέειν ἐπιτελεσάντων ἐπιτελέουσι ἐπιτελέσαι ἐπιτελέσας ἐπιτείνεσκε ἐπιτεχνᾶται ἐπιτηδεοτάτας ἐπιτηδεοτάτοισι ἐπιτηδεύουσι ἐπιτηδεότατος ἐπιτηδέως ἐπιτάμωνται Πιτάνη ἐπιτραφθέντες ἐπιτρεφόμενον ἐπιτροπεῦον ἐπιτροπεύσαντα ἐπιτρέπουσι ἐπιτάρροθος ἐπιτρέψας Πιττακὸν ἐπιφανῆναί ἐπιφερόμενα ἐπιφοιτέοντος ἐπιφοιτήσειν ἐπιφορήμασι ἐπιφραζόμενος ἐπιφέροντες ἐπιφέρουσι ἐπιφράσασθαι ἐπιφέρων ἐπιχειρέειν ἐπιχειρέοι ἐπιχειρέοντα ἐπιχειρήσομεν ἐπιχείρησις ἐπιχώρια ἐπιχρύσους ἐπιχωρίην ἐπιχωρίους ἐπιχωρίων ἀπίκατο ἀπίκετο ἀπίκευ ἐπίκλησιν ἐπίκοινα ἀπίκοιτο ἀπίκοντο ὑπόκρισιν ὑπόκρισις ἀπῖκται ἀπέκτεινα ἀπέκτεινε ἀπόκτεινον ὑπέκυψαν ἀπίκωνται ὅπλα ὑπόλαβε πέλαγος πάλαι Πλακίην Πλακιηνοί ὑπέλαμπε πέλας ἐπήλασαν ἀπήλασε πλαστοῦ ἀπήλαυνε ἐπέλεγε πλέειν πόλεμον πόλεμος πλεῦνας πλεῦνες πλεῦνος πλεόνων ἔπλεον ἀπώλεσας πλεῖστα πλείστην πλεῖστοι πλεῖστον πλεῖστος πλείστους ἄπλετον ἄπλετος πλέη πληγέντι πληρώσαντες πληρωθέντες ἀπόλησθε πλησίον ἄπληστε ἄπληστον ἄπληστός ἐπῆλθέ ἀπῆλθε πλήθεϊ πλήθεος πλῆθος πλέθρα πόλι πόλιας πόλιες πόλιν πόλιος πόλις ὥπλισε πόλισι πόλισμα πλῆκτρον πλήκτρων πόλλ ἀπήλλαξε ἀπόλλυσθαι Ἀπόλλωνα Ἀπόλλωνι Ἀπόλλωνος πλὴν πλάνης ἐπλίνθευον πλίνθοισι πλίνθου πλίνθους πλίνθων πλοίῳ πλοῖα πλόοι ὑπόλοιποι ὅπλοισι ἀπόλοιτο πλέον πλέοντες πλοῖον πλοίου πλούσιος πλούτῳ πλόου πλέους πλουσίου πλουτέειν πλοίων πλῆρες πλήρης ἐπλήρουν πλῶσαι πλήσαντες πλήσασα πύλῃσι πλάτος ἐπήλυδα ἐπήλυδες πλέω πλόων ἀπόλωνται πῆμ πῆμα πήματι ἐπίμαχον ἑπόμενα πέμματα ἐπόμνυμί ἀπήμονα πέμπει πέμπειν ἐπίμπλατο ἐπέμποντο πέμπουσα πέμπτῃ πέμπτον πέμπτου πέμπων Πάμφυλοι πέμψαντά πέμψαντα πέμψαντας πέμψαντες πέμψας πέμψασα πέμψω ὑπῆν ὕπνῳ πᾶν ἐπάναγκες Πίνδῳ πίνει πίνειν πνείουσι πένητες ἀπόνητο πένθεϊ πένθεος πόνοι ὕπνον πόνον πόντῳ πάντα πάντας πέντε ἀπέντες πάντες πόντον πόντου ἁπάντων πάντων πάντως ἐπάνω ὑπνωμένῳ ἀπίξι ἀποβαλέεις ἀποβαίνειν ἀποβεβήκοι ἀποβάντα ὑποβολιμαῖα ὑποβρύχιον ἀποβήσεται ἀπογόνῳ ποδαβρέ ἀποδέδεκται ἀποδεδεγμένος ὑποδεεστέρου ἀποδεικνύναι ἀποδεικνύντι ἀποδείκνῦσι ἀποδεξάμενοι ὑποδεξάμενος ὑποδέεσθαι ὑποδεέστερος ἀποδεχθεὶς ἀποδεχθέντα ἀποδεχθέω ποδηνεκέι ἀποδιδοῖ ὑποδήματα ἀποδόμενοι ποδῶν ὑποδύνειν ὑποδύντες ἀποδόντων ἀποδέξῃ ἀποδέξαι ὑποδέξας ἀποδέξασθαι ἀποδοκιμᾷ ἀποδοῦναι ἀποδούς ἀποδάσμιοι ἐποίεέ ἐποίεε ποίεε ὑποζύγια ποίημα ποίην ἐποίησα ἐποίησαν ἐποίησας ἐποίησε ποίησον ἀποθανεῖν ἀποθανόντος ὑποθεμένου ὑποθήκῃ ὑποθήκας ὑποθήκῃσι ἀποθάνῃ ἀποθνήσκειν ἀποθορόντες ἀποθωμάζοντα ἀποθωμάσας ὑποθωπεύσας ποιέῃ ποιέει ποιέειν ποιέεις ποιεόμενα ποιεύμενοι ποιεόμενον ποιεύμενος ἐποιεύμην ποιεῦνται ποιεῦντας ποιεῦντες ποιεῦντι ἐποιεῦντο ποιεῦσα ποιέεσθαι ποιεῦσι ποιέεσκον ποιέεται ἐποιέετο ποιευμένοισι ποιευμένους ποιηθέν ποιησαμένη ποιησάμενοι ποιησάμενος ποιησάντων ποιητέον ἀποικίην ποικίλῃ ἄποικοι ἀποικίσαι ἀποικτίζετο ἕποιο ποιέοντας ποιέοντες ποιέοντος ποιέουσαι ποιέουσι ποιήσῃ ποιῆσαι ποιήσαιμι ποιήσαντά ποιήσαντα ποιήσαντας ποιήσαντες ἐποιήσαντο ποιήσαντος ποιήσας ποιήσασθαι ποιήσασι ἐποιήσατο ποιήσειαν ποιήσειε ποιήσειν ποιήσεις ποιήσομαι ποιήσω ποιήσωνται ποιέω ποιέωμεν ποιέων ἀποκαλύπτειν ἀποκαλύπτων ἀποκληισθῇ ἀποκληίσαντες ἀποκληίσας ἀποκρεμάσας ὑποκρητηρίδιον ὑποκρινέεσθαι ὑποκρίνασθαι ἀποκρίνοντες ὑποκρίσιας ἀποκτεῖναι ἀποκτείνας ἀποκτείνῃς ἀποκτενέων ἀποκωλύσουσιν πολὺ ἀπολαβὼν ὑπολαβόντα ὑπολαβοῦσα ἀπολαμπρυνέαι ἀπολέει ὑπολειπομένῳ ὑπολειφθέντας ὑπολειφθέντες πολεμιστηρίων πολεμιώτατον πολεμίους πολεμίων ἀπολείπουσα ἀπολέεσθαί ἀπολέεσθαι πολύευκτον πολιητέων πολιορκεόμενοι πολιορκεομένῳ πολιορκεομένου πολιορκέεσθαι ἐπολιορκέετο πολιορκίη πολιορκηθέντα πολιορκίην πολιορκίης ἐπολιορκέοντο πολιούχου ὑπολιπομένους ἐπολιόρκεε πολιήτας πολιήτεω πολιήτῃσι πολλὰ πολλαί πολλαχῇ πολλάκις πολλὸν ἀπολλύναι πολλοῦ πολλοὺς πολλοῖσι πολλάς πολέμῳ ἐπολέμεε ἐπολέμησαν ἐπολέμησε πολέμια πολέμιόν πολέμιον πολέμους ἀπολέσαι ἀπολέσθαι πολίσματα πολυπλάνητον πολυχρόνιος πολυψήφιδα ἀπολωλεκὼς ἀπολωλέναι πολίων ποίμνας πομπῇ πομπῶν πομποὺς πίονα ὑπονενοστηκότος ἀπονοστέειν ὑπονοστήσαντος ἀπονοστήσας ἀπονοστήσειν ἕπονται ἀποξηρανθῆναι ἀποπλέειν ἀποπλέοντας ἀποπέμπει ἀποπέμπεται ἀποπέμπω ὑποπάσας ἐπορᾷ πορεύεο πορεύεσθαι πορευόμενα πορευόμενοι πορευόμενος ἀπορίην ἐπορθέετο πορθμέας πορθμέων ἐπορᾶν πορνεύονται ἀπορέοντι ἀπορέοντος ἀπορρέῃ ἀπορράψας ἀπορήσαντα ἐπορῶσι ἀπορίῃσι πορφύρεα πορφύρεόν ἔπος Ποσειδέωνι Ποσειδωνιήτεω ἀποσιωσαμένη ἀποσκήψαντος ἀποσπασθεὶς ποσσίκροτον ἀποστείλας ἀποστάντες ἀποστέωσι ἀποσχισθὲν ποτὶ ποταμῷ ἀποταμόμενοι ποταμόν ἀποταμνομένῃ ποταμοῦ ποταμοὺς ποταμός ὑποτελέοντες ὑποτίθεσθαι ἀποτίλας ἀποτάμνει ἐποτρύνοντα ἀποτράπει ἀποτρέψειν ὑπουργημάτων ἀποφαινέτω ἀποφαίνεσθαι ἀποφαίνοντες ἀποφαίνων ἀποφλαυρίσειε ἀποφέρειν ἀποφέρεται ἀποφυγεῖν ὑποχειρίους ὑποχείρια ἀποχρεωμένων ὑποχωρῆσαι ἄποψιν ἔποψις ἐποψομένους ἱππέας ἐπέπαυντο ἀπέπαυσε ἱππάδα ὀπώπεε ἱππεύεσθαι ἀπέπεμπε ἀπόπεμψαι ἀπέπεμψε ἀπόπεμψον ἱππευομένους Ἱππίεω ἱππικόν ἐπίπλεαι ἀπέπλεον ἀπόπληκτα ἐπίπλοα ἵπποι ἵπποισι Ἱπποκράτεα Ἱπποκράτεϊ Ἱπποκράτεος Ἱππολόχου ἵππον πέπονθα ἵππος ἵππου ἵππους ἱππόται ἵππων ἱππέων ὑπὲρ πέρ πρὸ ἐπώρα πάρα πρόβατα πύργῳ ἀπέργει πρῆγμά πρῆγμα πρήγματα πρήγματι πρήγματος πρήγμάτα πύργος πύργους πύργων ὑπώρεαί πάρειμι πρόειπε πάρεξ πρεσβύτας πρεσβύτατοι πρεσβύτατον πρεσβύτατος πρεσβύτερον πρηγμάτων πρηθείη πρηθῆναι πέρην ἔπρηξα πρησσόμενα ἔπρησσον πρηχθέντων ἐπόρθεε πρόθες ὑπέρθυρα πέρι πριαμένους Πριηνέα Πριηνέας Πριηνέος πριάμενον Πριάμου Πριήνη πέριξ Πάριος πάρισθί πρόκατε πρόκειται ἐπήρκεσε πρόμαντις πρύμνην πρύμνης πρὶν ὑπάρξαντα προαγορεύουσι προαγορεύω προαιδέοντό προέβαινε προβαλλόμενος προβαλλομένων προβαίνοντες προβοσκῶν προβουλεύσωνται προβήσομαι προβάτοισι προβάτοῖσι προβάτων προγόνων προδεικνύουσι προδέξαντες προδρόμους προεῖδε προεδρίην προειδὼς προειπεῖν προειρημένον προελθεῖν προελθὼν προεῖναι προεῖπε προεπύθοντο προερέοντας προερέοντες προεσήμαινε προεσάξαντο προεστεῶτος προεστάναι προετίθεε προετίμησα προετρέψατο προεφράζομεν προεφυλάξατο προεῖχε προεχώρεε προηγόρευε προηγόρευσε προθεῖναι προθέμενος προθύμως προθυμέαι προθυμεόμενοι προθυμεομένου προθυμίην προθυμοτάτοισι προθυμότερον προϊέναι προϊέντα ὑπέροισι προισχόμενος προϊσχομένων προκατίζων προκειμένῃ προκειμένην προκειμένου προκεκριμένα προκείμενον προκοπτομένων προκρίνας προλέγουσαι προμαντηίην προμαχεῶνα προμαχεῶνας προμαχεῶνες προμαχεῶσι προμηθίῃ Προνηίης προνηίου προνοίης προοπτέον προέπεμπε προπεπυσμένος προπέμπων προπέμψαντες προποιήσαντος προρρίζους προσαγορεύειν προσαπολλύεις προσβαίνων προσβάλῃ προσβάντων προσάγει προσδεόμεθά προσδόκα προσδέκεσθαί προσδόκιμον ἀπροσδοκήτου προσεδέξατο προσελθόντας προσίεμαι προσίενται προσεπασσάλευσε προσεπικτωμένου προσεποιήσατο προσίετό προσετετάχατο προσεῖχε προσεύχετό προσεύχοντό προσθέοιτο προσθέσθαι προσθήσομαι προσθέω προσιδὼν προσήιε προσιὼν προσιόντες προσκαλέομαι προσκέαται προσέκειτο προσκέεται προσκεχωρηκότων προσκεχωρήκασι προσήκοντές προσήκουσαν προσκτήσαιτο προσκτήσασθαι προσκυνέει προσκυνήσας προσμένουσι προσοίκων προήσουσι προσπεσοῦσαν προσώπου προσπίπτων προσέπταιον προσπταίσας προσέρρεον προσέρχονται προσστῆναι προσστάντες προσστὰς προσσχόντας προσέταξε προσταχθὲν προάστειον προστησαμένους προσέτι προστιθεῖσι προστὰς προστάσσειν προστάσσων προστάτεω προσφιλέες προσφιλεστάτῳ προσφορήσας προσφέρεσθαι προσφυέως προΐσχοντο προσωτέρω προτείνῃ προτείνων προτεραίῃ προτίθεσθαι προτίθημι προτιθέαται προτιθεῖ Προτοθύεω προτέρη προτέρην προτέρους προέφαινε προφέρειν προέχει προέχοντας πρῴρην ἀπέρριπται ἀπέρριψε Πέρσῃ πρὸς Πέρσαι Πέρσας Πέρσεω Πέρσεων Πέρσην Πέρσης πρόσθε Πέρῃσι πρήσι ἀπρόσμικτοι πρόσοδον Πέρσῃσι πρήσσοντα πρήσσοντας πρόσω πρώτῳ πρῶτα πρότερόν πρότεροι πρότερον πρότερος πρώτη πρώτην πρῶτοι πρώτοισί πρώτοισι πρῶτον πρῶτος πρώτου πρώτους πρῶτός πρώτων πρυτανηίου πρόφασιν ὑπῆρχε ὑπάρχει ἐπρήχθη ἀπέρχονται πρόχυσιν πάσῃ πᾶς πᾶσα πᾶσαι ἐπῆσαν πᾶσαν ἐπάσαντο πάσας ἐπίσημα ἁπάσης πάσης ἀπώσηται πᾶσι πᾶσιν ἀπέσπα ἐπίσποιτο ἐπέσσετο πάσῃσι ἐπίστασθαι ἀπίστασθε ἠπίστατο ἀπέστειλαν ἀπέστελλε ἐπέστη ἀπέστησαν ἀπέστησε ἐπίστιόν ἐπίστιον ἐπίστιός ἀπόστολος ὑπέστρωται πίσυνοι πίσυνος ὑπέσχετο ἐπέσχον ὀπίσω ἑπτὰ ἑπτακαίδεκα ἐπέταξε ἐπίταξον ἑπταπήχεϊ πτύειν ἐπίτεκα ἐπίτεξ Πτερίῃ πάτερ Πτερίη Πτερίην Πτερίων ἀπάτην ἀπάτης ὤπτησαν ὤπτησε ἀπότομον ἀπότομός ὀπτοὺς ἐπέτρεψας ἐπέτρεψε πέτρης ἐπίτροπον πτέρυγας ὀπτήσας ὀπτῇσι ἐπέτυχον ὀπτέων Πυθὼ Πυθίη Πυθίην Πυθίης πυθόμενοι πυθόμενον πυθόμενος πυθομένη πυθέσθαι πυλίδας πυλίδες πυλίδων Πυλίους πυλέων πυνθανόμενοι πυνθανόμενον πυνθανόμενος πυνθανομένων ἐπυνθάνετο πυνθάνοιτο πυνθάνομαι ἐπυνθάνοντο πυρὶ πυργοῦτε πυρὴν πυρὸς ἀπέφαινε ἀπέφθου πήχεος ἀπέχουσα ἀπέχρα πῆχυς ὑπῆψαν πωλέειν πωλέεσκε ἐπωλέοντο πωλέων ἐπὲων ἐπωνυμίην ἀπωσθέντες ἀπωσάμενοι ἀπωστοὶ Ἥρῃ ὥρα ἠέρα ἱρέα ὡραῖαι Ἀραβίων ὡραίην ὧραι Ἥραιον ἀραιρημένα Ἡρακλεῖδαι Ἡρακλείδας Ἡρακλείδεω Ἡρακλείδῃσι Ἡρακλειδέων Ἡρακλέος ὡραίους ἀραίρητο ἐρασθεὶς Ἀράβιοι ἔργῳ ἔργα ἐργαζόμενοι ἐργαζομένου ἐργαζομένων Ἀργανθώνιος ἐργασίην ἐργασάμενον ἔργαστο Ἀργεῖαι ἐόργεε Ἀργείης Ἄργει Ἀργεῖοι Ἀργείοισι Ἀργείους Ἀργείων ἐργάζεσθαι ἐργάζεται ἐργάζετο ἐργάζοντο ῾Ρήγιον ὀρύγματος ἀργμένης ὀργὴν Ἀργολίδος ἔργον Ἄργος ἔργου ἀργύρῳ ἀργύρεα ἀργύρεον ἀργύρεος ἀργύριον ἀργύρου ὀργῆς ἀργυρέοισι ἄργυρος ἀργυρίου ἀργυρέους ἔργων ἔρδῃ ἔρδειν ἄρδις ἀρδόμενον ἀρδόμενος ῾Ρόδον Ἀρδέρικκα Ἄρδυος ὄρεα ἱρείη ὀρεινή ὄρεος ἱρέες ὄρεσι ἀρεσκόμενος ἀρεστὸν ἀρετὴν Ἐρετρίης ἀρετῆς ἐρεῖψαι ὥρη ἔρημον ἐρημότατον ἐρημωθεῖσαν ὤρην Ἀρύηνιν ὥρης ἔρηται ὄρθιον ὀρθὸν ὄρθρου ὀρθῶς ὀρθωθῇ ἀρήια ἔριδος Ἀριζαντοὶ ἀριθμὸν ἱρήιον ἔρις ἄριστα Ἀριστόδικον Ἀριστόδικος ἀριστερά ἀριστεροῖσι ἀριστερῆς ἀριστῶν ἄριστοι Ἀριστολαΐδεω ἄριστον Ἀρκαδίῃ Ἀρκαδίην Ἀρκαδίης Ἀρκάδες Ἀρκάδων ὅρκια ὅρκιον ὁρκίοισι ὅρκους ἄρκτον ἀρκέων ὁρμή ἅρμα ὁρμέατο ἀρώμενοι Ἀρμενίοισι Ἀρμενίου Ἀρμενίους Ἀρμενίων ὁρμηθέντες ὁρμηθέωσι ὁρμημένου ἑρμηνέας ἑρμηνέων ὁρμώμενοι ὁρμώμενον ὁρμώμενος Ἕρμον ὁρμῆσαι ὁρμᾶσθαι ὁρμωμένου ἱρόν ἄρνα ἀρνείοισι ἀρνέεσθαι ὀρνίθων ὄρνιθος ὁρῶντες ἄρξαι ἦρξαν ἄρξαντα ἄρξαντες ἤρξαντο ἄρξας ἄρξασα ὀρύξασα ὠρύξατο ἦρξε Ἀράξεα ἄρξεις Ἀράξεω Ἀράξης ἀρξάμενοι ἀρξάμενον ἀρξάσης ἱροῦ Ἡροδότου Ὑροιάδης Ἀρίονα Ἀρίονος ὁρέοντες ἀρούρας ὄρος ἀροτῆρες ἁρπαγῇ Ἅρπαγε ἁρπαγήν Ἅρπαγον Ἅρπαγος ἁρπαγῆς ἁρπαζομενέων ἥρπαζον ἁρπασθεισέων ἁρπασθῆναι Ἁρπάγῳ Ἁρπάγου ῾Ρύπες ἑρπετὰ ἁρπάζειν ἡρπάζοντο ἁρπάσαι ἁρπάσαντος ἐρρίζωσε ἔρρηξε ἐρριζωμένην ἔρριπται ὀρώρυκτο ἀρρωδέων ἱρὸς ὁρῶσα Ἀρίσβαν ἔρσενας ἔρσενες ἔρσενος ὁρᾶσθαι ἠράσθη ὁρῶσι ἀρέσκει Ἀρσάμεος ἐρσένων ὀρύσσειν ὀρύσσετε ὀρύσσοντες ὀρύσσουσα ὀρύσσων Ὀρέστεα Ὀρέστεω ἀρίστη Ὀρέστης ἀρίστου ἀρίστους Ἀρίστωνος ὁρταὶ Ἀρταβάζου ἀρτέαται ἀρτάβη Ἀρτεμβάρεα Ἀρτεμβάρεος Ἀρτεμβάρης ἄρτισις Ἀρτέμβαρες Ἀρτέμιδι ὁρτήν ἀρτοκόπου ἄρτου Ἐρέτριαν ὁρτῆς ἤρτυσαν ὄρυγμα Ἐρυθρὴ Ἐρυθραί Ἐρυθραῖοι Ἐρυθραίους Ἐρυθρὴν Ἐρυθρῆς ὤρυσσε ὀρυσσόμενον ὤρυσσον ὀρυχθὲν ἀρχῇ ἀρχαῖα ἀρχαῖαι ἀρχαίην ἀρχαιότατον ἀρχαῖον ἀρχαίου ἀρχαίων ἦρχε ἄρχει ἄρχειν ἄρχεις ὀρχεόμενοι ἄρχεσθαι ἔρχεται ὄρχησίν ἀρχῆθεν Ἀρχίλοχος ἀρχόμενος ἀρχὴν ἀρχόντων ἔρχομαι ἄρχομεν Ὀρχομένιοί ἀρχομένους ἦρχον ἄρχοντας ἄρχοντι ἀρχῆς ὀρχήσασθαι ἀρχέων ὁρέω ἥρων ἐρέων ἥρως σ ὅσῳ Ἀσίῃ σὲ ὡς ὑὸς ἴσα ἐσαγαγὼν σαγάρις Σαγάρτιοι Σαδυάττεω Σαδυάττης ὅσαι σόαι Σαμίην Σαμίου Σαμίων ἦσαν σανδαράκινοι ἐσαπικνέεσθαι Σαρδὼ Σαρδιηνοῦ Σαρδιηνὸς Σαρδόνιον Σαρδίων σαρξὶ Σαρπηδὼν Σαρπηδόνα Σαρπηδόνος ἐάσας ῥύσασθαι Σασπείρων σατραπηίην ὡσαύτως σαφηνέως σαφέως ἐσέβαλε ἐσέβαλλε ἐσβαλομένους ἐσέβαλον σβεννύναι σβεννύντα ἐσβιβάσαντες ἐσβάλλει ἐσβάλλοι ἐσβάλλουσι ἐσβάλλων ἐσβάντες ἐσβολαὶ σέβονται ἐσβὰς ἐσάγεσκον σίγμα σίδηρον σίδηρος ἐσδέκεσθαι ἐσδύνων ἐσδέξασθαι ἐσόδου σε σεῦ ἀσεβήσαντες σεληναίης ἐσελθεῖν ἐσελθὼν ἐσελθόντα ἐσελθοῦσαν σελήνῃ σεμνοῦν Σεμίραμις ἔσεσθαι ἐσεσόφιστο ῥύσεται σευ σεωυτοῦ ὅση Ἀσίη ἐσηκόντιζον ἄσημα σημαίνει σημαίνειν σημανέω σημήια σημήνῃ σημήνας ἄσην Ἀσίην ἴσης Ἀσίης σησάμου σησάμων ἡσθείη ἐσθεμένους ἀσθενέα ἀσθενέος ἀσθενές ἀσθενέστατον ἀσθενέστερον ἡσθεὶς ἥσθη ἐσέθηκε ἥσθησάν ἐσθέμενοι Ἰσθμὸν ἰσθμός ἡσθῆναι ἐσθέντες ἐσθίοντας ἐσθῆτά ἐσθῆτα ἐσθῆτι σιγῇ σιγὴν σιδηρέῃ σιδηρέη σιδηρέης σιδήρῳ σιδήρεον σιδήρου ἐσήιε Σικελίην Σικυῶνος ῥῆσιν ἐσιέναι σιναμωρέειν σινδόνος Σινώπην ἐσιόντι ἀσινέων ἐσήισαν σιτία σιτεομένους σιτέεσθαι σιτοδείην σιτίοισι σιτέονται σιτοφόροι σῦκα Σάκαι σκαιότατόν σκαιότατον ἔσκε ἤσκεε σκευῇ ἐσκευασμένος σκευάζειν σκευὴν σκευοφόροι σκευάσαντας σκευάσαντες σκευάσας σκεψάμενον Σκύθαι Σκύθας Σκύθῃσι ὁσάκις Ἀσκάλωνι ἀσκὸν σκολιὸν σκολιοὶ ἔσκον σκοπέειν σκοπέων σάκος ἐσήκουον ἐσήκουσε σκέπῃ σκήπτρῳ σκῆπτρον σκύτινα Σκυθικῇ Σκυθικὴν Σκυθέων σκυλεύσαντα σκυλεύσας Σκυλάκην σκυτίνας σκυτίνην σκυτίνοισι σκῆψιν ἐσύλησαν ἐσῆλθον Σόλυμοι Σόλων Σόλωνα Σόλωνος Σάμῳ ὀσμῇ σῶμα ἐσήμαινε ἐσήμαινον σώμασι σώματος σήματός ἐσόμεθα ἄσμενοὶ ἄσμενοι Σύμην ἐσήμηνέ Ἰσμηνίῳ Ἰσμηνίου σμικρὰ σμικροῦ Σάμιοι σύμμαχον σύμμαχος ἐσέμνυνε Σάμον Σμύρνη Σμύρνην σμύρνην Σμυρναῖοι Σμυρναίους Σμυρναίων σὺν Σάνδανις σίνεσθαι σύνοικοι σύντομα σύντροφοί σέο σοὶ σοι ὅσοι ἐσομένην ὅσον ἔσονται ἰσοπαλέων σορῷ ὅσος Σοῦσα σοφίῃ σοφίην σοφίης σοφισταί σοφός σοφώτατος σοφωτάτῳ σοφωτάτην Σπακώ σπανίζων σπανίσῃ σπανίσας Σπαργαπίσης ἀσπαῖρόν Σπαρτιητέων Σπαρτιῆται Σπαρτιήτῃσι ἀσπαστότερον ἀσπίδας ἀσπίδος σπεύδεις σπεύδων ὥσπερ σπείρειν σπείρουσι σπερχθεὶς σπεύσαντες ἐσπεσόντες ἔσπευσα ἔσπευσαν ἀσπάζοντο σπάκα ἐσπέμπεσκον σπονδῇ σπονδὰς σπουδῇ σπουδαιέστατα σπουδαιέστερα σπουδήν ἑσπέρην Σπάρτῃ Σπάρτην ἀσπὶς ἀσπίσι Σάρδιες Σάρδις Σάρδιές Σάρδισι Σύριοι ἔσσῃ σῶς ἅσσα ὅσσαι Ὄσσαν Ἰσσηδόνων Ἀσσησῷ Ἀσσησίης ἑσσώθη σῶσι ἧσσον ἑσσοῦντο ἑσσουμένους Σάσπειρες Ἀσσύρια Ἀσσύριοι σῶστρα Ἀσσυρίῃ Ἀσσυρίη Ἀσσυρίης Ἀσσυρίοισι Ἀσσυρίους Ἀσσυρίων ἑσσωθεὶς ἑσσωθέντας ἑσσωθέντες ἐστί ὀστέα σταδίου σταδίους σταδίων σταθμὸν σταθμοί ἔσται ἱστίαι ἐστασίασαν στασιαζόντων στασιάσασα στασιῶται στασιώτας στασιώτῃσι Ὕστασπες ἵστατο ὕστατος στατῆρσι στέγαρχος στάδια στάδιοι ὥστε ἄστεα στεγαστρίδας ἄστεϊ στεινότερον στελλόμενοι στελλομένων ἄστεος ὑστεραίῃ ὑστεραίην στερεὴν στερεὸς ἐστερημένος ὕστερον ἑστεῶτι ἑστεώτων ἐστεφανωμένος στείχῃ στηλέων ἔστησε στησάμενοι ἔστι Ἱστιαιώτιδος Ἱστιαιῶτιν ὅστις ἱστιέων στόλῳ ἐστέλλοντο στόλον στόλου στόμασι στόμια στέμμασι ἀστῶν ἑστάναι στάντα σίτοισι στολὴν στομάτων ἱστορεύσῃ ἱστορέεσθαι ἱστορίης Ἱστοριῶν ἱστορέων σῖτος σίτου ὑστέρῳ ἀστραγάλων στρατῷ στρατεύειν στρατεύεσθαι στρατεύεται ἐστρατεύετο στρατεύηται στρατεύματος στρατεύονται ἐστρατεύοντο ἐστρατεύσαντο στρατεύσασθαι ἐστρατεύσατο στρατευσάμενοι στρατευσάμενον στρατευσάμενος στρατηγίῃ στρατηγέειν στρατηγίης στρατηγὸν στρατηγέοντα στρατηγὸς στρατηίην στρατηλατέειν στρατηλάτεε στρατιῇ στρατιὴν στρατιῆς στρατὸν στρατοῦ στρατοπέδῳ στρατοπέδου στρατοπέδων ἐστρατοπεδεύετο στρατοπεδευομένοισι στρατόπεδα στρατόπεδον στρατός ἱστόρεόν ὑστέρης ὑστέρησαν στέρνα στρογγύλῃσι Ἴστρου στρουθοὺς Στρούχατες στράτευμα στράτευσιν Στρυμόνος ἐστρωμένη ἀστὸς στὰς στᾶσα ἐστήσαντο στάσας ἑστᾶσι στάσι στάσιν στήσονται Ὑστάσπεα Ὑστάσπεϊ Ὑστάσπεος Ὑστάσπης στήσω στήσωμεν ἄστυ Ἀστυάγεά Ἀστυάγεα Ἀστυάγεϊ Ἀστυάγεος ἀστυγείτονας Ἀστυάγης στέφανον ἔστωσαν συγγενής συγγινωσκόμενος συγγίνεσθαι συγγνώμη συγγνώμην συγγνόντες συγγραμμάτων συγγραφὴν συγγραψαμένους συγγραψάμενοι συγκαταγηράσκειν συγκατακληίεται συγκατεργασάμενος συγκομίσας συγκυρήσαντα συκέην συκέων συλλαβεῖν συλλαβὼν συλλαμβανόμενος συλλέγεσθαι συλλέγουσαι συλλεγόμενοι συλλεγομένων συλλέξας συλλέξασα συλλοχιτέων συλήσασι συμβαλλόμενος συμβαλόμενος συμβαλὼν συμβαλόντες συμβαίνειν συμβαίνωσι συμβιβάσαντες συμβολῇ συμβολῆς συμβουλεύουσι συμβουλεύσαντός συμβουλεύσατέ συμβουλευόμενος συμβουλῆς συμβάσιες συμμαχίας συμμαχέει συμμαχίη συμμαχίην συμμαχίης συμμισγόντων συμμένειν συμμίσγεται συμμίσγουσα συμμίσγων συμμάχους συμμάχων συμπαίζων συμπεσόντας συμπεσόντες συμπέμψαι συμπέμψαιμι συμπέμψας συμπέμψειν συμπέμψω συμπολιορκήσαντας συμπέπτωκε συμφεροίατο συμφορή συμφορήν συμφορῆς συμφέρονται συμψήσας συναγάγοιεν συναγεῖραι συναγείρας συναλίσας συναμφοτέρους συναπάντων συναρμοσμένων συνέβαλε συνέβαλλον συνέβαλόν συνέβαλον συνέβησαν συνέγνω συνάγοντες συνδιήνεικαν συνόδοισι συνδούλῃ συνδραμεῖν συνέδραμον συνεβάλλετο συνεβούλευε συνεβούλευόν συνεβούλευσε συνεθήκατο συνεκδύεται συνεκάλεσε συνεκπλῶσαι συνελέγοντο συνελθόντες συνελθόντων συνελέχθησαν συνεξελεῖν συνεξέπιπτον συνεπαναστάντες συνεπελάφρυνον συνεπεπτώκεε συνεστεώσης συνεστάναι συνετωτέρη συνεχέως συνηλίζοντο συνίημι συνηνείχθη συνηρεφής συνθέμενοι συνιεῖσα συνιόντες συνιόντων συνήισαν συνέλαβε συνέλθοιεν συνέλθωσι συνήλισαν συνάλισε συνέμισγον συνήνεικε Συέννεσίς συνένησε συννοίῃ συννήσας συνέντα συνοικέειν συνοικεούσης συνοικήσῃ συνοικήσειν συνοικήσι συνοικήσωσι συνοίκεε συνοίκεον συνομόσαντες συνάπαντες συνέστασαν συνέστρεψε συνταράξας συντεταραγμένος συντυγχάνοντες συντυχίῃ συντυχὸν συνέχεσθαι συνέχωσα συνάψας συνωνέονται Συρίῃ συρίγγων Συρίης Συρίους συρρηγνῦσι Συρίων συσπεύδων συσσίτια συστήσας ἡσυχίη ἡσυχίην ἡσυχίης συχνὰ συχνῶν συχνοῦ συχνάς ἥσυχος ἡσυχίου σφέα ἀσφαλέος ἀσφαλέστατα ἄσφαλτος ἀσφαλέως σφαίρης σφέας σφεα σφεας ἐσφερομένας σφετέρῃ σφετέρης σφετέρους σφι σφισι σφάλμα ἀσφάλτῳ ἀσφάλτου σφάξας ὀσφραινόμενος ὀσφραινομένους σφῦραν σφρηγῖδα ὤσφροντο σφίσι σφέτερον σφέων ἔσχατα ἔσχατον ἔσχε σχεδόν ἐσέχει σχῆμα σχὼν σχοινίον σχοινοτενέας σχοινοτενέες ἔσχον σχοίνῳ ἔσχοντο ἴσχουσι ἐσχίσθη ἰσχυρά ἰσχυραὶ ἰσχυρὴν ἰσχυροτάτην ἰσχυρῆς ἰσχυρότατον ἔσω ἔσωθεν σωρὸν σωφρόνων Τέῳ τ τὰ τέῳ ὦτα Ταβάλῳ Ταβάλου Ταινάρῳ ἑταιρήιον Ἰταλίῃ Ἰταλίην ταλάντων ταμόμενοι ὅταν Ταίναρον ἔταξε ταραχῶδες Ἀταρνέι Ἀταρνέος ταρσοὺς Ταρτησσὸν Ταρτησσοῦ Ταρτησσίων τασσομένους ταῦτά ταῦτα ταύτας ταύτην ταύτης ταύτῃσι ταφαὶ ταφῆς ταχὺ ταχύς ταχίστῳ ταχίστην ταχέως Τάβαλον Τίγρην ἐτύγχανον τόδε τε ἅτε ὅτεῳ τεῷ ἔτεα Τεγέῃ Τεγεητέων Τεγεήτας Τεγέη Τεγέην Τεγέης τεθνεός τεθνεῶσι τεθνάναι τεθρίππῳ ἔτεϊ τειχήρεας τειχίσαντες ἔτεκε τεκμαιρόμενον τεκνοποιὸν τεκοῦσαν τελαμῶσι ἀτελείην ἐτελεώθη τελεόμενα ἀτελέες ἐτελεύτησε τελευτᾷ τελευταίῳ τελευταῖοί τελευταῖον τελευτήν τελευτῶντα τελευτῶντος τελευτήσῃ τελευτῆσαὶ τελευτῆσαι τελευτήσαντα τελευτήσαντι τελευτήσαντος τελευτήσειν τελευτῶσι τελέην Τελμησσέες Τελμησσέων τελέως ἐτελέωσε τεμένεϊ τενάγεα Τενέδῳ Τενεδίοισι τεύξεαι τεο ἔτεος ἕτερα Τερμίλαι Τερμίλας ἕτεροι ἕτερον ἕτερος ἑτεροῖός ἔτεσι τεσσερεσκαίδεκα τεσσερεσκαιδεκάτη τεσσεράκοντά τεσσεράκοντα τεσσέρων τετελευτήκεε ἐτετείχιστο τετολμήκαμεν τετραγώνου τετρακοσίων τετρακόσιοι τετραμμένα τετραμμένας τετραμμένη τετραμμένης τετραμμένοι τετραμμένον τετραμμένος τετραέτεα τετράγωνα τετράγωνον τετράκυκλοι τετρῦσθαι τετάρτῃ τετάρτου τετρωρόφων ἐτετάχατο τευ ὅτευ τείχεά τείχεα ἐτείχεε τείχεϊ τείχεος τεῖχος ἄτην τηνικαῦτα ἰτέης Τηίων ἐτέθαπτο τίθει ἐτίθεσαν τέθνηκας τι ὅτι τιθεῖσαν τιθέντας τιμὴ ἄτιμα τιμὴν ἐτιμώρεον τιμὰς τιμήσασα τιμῶσι Τιμήσιος τιμωρέειν τιμωρίην τιμωρῆσαι τιμωρέων τινὰ τινα τινες τινος τινάς Τήιοι τιάραν τις ἥτις τιτρώσκεσθαι τέκνα τέκνοισι τέκνων τόκου τίκτει τάλαντα Ἀτλαντὶς τέλεα τέλεϊ Τέλλῳ τἄλλα Τέλλον τέλματι ἐτόλμησας ἐτόλμησε τέλος τύμβῳ ἐτίμησα ἐτίμησαν Τμώλου ἐτάμνετο Τῆμνος Τόμυρις Τόμυρίν Τόμυρίς τὴν τόνῳ τίνα τήνδε τάξας τάξι τόξων τοῦ τοῦδε τοι ἤτοι τοιαῦτα τοιαύτη τοιαύτην τοιαύτης τοιάδε ἕτοιμα ἕτοιμοι ἕτοιμος τοιόνδε τοιούσδε τοιοῖσιδε τοιούτῳ τοιοῦτο τοιούτοισι τοιοῦτον τοιούτου τοιούτους τοιούτων τέοισί τοιάσδε τοκέα τοκέας τοκέες τολμᾷς ἑτοίμου ἑτοίμους Τομύρι Τομύριος ἑτοίμων τοὔνομα τοίνυν τοξεύειν τοξοφόρους τοξόται τοῖσί ἔτος τούς τοσαῦτα τοσαῦται τοσάδε τοῖσι τοῖσιδε τοσόνδε τοσούτῳ τοσοῦτο τοσοῦτον τούτῳ τοὔτερον τοῦτὸν τοῦτο τούτοισι Τοῦτον τοῦτον τούτου τούτους τούτω τούτων τουτέων τὠπὸ τύπον τύπος τύπτοντες ἑτέρῃ τρία ἑτέραν τύραννος Τάραντι Τάραντος τραπέζῃ τραπέσθαι τέρας τραφεὶς τραφῆναι τρίβοντάς τρώγειν ἀτρεκέως ἀτρεμίζοντα ἀτρεμίζουσαν τρεῖς ἔτρεφε τρεφόμενος τρεψόμεθα ἑτέρη ἑτέρην τρηχέαν τρηχέως τριηκάδας τριηκοσίας τριηκοσίους τριηκοσίων τριηκόσια τριήκοντα τριμέτρῳ τριῶν τριξὰ Τριοπικὸν Τριοπίου Τριόπιον τριπάλαιστα τρισὶ τρισχίλια Τριταιέες Τριτανταίχμῃ τριέτεα τριτημορίδι τριτημορίη τριτημορὶς τριφασίας τριωρόφων τρώματα ἑτέροισι Τύρον τροπὴν ἑτέρου ἑτέρους τροφὴν Τροφώνιον τρόπῳ τράπεζα τράπεζαι τρέπεται τρίπηχυ τρίποδα τρίποδας τρόποισι τρόπον ἐτράποντο τρόπου τρίπους τρέπουσι τρὶς τρίτῃ τρίτη τρίτην τρίτον τρίτου τρέφει ἐτρέφετο τρίφυλλον τρέφωμεν τὠρχαῖον τρέψονταί ἑτέρωθι τρωματίσας ἑτέρων τῆς τῖσαι τίσασθαι ἐτίσατο τάσδε τίσεσθαι τῇσι τῇσιδε τίσιν τίσις τέσσερα τέσσερας τέσσερες τίσωνταί τέταγμαι ἐτέτακτο τέταρτον τότε Ἀττικὸν Ἀττικοῦ Ἀττικῆς Ἀττικῇσι τέτοκα τυγχάνει τυγχάνεις τυγχάνοι τυγχάνω τυθῆναι Ἄτυν Ἄτυος τυραννίδα τυραννίδι τυραννίδος τυραννεύοντι τυραννεύοντος τυραννεύσας τυραννὶς ἐτυράννευε ἐτυράννευσε τυράννοισι Τυρσηνίην Τυρσηνῶν Τυρσηνοὶ Τυρσηνούς Ἄτυς τὠυτὸ ἔτυχε τυχεῖν ἔτυχον τάφον τάφος τάφου τάφρον τάφρος τάφρου τύχῃ τάχα τάχεος τύχη τύχης τάχιστα τάχιστον τέχνῃ τέχνην τάχος τύχῃσι Τέων ἐτέων Τέως τέως υἱὸν ἔφαινε φαῦλα φαῦλον φαμένου φαμένων φαίνεαι φαίνεσθαι φανέεσθαι φαίνεταί φαίνεται ἐφαίνετο φανέντων φαίνομαι φαίνονταί ἐφαίνοντο φανέωσι Φαρέες φαρετρεῶνα φαρμάκῳ φαρμάκοισι φαρσέων φασί ἔφασαν φασι φαυλοτέρους φόβου φεύγειν φεύγοντας φεύγουσι φεύγων φειδομένους ἀφειδέως ὀφείλειν ὀφείλεις ὄφελον ὀφείλοντα ὀφείλω φεύξονται ἔφερε φερόμενοι φερνάς φερόντων ἔφερον φερούσας φείσατο Ἐφεσίοισι Ἔφεσος Ἐφεσίων φευγόντων ἔφευγον Φύη ἔφη ὀφθαλμὸν ὀφθαλμοὺς ἐφθέγξατο φθεγγομένου φθείρων ἁφθεὶς ὀφθεῖσαν ὀφθεῖσι ἅφθη Φθιῶτιν ὀφθῆναι ἄφθογγος φθονερόν ἄφθονοί φιάλας φιλέονται φιλοσοφέων φιλέουσι φιλότητα ὄφιν ὄφις Φώκαια Φώκαιαν φύλακα φύλακον φύλακος ἐφύλαξε φάλαρα ἐφύλασσε ἐφύλασσον φλαυροτέρης φλαυρότατον φύλλα φίλοι φίλον φίλος φίλου φίλους φίλων φήμῃ φήμην φάναι ἐφώνεε ἐφόνευε ἐφόνευσαν ἐφόνευσας ἐφόνευσε φόνον φόνου φοβέαι φοβεῦ φοβερόν φοβέεται ἐφοβήθη φοινικηίους φοινίκεοι Φοινίκης φοινίκων φοιτεόντων φοιτᾶν φοιτέοντα φοιτέοντας φοιτέοντες φονέα φονεύειν φονεύς φονεύσας φονεύσω Φοίνικας Φοίνικες φοίνικες Φοίνικος φοίνικος Φοίνικές Φοίνιξι φορβὴν φορβῆς φορέουσι φορτία φορτίων ἐφοίτων ἔφραζε φρέαρ Φραόρτεω Φραόρτης ἔφρασε Φρύγα Φρύγας Φρύγες φέρε φέρει φέρειν ἐφόρεον φέρεσθαι φράζει φράζειν φράζων Φρικωνὶς φρένας ἐφρόντιζε Φρὺξ Ἀφροδίτην Ἀφροδίτης φόρον φρονέοιεν φρονέοντα φρονήσαντες φέροντα φέροντας φροντίδα φροντίδι φέροντες φροντίζω φροντίζων ἐφέροντο φρονέων ἐφρούρεε φόρου φέρουσί ἐφόρους φέρουσαι φέρουσαν φέρουσι φράσαι φάρσεα φάρσεϊ φάρσεος ἐφράσθη φράσων φόρτον φρήτρη Φρυγίης φέρω φέρων Ἐφέσῳ φής φύσας Φᾶσιν φύσιν Ἐφέσιοι φάτιν φάτις φυγάδες φυγόντων ἔφυγον φυλακῇ φυλακὴν φυλακῆς φυλασσόμεθα φυλασσόμενος φυλασσομενέων φυλάκους φυλάξαντες φυλάξας φυλάξων φυλάσσειν φυλάσσεται φυλάσσονται φυλάσσοντος φυλάσσων φυσίζοος Φωκαίῃ Φωκαέα Φωκαίες Φωκαίην Φωκαίης Φωκαιέας Φωκαιέες Φωκαιεῦσι Φωκαιέων Φωκέες Φωκέων φωκέων ὀφίων φωνεῦντος φωνήν ἄφωνος ἔχῃ Ἀχαιμενίδῃ Ἀχαιμενίδαι Ἀχαιῶν χαιρήσει Χαλδαῖοι Χαλδαίων χαλεπός χαλινοὺς χαλκῷ χαλκέῳ χαλκέα χαλκεὺς χαλκήιον χαλκὸν χαλκέος χαλκέους χαλκόπυλον χαλκὸς ἐχαλέπαινε ὄχανα χαρακτὴρ χαρακτῆρα χαρακτῆρες χαρίζεσθαι ἐχαρίζετο ἄχαρι χαριεῖ χαριεῖσθαι ἐχαρίσατό ἀχαρίστοισι χαίρων χέασθαι ἔχε ἔχει χειμερινόν χειμῶνά χειμῶνα ἔχειν χειρὶ χειρῶν χειρώνακτες χειροποίητον χειρὸς ἐχειρώσαντο ἐχειρώσατο ἔχεις χείλεα χελώνην χελώνης χεῖλος χεύματα χεῖρας χεῖρες χερσὶ Χερσονήσου ἔχεται ὠχέετο ἄχθεα χθιζῷ ἔχθρην ἔχθρης ἐχθροῦ ἐχθρούς ἰχθῦς ἰχθύων χλανίδιον ὀχληρὸν χίλια χίλιαι χάλκεαι χάλκεον ὄχλον χόλον Χάλυβες Χίλων Χίλωνος χῶμα χώμασι χώματα χώματι ἐχόμενα ἐχόμενος χῶν ἰχνεύειν ἐχόντων ὀχάνων Χῖοι ἔχοι ἔχοιεν Χίοισι ἔχοιτο ἔχομεν ἐχομένων Χίον ἔχον χοῦν χοίνιξι ἔχοντά ἔχοντα ἔχοντες ἔχοντι ἔχοντος χορεύειν ἐχούσας Χοάσπεω Χίου ἔχουσα ἔχουσαι ἔχουσι χώρῃ χρὴ ἐχώρεε χρεώμενοι χρεώμενος χρεόν χρεωμένῳ χρεωμένους ἐχάρη ἀχρηίῳ χώρη χρηίζω χρηίζων χρημάτων χώρην ἀχρηίου χώρης χρησαμένους ἔχρησε χρησθὲν χρησιμωτάτην χρησμῷ χρησόμενοι χρησάμενος χρησμὸν χρησμοῦ χρησμολόγος χρησομένους χρησάσης χρηστὰ χρηστηρίῳ χρηστηριαζόμενος χρηστηριαζομένῳ ἐχρηστηριάζετο ἐχρηστηριάζοντο χρηστηρίοισι χρηστηρίου χρηστηρίων χρηστοῦ ἄχρηστοι ἄχρηστον χρηστοῖσί χρηστοῖσι χρηστήρια χρηστήριόν χρηστήριον χρηστῇσι ἄχρι ἀχάρι ἐχρήιζε χάριν ἀχάριτα χρῆμα χρήματά χρήματα ἀχρήματοι χρήματος χρῆν χρόνῳ χρόνον χρόνος χρόνου Χέρξης χρέο χροησμούς Χρομίος χῶρον χῶρος χρέος χώρου ἐχρήσαντο χρήσαντος χρήσασθαι ἐχρήσατο χρύσεαι χρήσειν χρύσεόν χρύσεοι χρύσεον χρύσεος χρήσεσθαι χρᾶσθαι ἐχρήσθη χρᾶται ἐχρᾶτο χρυσῷ χρυσέῳ χρυσέας χρυσέη χρυσέην χρυσὸν χρυσοῦ χρυσίον χρυσίου χρυσοφορήσειν χρυσός χρέωνται ἐχρέωντο ἐχέτω ἔχω Χίων ἔχων χωρῇ χωρία χωρέει χωρέειν χωρίον χωρέοντα χωρίου χωρὶς χωρέων ῥῖψαί Ψαμμήτιχος ἅψατο ψήγματος ἧψε ὄψεαι ψεύδεσθαι ψεῦδος ὄψεται ψευδέα ἐψευδόμην ψευδόρκιοι ἀψευδὲς ψευσθῆναι ὑψηλή ὑψηλότατα ὑψηλότατον ὑψηλότερος ἥψησε ψιλὸν ὄψιν ὄψιος ὄψις ψάλλειν ψάμμου ψὴν ψῆνας ἑψομένης ἅψονται ὕψος ἑψήσῃ ἑψήσαντες ψυχὴν ψυχροῦ ἐωθὼς ἐωθότα ῥέων Ἰωνίῃ Ἴωνας Ἴωνες Ἰωνίη Ἰωνίην Ἰωνίης Ἰωνικὸν Ἰωνικοῦ Ἴωνάς ἕως Ἴωσι ἑωυτῇ ἑωυτὸν ἑωυτοῦ ἑωυτοὺς ἑωυτοῖσι ἑωυτῆς qxw-20200708/examples/mobius-filled.qxw0000664000175000017500000001637213674704262015545 0ustar momo#QXW2v1 http://www.quinapalus.com GP 7 12 6 1 0 0 TTL + AUT + GLP 1 1 0 0 GSP ffffff 000000 0 0 0 0 TM 0 0 0 + TMSG 0 0 + TMSG 0 1 + DFN 0 +/usr/share/dict/words DFN 1 + DFN 2 + DFN 3 + DFN 4 + DFN 5 + DFN 6 + DFN 7 + DFN 8 + DSF 0 + DSF 1 + DSF 2 + DSF 3 + DSF 4 + DSF 5 + DSF 6 + DSF 7 + DSF 8 + DAF 0 + DAF 1 + DAF 2 + DAF 3 + DAF 4 + DAF 5 + DAF 6 + DAF 7 + DAF 8 + SQ 0 0 0 0 0 E SQ 1 0 0 0 0 A SQ 2 0 2 0 0 C SQ 3 0 0 0 0 T SQ 4 0 0 0 0 O SQ 5 0 3 0 0 R SQ 6 0 0 0 0 A SQ 7 0 0 0 0 D SQ 8 0 2 0 0 V SQ 9 0 0 0 0 A SQ 10 0 0 0 0 N SQ 11 0 2 0 0 C SQ 0 1 0 0 0 T SQ 1 1 1 0 0 O SQ 2 1 2 0 0 V SQ 3 1 0 0 0 A SQ 4 1 0 0 0 P SQ 5 1 2 0 0 O SQ 6 1 0 0 0 R SQ 7 1 0 0 0 E SQ 8 1 2 0 0 T SQ 9 1 0 0 0 T SQ 10 1 1 0 0 O SQ 11 1 2 0 0 A SQ 0 2 0 0 0 H SQ 1 2 0 0 0 U SQ 2 2 2 0 0 M SQ 3 2 0 0 0 P SQ 4 2 0 0 0 E SQ 5 2 3 0 0 D SQ 6 2 0 0 0 I SQ 7 2 0 0 0 N SQ 8 2 2 0 0 V SQ 9 2 0 0 0 O SQ 10 2 0 0 0 I SQ 11 2 2 0 0 C SQ 0 3 0 0 0 E SQ 1 3 1 0 0 D SQ 2 3 2 0 0 D SQ 3 3 0 0 0 E SQ 4 3 0 0 0 R SQ 5 3 2 0 0 I SQ 6 3 0 0 0 S SQ 7 3 0 0 0 I SQ 8 3 2 0 0 O SQ 9 3 0 0 0 N SQ 10 3 1 0 0 S SQ 11 3 2 0 0 T SQ 0 4 0 0 0 N SQ 1 4 0 0 0 A SQ 2 4 2 0 0 T SQ 3 4 0 0 0 T SQ 4 4 0 0 0 A SQ 5 4 3 0 0 S SQ 6 4 0 0 0 T SQ 7 4 0 0 0 R SQ 8 4 2 0 0 E SQ 9 4 0 0 0 C SQ 10 4 0 0 0 E SQ 11 4 2 0 0 N SQ 0 5 0 0 0 E SQ 1 5 0 0 0 D SQ 2 5 0 0 0 G SQ 3 5 0 0 0 A SQ 4 5 0 0 0 S SQ 5 5 0 0 0 C SQ 6 5 0 0 0 O SQ 7 5 0 0 0 O SQ 8 5 0 0 0 L SQ 9 5 0 0 0 E SQ 10 5 0 0 0 D SQ 11 5 0 0 0 R SQSP 0 0 ffffff 000000 0 0 0 0 SQSP 1 0 ffffff 000000 0 0 0 0 SQSP 2 0 ffffff 000000 0 0 0 0 SQSP 3 0 ffffff 000000 0 0 0 0 SQSP 4 0 ffffff 000000 0 0 0 0 SQSP 5 0 ffffff 000000 0 0 0 0 SQSP 6 0 ffffff 000000 0 0 0 0 SQSP 7 0 ffffff 000000 0 0 0 0 SQSP 8 0 ffffff 000000 0 0 0 0 SQSP 9 0 ffffff 000000 0 0 0 0 SQSP 10 0 ffffff 000000 0 0 0 0 SQSP 11 0 ffffff 000000 0 0 0 0 SQSP 0 1 ffffff 000000 0 0 0 0 SQSP 1 1 ffffff 000000 0 0 0 0 SQSP 2 1 ffffff 000000 0 0 0 0 SQSP 3 1 ffffff 000000 0 0 0 0 SQSP 4 1 ffffff 000000 0 0 0 0 SQSP 5 1 ffffff 000000 0 0 0 0 SQSP 6 1 ffffff 000000 0 0 0 0 SQSP 7 1 ffffff 000000 0 0 0 0 SQSP 8 1 ffffff 000000 0 0 0 0 SQSP 9 1 ffffff 000000 0 0 0 0 SQSP 10 1 ffffff 000000 0 0 0 0 SQSP 11 1 ffffff 000000 0 0 0 0 SQSP 0 2 ffffff 000000 0 0 0 0 SQSP 1 2 ffffff 000000 0 0 0 0 SQSP 2 2 ffffff 000000 0 0 0 0 SQSP 3 2 ffffff 000000 0 0 0 0 SQSP 4 2 ffffff 000000 0 0 0 0 SQSP 5 2 ffffff 000000 0 0 0 0 SQSP 6 2 ffffff 000000 0 0 0 0 SQSP 7 2 ffffff 000000 0 0 0 0 SQSP 8 2 ffffff 000000 0 0 0 0 SQSP 9 2 ffffff 000000 0 0 0 0 SQSP 10 2 ffffff 000000 0 0 0 0 SQSP 11 2 ffffff 000000 0 0 0 0 SQSP 0 3 ffffff 000000 0 0 0 0 SQSP 1 3 ffffff 000000 0 0 0 0 SQSP 2 3 ffffff 000000 0 0 0 0 SQSP 3 3 ffffff 000000 0 0 0 0 SQSP 4 3 ffffff 000000 0 0 0 0 SQSP 5 3 ffffff 000000 0 0 0 0 SQSP 6 3 ffffff 000000 0 0 0 0 SQSP 7 3 ffffff 000000 0 0 0 0 SQSP 8 3 ffffff 000000 0 0 0 0 SQSP 9 3 ffffff 000000 0 0 0 0 SQSP 10 3 ffffff 000000 0 0 0 0 SQSP 11 3 ffffff 000000 0 0 0 0 SQSP 0 4 ffffff 000000 0 0 0 0 SQSP 1 4 ffffff 000000 0 0 0 0 SQSP 2 4 ffffff 000000 0 0 0 0 SQSP 3 4 ffffff 000000 0 0 0 0 SQSP 4 4 ffffff 000000 0 0 0 0 SQSP 5 4 ffffff 000000 0 0 0 0 SQSP 6 4 ffffff 000000 0 0 0 0 SQSP 7 4 ffffff 000000 0 0 0 0 SQSP 8 4 ffffff 000000 0 0 0 0 SQSP 9 4 ffffff 000000 0 0 0 0 SQSP 10 4 ffffff 000000 0 0 0 0 SQSP 11 4 ffffff 000000 0 0 0 0 SQSP 0 5 ffffff 000000 0 0 0 0 SQSP 1 5 ffffff 000000 0 0 0 0 SQSP 2 5 ffffff 000000 0 0 0 0 SQSP 3 5 ffffff 000000 0 0 0 0 SQSP 4 5 ffffff 000000 0 0 0 0 SQSP 5 5 ffffff 000000 0 0 0 0 SQSP 6 5 ffffff 000000 0 0 0 0 SQSP 7 5 ffffff 000000 0 0 0 0 SQSP 8 5 ffffff 000000 0 0 0 0 SQSP 9 5 ffffff 000000 0 0 0 0 SQSP 10 5 ffffff 000000 0 0 0 0 SQSP 11 5 ffffff 000000 0 0 0 0 SQLP 0 0 0 1 1 0 0 SQLP 0 0 1 1 1 0 0 SQLP 1 0 0 1 1 0 0 SQLP 1 0 1 1 1 0 0 SQLP 2 0 0 1 1 0 0 SQLP 2 0 1 1 1 0 0 SQLP 3 0 0 1 1 0 0 SQLP 3 0 1 1 1 0 0 SQLP 4 0 0 1 1 0 0 SQLP 4 0 1 1 1 0 0 SQLP 5 0 0 1 1 0 0 SQLP 5 0 1 1 1 0 0 SQLP 6 0 0 1 1 0 0 SQLP 6 0 1 1 1 0 0 SQLP 7 0 0 1 1 0 0 SQLP 7 0 1 1 1 0 0 SQLP 8 0 0 1 1 0 0 SQLP 8 0 1 1 1 0 0 SQLP 9 0 0 1 1 0 0 SQLP 9 0 1 1 1 0 0 SQLP 10 0 0 1 1 0 0 SQLP 10 0 1 1 1 0 0 SQLP 11 0 0 1 1 0 0 SQLP 11 0 1 1 1 0 0 SQLP 0 1 0 1 1 0 0 SQLP 0 1 1 1 1 0 0 SQLP 1 1 0 1 1 0 0 SQLP 1 1 1 1 1 0 0 SQLP 2 1 0 1 1 0 0 SQLP 2 1 1 1 1 0 0 SQLP 3 1 0 1 1 0 0 SQLP 3 1 1 1 1 0 0 SQLP 4 1 0 1 1 0 0 SQLP 4 1 1 1 1 0 0 SQLP 5 1 0 1 1 0 0 SQLP 5 1 1 1 1 0 0 SQLP 6 1 0 1 1 0 0 SQLP 6 1 1 1 1 0 0 SQLP 7 1 0 1 1 0 0 SQLP 7 1 1 1 1 0 0 SQLP 8 1 0 1 1 0 0 SQLP 8 1 1 1 1 0 0 SQLP 9 1 0 1 1 0 0 SQLP 9 1 1 1 1 0 0 SQLP 10 1 0 1 1 0 0 SQLP 10 1 1 1 1 0 0 SQLP 11 1 0 1 1 0 0 SQLP 11 1 1 1 1 0 0 SQLP 0 2 0 1 1 0 0 SQLP 0 2 1 1 1 0 0 SQLP 1 2 0 1 1 0 0 SQLP 1 2 1 1 1 0 0 SQLP 2 2 0 1 1 0 0 SQLP 2 2 1 1 1 0 0 SQLP 3 2 0 1 1 0 0 SQLP 3 2 1 1 1 0 0 SQLP 4 2 0 1 1 0 0 SQLP 4 2 1 1 1 0 0 SQLP 5 2 0 1 1 0 0 SQLP 5 2 1 1 1 0 0 SQLP 6 2 0 1 1 0 0 SQLP 6 2 1 1 1 0 0 SQLP 7 2 0 1 1 0 0 SQLP 7 2 1 1 1 0 0 SQLP 8 2 0 1 1 0 0 SQLP 8 2 1 1 1 0 0 SQLP 9 2 0 1 1 0 0 SQLP 9 2 1 1 1 0 0 SQLP 10 2 0 1 1 0 0 SQLP 10 2 1 1 1 0 0 SQLP 11 2 0 1 1 0 0 SQLP 11 2 1 1 1 0 0 SQLP 0 3 0 1 1 0 0 SQLP 0 3 1 1 1 0 0 SQLP 1 3 0 1 1 0 0 SQLP 1 3 1 1 1 0 0 SQLP 2 3 0 1 1 0 0 SQLP 2 3 1 1 1 0 0 SQLP 3 3 0 1 1 0 0 SQLP 3 3 1 1 1 0 0 SQLP 4 3 0 1 1 0 0 SQLP 4 3 1 1 1 0 0 SQLP 5 3 0 1 1 0 0 SQLP 5 3 1 1 1 0 0 SQLP 6 3 0 1 1 0 0 SQLP 6 3 1 1 1 0 0 SQLP 7 3 0 1 1 0 0 SQLP 7 3 1 1 1 0 0 SQLP 8 3 0 1 1 0 0 SQLP 8 3 1 1 1 0 0 SQLP 9 3 0 1 1 0 0 SQLP 9 3 1 1 1 0 0 SQLP 10 3 0 1 1 0 0 SQLP 10 3 1 1 1 0 0 SQLP 11 3 0 1 1 0 0 SQLP 11 3 1 1 1 0 0 SQLP 0 4 0 1 1 0 0 SQLP 0 4 1 1 1 0 0 SQLP 1 4 0 1 1 0 0 SQLP 1 4 1 1 1 0 0 SQLP 2 4 0 1 1 0 0 SQLP 2 4 1 1 1 0 0 SQLP 3 4 0 1 1 0 0 SQLP 3 4 1 1 1 0 0 SQLP 4 4 0 1 1 0 0 SQLP 4 4 1 1 1 0 0 SQLP 5 4 0 1 1 0 0 SQLP 5 4 1 1 1 0 0 SQLP 6 4 0 1 1 0 0 SQLP 6 4 1 1 1 0 0 SQLP 7 4 0 1 1 0 0 SQLP 7 4 1 1 1 0 0 SQLP 8 4 0 1 1 0 0 SQLP 8 4 1 1 1 0 0 SQLP 9 4 0 1 1 0 0 SQLP 9 4 1 1 1 0 0 SQLP 10 4 0 1 1 0 0 SQLP 10 4 1 1 1 0 0 SQLP 11 4 0 1 1 0 0 SQLP 11 4 1 1 1 0 0 SQLP 0 5 0 1 1 0 0 SQLP 0 5 1 1 1 0 0 SQLP 1 5 0 1 1 0 0 SQLP 1 5 1 1 1 0 0 SQLP 2 5 0 1 1 0 0 SQLP 2 5 1 1 1 0 0 SQLP 3 5 0 1 1 0 0 SQLP 3 5 1 1 1 0 0 SQLP 4 5 0 1 1 0 0 SQLP 4 5 1 1 1 0 0 SQLP 5 5 0 1 1 0 0 SQLP 5 5 1 1 1 0 0 SQLP 6 5 0 1 1 0 0 SQLP 6 5 1 1 1 0 0 SQLP 7 5 0 1 1 0 0 SQLP 7 5 1 1 1 0 0 SQLP 8 5 0 1 1 0 0 SQLP 8 5 1 1 1 0 0 SQLP 9 5 0 1 1 0 0 SQLP 9 5 1 1 1 0 0 SQLP 10 5 0 1 1 0 0 SQLP 10 5 1 1 1 0 0 SQLP 11 5 0 1 1 0 0 SQLP 11 5 1 1 1 0 0 SQCT 0 0 0 E SQCT 1 0 0 A SQCT 2 0 0 C SQCT 3 0 0 T SQCT 4 0 0 O SQCT 5 0 0 R SQCT 6 0 0 A SQCT 7 0 0 D SQCT 8 0 0 V SQCT 9 0 0 A SQCT 10 0 0 N SQCT 11 0 0 C SQCT 0 1 0 T SQCT 1 1 0 O SQCT 2 1 0 V SQCT 3 1 0 A SQCT 4 1 0 P SQCT 5 1 0 O SQCT 6 1 0 R SQCT 7 1 0 E SQCT 8 1 0 T SQCT 9 1 0 T SQCT 10 1 0 O SQCT 11 1 0 A SQCT 0 2 0 H SQCT 1 2 0 U SQCT 2 2 0 M SQCT 3 2 0 P SQCT 4 2 0 E SQCT 5 2 0 D SQCT 6 2 0 I SQCT 7 2 0 N SQCT 8 2 0 V SQCT 9 2 0 O SQCT 10 2 0 I SQCT 11 2 0 C SQCT 0 3 0 E SQCT 1 3 0 D SQCT 2 3 0 D SQCT 3 3 0 E SQCT 4 3 0 R SQCT 5 3 0 I SQCT 6 3 0 S SQCT 7 3 0 I SQCT 8 3 0 O SQCT 9 3 0 N SQCT 10 3 0 S SQCT 11 3 0 T SQCT 0 4 0 N SQCT 1 4 0 A SQCT 2 4 0 T SQCT 3 4 0 T SQCT 4 4 0 A SQCT 5 4 0 S SQCT 6 4 0 T SQCT 7 4 0 R SQCT 8 4 0 E SQCT 9 4 0 C SQCT 10 4 0 E SQCT 11 4 0 N SQCT 0 5 0 E SQCT 1 5 0 D SQCT 2 5 0 G SQCT 3 5 0 A SQCT 4 5 0 S SQCT 5 5 0 C SQCT 6 5 0 O SQCT 7 5 0 O SQCT 8 5 0 L SQCT 9 5 0 E SQCT 10 5 0 D SQCT 11 5 0 R END qxw-20200708/examples/deck4x4.qxd0000664000175000017500000000016413674704262014225 0ustar momo.RANDOM 2 00 01 02 03 =[LM]@RK 04 05 06 07 08 09 10 11 12 13 14 15 00 04 08 12 01 05 09 13 02 06 10 14 03 07 11 15 qxw-20200708/examples/plugin_behead_message.c0000664000175000017500000000235613674704560016705 0ustar momo/* Qxw is a program to help construct and publish crosswords. Copyright 2011-2019 Mark Owen; Windows port by Peter Flippant http://www.quinapalus.com E-mail: qxw@quinapalus.com This file is part of Qxw. Qxw is free software: you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. Qxw 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 Qxw. If not, see or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // gcc -Wall -fPIC plugin_behead_message.c -o plugin_behead_message.so -shared #include "qxwplugin.h" int treat(const char*answer) { if(msgcharICC[0]==ICC_DASH) return treatedanswerICC(answerICC); // no treatment if message character is "-" if(answerICC[0]!=msgcharICC[0]) return 0; // starts with the right character? strcpy(light,answerICC+1); return treatedanswerICC(light); } qxw-20200708/examples/bar-filled.qxw0000664000175000017500000002747413674704262015020 0ustar momo#QXW2 http://www.quinapalus.com GP 0 12 12 4 0 0 TTL + AUT + GLP 1 1 0 0 GSP ffffff 000000 0 0 TM 0 0 0 + TMSG 0 0 + TMSG 0 1 + DFN 0 +/usr/share/dict/words DFN 1 + DFN 2 + DFN 3 + DFN 4 + DFN 5 + DFN 6 + DFN 7 + DFN 8 + DSF 0 +^.*+(?