From 359463682fa19cdbc7100f600eb96babec1a0f3f Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Fri, 4 Jun 2021 01:50:21 +0200 Subject: [PATCH] Implemented automatic parameter documentation --- Hazelnupp.vpp | Bin 754688 -> 790528 bytes Hazelnupp/DataType.h | 24 +++++ Hazelnupp/Hazelnupp.cpp | 169 +++++++++++++++++++++++++++++++++++- Hazelnupp/Hazelnupp.h | 40 ++++++++- Hazelnupp/Hazelnupp.vcxproj | 8 +- 5 files changed, 234 insertions(+), 7 deletions(-) diff --git a/Hazelnupp.vpp b/Hazelnupp.vpp index 1be4fc1f9f604fa41dff606a5618cc258135e95d..772a7f4f5b3104cc427f16a2d6d0693538dd57d2 100644 GIT binary patch delta 40626 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 sgDQjE;Rx9O1NOF+(f|Me delta 25769 zcmb5V1ymf}(k{%*5E#KF5Ind$!67)oU4whj1lK_W2_8ZQ4;tKMaEB0Ff`_0%L$KiX z5AXTDyUsoLyLYW0*0Z{2OZDEhtDdUv-W{CH9UR4(Kt_NMM?(XyqM(X~hGu|<28c>z z=LO=!tIhc^u>k;F4r)qD03|qNM?NVV(+rSS1I7TO>!1O2l6ctJYoFm!0iem0089=B zH0olPT338SU{XV*96Cy%P7M({5d{=9iV_Ss0bPU6Ku4h8pe@iEXbCh2ngWg1K7C#W zs2#Qe0&7Rv`V{_;%b8*UF0fI((H_KsQLXO)1nW|$F`=Q6ps|JYL(!g~qvIkq&>^V+ z!~q!?jL5)*NIf(*s_{7l;c*Ju*tiQkQ;>Qs?JcEg>s%9X4+C`7M8WVNx&J*Ll+*@5 z?O-Y`kPy|c0gM{!9R}*`{Ug-bZPQv3L$=h zNsfyu%>D1euo&n=;Y&n<6c`WDc!~K9H>Afi{C`zP0{{2wBgnI7{QS@O1bDcUs=XQz z_ScwPD8&I2Q2-!b^MVPHBt+mH(8IKWh^J4$qzFnyh$hm70{j8=NF7y*fy7XOT!FA0 zEdCic+6o%lN}?1Qf*uTR#jJRQ_sDsX6_I#^sfgr)fHeSca-kIA@cF}B5X%b-##aG& zmydIlTh&RqGK76V3I$=Mh&2pImPZudzzKKGr)-QaK1>I^=4~3K4+4tz0od+Uw9^OTJHw<6e0@Th7*-rPY+)=worXu^)OPn$Tp z@2lXS2eG*Q3`ssX9*p7QaK%ezP-bMbw}?qfw9Zu`vabHFI+d6*eEPh*sbr>B|BHW1 z?P4aK@a)5?v+AA5Z!g(RqNW`WLFk!1&E3VS+>iwjP!zj?6pW4zhC*z7++5#yAT)WwREXz=V00um zJ7gS$;b4X82SebhLl}|l%#iOOpoeS&J*o?$Oa<};Nqq=j1%W+$QH`+OY!HAK5K6>5 zOq2!A9fNTY*N?!Dk%qs)g(x|$s3xpPj1BM=2ShQg3dEKmg?LW3TPju6>}h(1WhM<@w^^$}HUP)tM(J@oxU zKSBi87DNjX41}R0KX5=@fXH4qs1Tq*0}P@85Fy2QpuIo@O*lF}f`$)@iKJkM(g0Ar z0;J?cNC|-Hkmdr=Y#<`o;}IqTmjQ}_z!8BEAgHpyM2M7mC^15X8+!O~87jm?A6OiD z9{}S8AWJ2nx&UNvIO;kNb<~LTS(puy$rm;cM2wq)A&AXMSbak z#3~1v0?9HCo<$jpLqi!Dh>ii|w{@_2gV3ZxS=a9oFcy-37(5KZkbUSU{2z3~`MQ9!LI8Wjq3sPirqx>4t}D6wa#BLfQbC@`ab z-=gZ?qmFl|<3sMUg2FNiKTsG(p#gjCQi|Fe-g zC5oL|7mkW|lM zJ^vJ%|05lNrv}4D=E=hD0SGt&>@h+}35JI-oCA>{@8w|t0N~jtFoYY)?SqN~=z;=* zyvPg@7)s?RS>^x)n=%X!xugW613ZGF6lI0L)`AHmB~)PDAb?FnID`&>D2jyWV0i1G zYAcX|5s(NV5NM6y(u4^i)ILIakS-c9RC0k@RiF*>kq+z{^vDBsZj1Oc4k1NkUt=mG z?G0clphqsKQU`=ZHdq=#X^P@QwU@9O(4z-OF#K190XsirD0cs^h=lbJk*I)k-i zp_+#O-#q1kvcM=C21NYZ+%O&p3K;nxIv_$d14aG6bpEd_Ao_o00bgjK=nWVDj4I~e zBT4N4=@ig^oFMLha-@Gnk@$b})c=X+Q8b9A&?Rmxgz=S*TI4JDWw)$-#rWT)WIg+I z0}n5-ioIzzM5OP#GhIqnZxueFh&N-Tv2^Jw>09=njMPMx0CymvNDr>FmEi1qjJ12N zB4Y};TnrQ5RKqxUTC%)0?6vfvelCuoDbCFlPY&U`ntn=!?*kWy+$(;V?_zLM;NX#y zH*T|;Ndu1<`MJi?lgRc~rg3mWQ^x0?@tgRw-(E!k2y^y{7KpgN5^*zf=R{V{F(nhm zcDfE_EpY5JD?6Aa4q}UfFSjM1Z+}k99=2!3HvJHm7GASXZ(b@j|C-|1f>KGf=Y>Ny zf$DhQGp;ObVxAn1h%bj|jafA5Wbh}{i!05wttzS2l844yBp52;o97`tdon~R<2nhW zB;}!|#DBlrwTVcRsqN}dSV`Nl)ls^|XGDGZsX&<1gOfs-GM+z}T>Mk~=c0bw0yJ29 zPeX^FSCK}+VJzZDDJh|dagJ_B)t`0t9);Eut3{vhjM68q=!KE}Y8ODlG!pp0sy>hB z3M)0ErF1%RTGCLt87VjZ0w<8@rB{h?58ZRAi;J%;w9ir6(YMDU>?2SYJl7n&EjHig z7cccHCl0`P9XMgnPX&!NRoM9YO*-)xbL&T-Mw5`kRV;7xR^8xD2{qBPCW_OqVl1yN z=covcD#vfuRc1xE&4o(v8V-tnl#-M=-|4(%EkC&QF!_}vNaFXz%Qcd!6_gr zz07}?ljf-K^I9Y2;__pvXDik0I}yF-)^n0Ra;dq@*u=iSK9_MVz|*SD(x~=7pF?*< zG~e9P^oBnpBwHMeV2RvsRQP+2)3_x+`6Ae`oFvy_T`?Ki+hy)&Jh zy{8+2sj^7K+d(7h5Z6ImF<#|H=m~5hISP_lK7M$*aNEZ_jD_W(VN!CFMnEfP|I>%i zjpt2yT@XIuLfN?K9o#ZC?<;}GXOv|d=NvKC|0tgq_wt#dZHLPBD@2k|fT~(@wmDMoQ{=>a1|3y+e+YDE6X{qSt zPyYjPwX)AFZc9tv%YmN^vZAbH+hKiIo`g(lVrFHZBWv7#e1x-TSEwiZXI%vH#7PMc zFrAsvH<+;uN(7o!n&wT$MnRTpKTzg`bz|qKzDT%a3m{it?~irIT6NTqqd5&c{_2c7 zquz3=fAZ-R{iWu!FA14jnusg0#+4BA{xKghrwrd6f!X8cW1d@TW0x91eivWC2YP=Y zrzTq=Z61oGfjI^#5~HC#q$?i~NApl7#Gx%r3n{7!?L*y4yadZ2Xbxch=&0%tMEU`W zs5^zBQi#2COk#vN0L7ODa!_LwWgo-Z9}=pBtvKhXeY>N*rN3cVN$44}L5J91AfrpX z+6_aaoQI4a5sV31>0*?;)ag7_I;(l|_CJF<$4d3&bigBvs)ts#_>~WN> zPX-k4EG{P|6R!~3eYmPe`HA|cGU>TjJ-FpK8MwK_;aShOvxPP<2su?ZE@Oz{ggId} z9ua4IkvJv8;mr8W_j#(d7!pl4_1v#LcLsV!Mn*E@#f}H^!{v4>kNr-bp0XBg8;c=N zYpXPc-21xgq-BzGnl-eT*>qCwDytgyv0sofv&;P+R*-!+-lT|)jqNBRBJyQsdfMWS z)=x=Y)xP;!TZkjM(5@hh|I@lXoXNw+=GR498d>j#TT=E9u!7YxVAr z^y~PJs^#(BD!0Cbi94ptW=;FwVJ5M!DR!&c(`II;tRz>MDC&>I4KaMB;5r8w$6aOy z6Lq3()Ha9Cq)G$tb|3TPw8V_>=*%A*F~B%?QdrMXtlDS`x2kQ$Inp4cN)%FyzCPUAKDI13<*f59Q@>Toq}o_GHx>n zFI$nswBXy*d6IX`OnnE}B3Z2dtn(zurYwmyo?!9&twAm<$rYA6$Z9F=EuNza-6zRm z<1e=UbiCQ=jfJjhgCgRV$niWLf(mhWwDhH3oS-oe6cdHNl$P4&i!2Yz5-rZfp*ygr zWzl&?Ex+6s{>M+cML-yBKDumv6n}0*LlSyf$DD>ga^H^~UJf@33>m}1^0YXi3JJY#LvbMuQjbG#m{byamP`yC(0#P@z{!sf63w@QN)KwD3XXL z?H+DMLVO_+O5+Qm$N3?2_jG^R&Ml$=^tzXy{}Tmv2qZS-LPML(DYg(3bmp+qajMxU z=(r-O<2%l`w-K~6Na)pYl~~lT_XTjvFGlQ{GsXP3RaNVgHMx#9`{Hixy;bROh zZLt}m+`Ek;CE=DDb`coxys8H`yq-w?fpbSX@1&_>LEHkO zpe7+DGs>N-FNQwU9r2 zQma2-r^=(@5|LX~pA+def4+ByM__Ao;3fd3%)HuMU)>%vy(7Sn_-aeMBSoXi*Xcwy z+49@|{$f?;%e8~LC?2(Fp8Xq!uy&s4b_q-0axUu~&rZaNUy$A-vtR9x^H!O137c_c zzq1sVQ9vxqaHg7#d$Y9qr`XvMIjmt<5ic}&>66BF;kp;ZqF!?aZVAG=f!<7QFV0S> zN4^WMOMF`sw^eV0;kd`_XXy`EX-~s_6-ie0OmQ=wm&C0eT#Hf=-FMu*-|D2Na?FCk zg@50m>At!i0e8L5m<;fFd2)cmV#9mG0xob82)sTe z<#!eNxu-aLbe44Os^87tw1K7Pp@H+GHANIS$6&B+f*)!r$_?LgUnpgPaeFoldSa+8+C6Y%&sRxM#z8Jr{ z;^CQJVM3Qd`YbTXJamrKR1UD|aol1u=H_rI|J&$(X)q&u_z9g@Y2T0)$ z+h2Nl1=;KistK!@(I&M@ak2q?gwYvI6vXrT%Io3D4&p!W1mUR@g+iaMoa?MD7)C`C zrX{0rYGpNeOfCpmr*4N{^}k6HUhzD{C`=~z_+^OfZiP#1)EmTkyGTw&n*PljWa_u1 z%M}qb-=OwIxL4)oC5&Iz*5^2V3t&K7e6e607QOy_%M6$SHXnD;>%)rvsPkCk=;Ae%P!phK&TZxc2Yv?!L+@qw+mXw4jTZqT2z!^WAbyruA{@b_!qemOEFo zsnvfH&g0$xn7*}6nZDJfg5k}q2)1>MI<6E;(`0|A9t^b!fqz`Y`2tJ1(UlBD zwc}YTX=MIHvw=CVRPme7PDJP2Mm66xjTdp|=Or6!7b)*8JyrA1|M5wgK|qjwat}L< zx0jFVxpFjl!P7w82;ismw#rJoNAT1%Rm+E`V>x2_QkF7r_-^3e|q`Y z_=HHo5ZcG?F>|yrmVm+!D_o}BD(V4DO(!mwWo^>Z3_>UB=pIIqPw`tk8xG|UD+AhM z&wEF2=>E1O^?TFcS5EyQ+XZ&l1umB%J~pMwAh*za;aK|yD-~89Q_p2n(T3#Afsk6~ zl(eks6;YYW-}!1r^@-S4j2?~?xYwfeUhiOzPk7j)tt*=v5HMj=h6 z-|r1`$Ss%IV@in>W6xb>{fo$)$*)~Ho?44Os&uz4dA71E0IF{sE`l&{5J#K$FjYyaeVMbe8GYMBsv zD{cS|oCBAnT%c7|cXYE}YUg)mp^3K3@*2}68k}=2B+va%pML0z38B>DNf0mft|h~rBORkSB5UE-??>z~9}HZ0%o(Pdo0Ouf$i^D3@s z4UT5>_Dnb}q?L27pzoLA_@<{ZRZ1gP=bUEMakW+7`-DuicNzu&Z^3Lh4d#~{vxWw= zThjATSI5>#dFUmrYgJ-8e~I@{{@uHsbz5KV@j8CJ?24EM1d`d5hP7H#=uYih&Y;<6 z?rICG>eQ9>_r%X;tnrvqRxnvx=t_)RJmC~={znfFKGXZ(%p}^?HStz5$_6UhD#*lV zHthhT-ih5!0?D`DN(ISA@3j*IaBop*iE}yW2Ypl-s?tNO2n)$=%p7pnpY373w^w1i zyB$sc0(Xtzsa+R-p5QGUwo*3Mvnwh-8oErc!MYN|wskO-v^)By)cjDVMXE)r8$O4V zCc`i@$hn&*EN9Gh=s(UoW$T_8SQInwNGZzqgIRf9LAaI zA2WQKxlVl__NkRSIqegi_Z7bMxv!}0h(o#XPjVHg(h%|Gu;`?pI|VEPH?VQEKM zfyrf6iRvs%8=BrPKP>Ek7Rumd{W8~B?_sIRzwG!JVFrm5rbE1DTW&SWHD3>YtAd9m z6Biv+zP@v76DDtLGTx`*W9E9@wp-F|q@3cQKHZ@;%|CIqYqfwl9h`+T_o?>6W4OyW zahlqXRJ72;a49kXDLzcEp%vdq|laM+=7 zSA-=?3z?7l9__c>3#BnQ<}y?90Z@?VBPmc%lQZ_(MR2rf{Zt@*Ve|7(?nENr z!M>~Kj&Jwm;|E^duS)13 zSwQaJ{Est^4n=d{rUit|9h;AG?bMQG|0H!KkS$(e&ViJ7*fHO;;1WI%7E;Z;hJB=pvE@!3Mjx;^ zb-llK5|6wa{5kEmFsHXcof=ta)R{Q6{4(<$1oY!a3>@@k@`SJ;U0mNxgw(y2_GJZ) z(LRfD-VY8=E_m5!;IGHMaKU2CLeOesfdS?C_z?)}8NnslpqxZ6DLs6x`ou(LaJBSW z`ulacFH~<;|1RUV@HkrXpQ!XFX>GbiC>xg2qu>1~Q{pdza&+kAAa^ZJ;p_;+xI$3a7o} zraqG~EPC=KxY@BfQ~J3urv~YmZjC(L;pb@v^c&@232E+QKOD2P@kdvXPEx)_TW>b$ z@E<%f5%8~%_$FH-_a}m1h37t|OP!mdDBQ~-cpLW&WCCf~x*_i5jMF(ObCHu5aVYZm zhFA4+7hpIPw@YQJ}Ko7F2<5z-qSU+CwZC?1yV*zB@W*^cD%<}^F@Tl2n;4wVIUOC>^wxOGqQw7Nv1?RimZ!{Axj&?Z^50JGG zf#xq9US(j4(E{dvO7qHDh_Eh2?j-d zWbREho!6V4&)7P=c~_ms5*kZzU(Nnl`_-O{1oY~MM7NuC6e!U%g+|Z|RpKjuO%aw_ zqnd3?IElUZB0VF!cT?dLif?a#BffO>o~BZC@I1{B{9 zFQ}hauv04&P+e>w=Y+?riIXoK);~Pk+*qElZLN~4zg@4pnWx~1j`9Qto=qX8d?Zq; z^J=*yJ&xazzWhk9O#LWfH{x3{VW`!|3m+csC%^r4etBOrybPMiT$40b`a86OJqAGr zw30_vfk^CJ9r~eU*FoKCmW@*2)(9u&FJPzp3Y~2sNN%1z~ z99-Mc5AHeP66>$6#Z9CFxGzZC&Z@<(`S3i-GqE8;dRJozL`VgF;H|P^?>D+{!@TF#NcAxuwQC8$R+(Y?` zwLD|I#Kzcg^vRnfJHl1Dnh=i;t>LT4mNM+D0bqaa*6%v@G3L?VGEUSbqNZ;K)gp`P zG`gFzR*fi`f4#%Z%fa|$i4U8_47qXf9^RqU@Xd@m z0*9f4E1(Ux3s;8ErXBkcyX(eLm#Mb9yWt@Jc)cd}a&K@N+schFo!P)@2{o=y;>g=L zUaEySu-0q;1KK|ywFT2D21y(gm?21vLzS8j#~|lpa^v{bo25MI#Yt!W`0R6i%tj%L zpB>IOh8S2>U!g&sRxPB8dT?41QjzTQ&^dr3I%sO& zWJ*g73)NJOnt2>vyb@@qEE{tA;6QT4L3^brXY(j5x{TC}P`$PuIRTF{;4`3j0f?qK zZ<#TZ54=}!q`Y!%6h!n+QFZnmYO&v!SR`|1xlb)sXwAfm%8D*LvbYgp_?9+rxg|jtTZgR>3bEQ(lU0vC@w68b_{nU$lJ7X{gC+fOG(xs zQ@-lOJ;1&9^@-HO%M4FcK9Kb7t$Y7zzk=AO#+f#1pJ!~9?`sM~$$U*Tm2&W|N}gI_ z9!beqtQKl#{m814*fs~5Wonq-2U451W^Lhu%q0Fe3No@!(Yj6*^i4l%U9!kNES~0Q ztza(D0AojdnSfh-&y3Hh-nGW)$f3v}B9rl)kc(MG`(CeZ0b4QZCHOP=;VSl6@L*x< zR5$93)1b;t&dO?iShnFdLl7-zwXOTK077psX*+H{fR1gzYFK4xN{!?*v5Zi&PNNV( z=0h{n$HR$o>Wl4NjLG#$#SFY;e3s-X$@Bzr)dK?q0q{z$&jczsKV2lZ2JzWEx@r0K zVZz{ds#5FLo*=@UobjrmM6Tf|8O`dPoaR^NULH}aKf=&$<7=eXPjA=1^J)NdE|aJp zzu&CbUpduWqmFnLsgZzc{*>QUFjMkV5U5rmb-Y59Jc9rnyPA>Tt07yq-rembKPzNw zR3u}436H1?OOmD|6+ZTj6$;NuY3|&3t^-z;QJe4zNFQ&~HusWvfwuLB{{_up_}L_- zlgbZgh24Q~FAgmgMDf$MkYNZPGStN+F-3h+>1iNKTR9Q9XYKbp#F{_g&Xwd6yX`^+N+Rt`KH>wEA7Bfp|s$; zXi}Emdc}_EDVuF&9@Y4o*U$Eqym049WC$Q$F#Z?G7|ZJj#+CYhq;CZ3^=A+e`T5c~ zq_Q*$n&aD|>n1l!s^lc({bD@^>29{2S#?bKDqV_x!R(Y1NG*zwj|ikHPIXLL^=q;IacvIuUuTx)J` zniGan9gt|!)n!V%8&4`fXm=rheAgR&Sj&%YN5?S2QifVdwEQ)VlT{J#+aq|6vX-au zDlq+Hs{Ukh6j_e%wQ!?!i`2u5yb;uxv7Lw)xSEwyA)0g^^6EK}KY41HJW*=ajp)BL z&m4{YZiuaAHOp5*t7<*!4~lW%wJ+Y(7R+4!*d2|dU|Tw@>J{v*2YPt))sWUTR7J=rU!2g!@LIAh~%X6 z;6M})e16xF^6VZl8=raRmeT055lCE?<-yCsAJRejBPzpHx>P*kqH(=_l(b0(#}7JY zyCi*A|RcaAw zf2nr7G-ULO&9Hz1jkLe6eXH7d^85EkN{Ki(-`S(SUEedbQU4m-|M)de%+J!sSG8qQ z{9PS(aJgc;TMRR-2hJ7Oup-uoS!mrQKXhhR!?8{=PWAnr=kdz-hK|&;KiO)3x}LP0 zf_#^%+MJ4~--Rsi3WEE)vL$v63j{Niwp}v<78nF$)9+Gn^s&>0B3(f){#8L~eq4l0 z4?gzQ>8`w$q?c(pIB{0*2VoJv=a&_cm4)M`*gV<0&hSljcqAl$wD~plv4iO0LD@cQ zhP>g6xsR*!TrS#b1}j^RuhOB-Z&`CFKN#mWkB}JEXm8VSigpU-V2ZZ{sdqfV)~Z(` zaruBDiji#I=C%oK3f~VatgxRcv3@tew^D8MMrbAblJd=cCsW$5*SEIpA6~t$9=xS? zRw;e@z1qh#odRweb-LE%oEyi%%k>FF1vf1^4!R`wq%}i1=kdjHzX>n(E+Mt%6X)Ne zfr-OmHLuIWOerF7m_hr@X^XGw9p?X7A2^)Y1l5uIVoFrMY$$*J{T*-imz(ZQ0`b&w zsnzuH5^48{YHh0um8Rg520|}*T17l^B0KQ?s+1~PWP<8rG{g59t<4e3Hj^vY6O&|JADX(wC*u}` zS97xO8?oR_rK!iPiPDSng>PD7wLn_p0)lMoKB`Smsx)8;S%aA(ZvNks+l6E5+PCnqRPuk)`TS17{z&? zIjMC-v-PD;w~JOojo&jJIcxSrw4oj=oy#P((;UKkzE7suj%6*4&(B{DWC*)oy`R=5 znC}&5vq;5%J=n8xewvoZNo6pvKDT?Y1za=E&YD#yUir3Z=X00cXn7bVi9jH{b#!!M z2z3K8XH&U$)+A*7PZ}aa?&6<`_wBvcf<}x>ww%lcHnMbv#G87&&+fsTni_u{_B3ld zVAU6{`%!S;G^xsI*_}|uVkq6KeB)AhJXMC!Mw4l|vZp#|$;2e3f;#Y?qjiaO9K{3K z#tSUxNk&#?sa2In{u@``AL{pA6^+S#Gr%VN{;DUG>fSekP89GPLC#Ijz8z+jmpS{~ z7GrjCuVTdv(!eG^FDzk_YJDqqf&-X6Lke(aw{A#bK>RFmVIKGE2Vc+Kx7O6k~T zB{tsg-rwJzTW2*>QZqbaDPI;zN)@K%l4q{;!|$Cao89U)F7O1a?F%y?$_-4 z_7&ZXDd7G5@glSHMMyhDyfJ8<$`o!8Qz5llraQDPftSV-N+$JwVU_0s^ z{TC*m-!SR{LdyC(69;cqpB=8X(BG~8-&D81v4 zwa1Fm42is(mYsH(rI3t*J=ZvX8XLcg?9eGRE7Z{}ggOn)UA5^I57(ybA ziK@|!_|$G2m1dCE{KKL{duyV~#=qwG`SWn9YRSjR?KV$#*l-n@giUpSl!l0HzmtjB zm?rJGRsWV#?99`OnsFL=#>f?E6DOQQA5$Yqb@q`afwXdh;=!cc^H6i<#BqOgnMzjOlJKAC1R~H$bO(Id5|4zR z(O?2i(}Y|+zXR2U&*!%tnZ9SK^TO_4V{PsS^RZGp#Z#dMQr6bib!lX*82NCH9X<@L z51Vgryw!MlnKiWKcB(&5e_=?*^owEWtzlOkYr%qNnQ;;C8A;fF!T7@=Wvud8=3CDn zvDPmTegRE2{B)wGbbYlE6F*9O!l3JB45YFUX@-3<|Nd}(rV%e+@(~AvReF=J zC6_)%SIQ?Z)!tsu{1lA%wbOZ4`@7T~^PZJZUMOw8Xp=UFJxuS=$aUmteaBj!y)|Eh z-_Figczj0T)f9hY^QQ0JR;3@>8libb15ISM-HCfp$GcxG7uDX9Q4x=^x&9W&qf5n8 zOldM=+mYVinsoGr{60%azc-c@sHB$78{0gwS@b0$IfyDAg@H&+D; zThiqC*TK3nK?=vQKIvVe%ZD$Cv0{q3+=TWbs+9*eh!t+B-Jr4`b+JW{z~A1sL}~qL zCHz8$Z`s%H<^7WcC(jxKB7Y4lTGX=grp%i5vn1|OTeRk?OoW9Xb303~Xpb4uLh>e_ z!$Gef`_wKe)vP@iaP#5{AWE{NBV5$G;N%Tt7PWa57U@9uMmVTVNnMB72RUtON=E{8 zO%Bl?DS!W7KbBb2o47KRiMS_^~`xD?HuzhfCmN^`d3mHe|Uh zb8}0AtMH$f-nFIp4mGFxMlF;}iG2wRFw2iu8hEyQq^%#NT}{uY()EyhMc6Gp`5a~y z@t;fIy`sHsHjCe@S9`-GvG{Feb|0}|-kZV_pQ2aev>l<j+BgI_M}rDh1yq?di4MDBWZ$7O~BS6>@y_ zJN7b8rkeH2OWyIN=m>~e?)b21cynhHyUg8U=I620^2VnGP9W)4uQOV5T6DCc^mk*w zfmOU>U!HC1L@20-CuljSQCKK*<$S44AgF0WOZB#s^^FWgxTA)QgPb2!4<#LGo2Ogs zOVQ#Kv$T17iRHEIU0yvDIzPmyD;y%{bovUfLPdS_Rq5pVoKqdEK)e+quG-(b(VMUD z&qTR^7jX}~s;2oBBdvS@wjU8oBZ0VYOSzJ|r)Q<3c>Fp-<;q!HB5Zj*nrQ|*zlQn4 z*mmipjG@h`=co%x;)2VGQe@#CYHB_)%Tg!jW?wFDw<4L&7QvMz_gySTVOhKVwg07p z^jTN`=B%$r(ft=~B9eL9H(8km>xj+%Yk0}fUPRE<`@cGf*%OqyvUYbdXZ@(Yx^nj) zP^nLKk#=;vM1B@>)if-8FVD6^yE&a*RdN*DI;~ewSks$o*51NeLJ zTW@r{LgA7v>pbfdXPd*#dw^-ow;5OXvAx;z zYd=n=zlGzIDg#=k1_}Bt&>Sp|Xm1R5Wrt_CY;61lB~EtF2X{P_n>08de{_v$_&C)2 z23!5y4?VtOEYCD4YPc%bP*5i<8UE_b4}HuTc3YZ?Md&-YfGf~rvcN!e!q9xOPc<^Z z`I*jw`CNf1G3TSLgMXm)OXiKEtMjuMu92^7uIC1SnssWI)=y+Ry|mkZgCYgC_I$hh zOMMYG4rXWDRhxkTk(s!-f+DlC@v6-r0DnO6TbA1)D!iE+F0|eSKsC{$VK^1p3=2F#yZX%#0Q(G1^z`@4vzOe#{R=rqIwErf+|`?50F_{Z1_!?6ps`C=k#dYO z*vyj7-s2BdN_A(#dL6&48u_V*JtoCDHx2k$R2iQQ?e}#5>GV| z#P#=mjf$@*{N8EmvJL+8dV{Kx<+*%Zp;MN>KxJ@gaJc~4z!lxCEnkB$z!a}HCOqSV z_SMDOX@d%fyZu(QF(1p5$@dX85{De0Chh+gWHeBWwC;L^pCswo^)AA%f9y9*dX1+N2B*hVLLAw(zqEunk_iY&P zs;rY9ntgvO$&uUJ0~|E58ctKjAT?G`?v0)v#mOzReiRBzci7I)RxyI7hP&HnX)q@x z@rI4V^xO3)Oywf8r|YWet3BF|9u4- zqZxec*OMgwPL1s101grVs(+Ia{h98l_ODC(qQk#JUo5NehzFmQ#K<5%Fq1WtCX@t1EhY`z;bQ>w+}R!u-+x3TYMd`~eHPJ_3(x<5? zzlR$eTN9cLjk>4e(r>yKrG9)yo&L*fDx`O0u>Q~_OtC?8hC{XniHX4c%n850%*<;S&B$Utl}A55N0ME|BDb&&DxYG|$8y*S*$FDX%3I=MM9Z;?~u(r{}lh zsxDNA$zu&Y=}0I(eY#dPM-yTsOiMTuuI7hDu!A6 z*Zq@A(+nMd(a zIXIgVydgBnq60SgPdwghv}k)ZbRrw8FQ~xTVjC?WR7ThzZ5N6|0wpqKc z{KBE8+R#=o%k})}6p$Qi&U_61EBx-GvHYSFp2~Z<0AE~cx~GF~iA4GH(>=09Wuw0& z)Y0Xp%0u5^ldbLONj1qcZc-9s{b*wJ_8Vd31wkz^p0hwgmV+PZ*@lQ))H_0W5d7R$ z`CL!w^Gu`^sR>A+$ZxWk=5AGnB*9(&3kU&r3a9Un zst!|6Y?cK)t6q>i@AmFSh@(o!A63oKHz34iDV#kzU+MaS#@1X#O#Yj(3EcFO zIO+vRx)zci`4l5$%7h;ur zOvX;v8=9?n$x_Nkz*_3w1A~HSn`kYHqUb(crMq$y4ahToaG-B_*5fH( zwrs(IEa>A0ybEl5Q+IpQsUsfUy25T63@d9Z>rtJ9#0I#ZS=z-ftZVmBYm~m||D~_i zy<~+c><(=6KPfyy#Db~~V>EWT8UM@##1HulJG1y(q5q6YW zSfJv$K^f)aFQ^*shZ-y@?f@rLuc|7>AOO2qaKxjdp?1etsAh^zR7WTtC{W6U>oeKJ z+G>%-y10;keY56^8KLr1N5$c#lli4Fx+B9s6IwdPl`tt(Z)^Yj1B(OynUwN_f3N{m zO3vO|XY8j>Nz>z;)L#{crwpZEQ%VP_nX@bHfYvQpV&!p_y_3EX3Al=8ee{e)+Y`M2 z034g*)vUs4enxNb(W6`jPUWy~Nbn}nB8v^<*)C%dzM=WP&9Vmg4pIL6FHSU9tHB#@Q0e z#_u-fwN5T#Zaao95yb*2MvJ?ISK2NP7~JM8fv2zpTSuOBAG4eJ2P5E zR>Mnu{Z&|UrJ`c{G=eu)ybVWwka#e8@huZ5&6Egrki~6%Bq0aKa=s%XPfhW5w_j;Z z78=`QA(1g4QdD66-jmCY(H^!_v!gh>$iHvm>AxI<+0t)7fmmKG#;{gT=dKOD*0SWC zD~`uQ-CD}qo65dq&WCGnE6e@d!+Cpts{yX6aiojC=)B*9nWD`+nkxcr(asLa-itrYQPgmuyce# zjlt=v6M(ymS&8;Q%52TAIeo)Ism6y#VvB-$YQPvM)*{=-2GIfH-;E%X0=yE`Wy7Ph zvttn3cvi1%_XGyD`YKiv1=lt}XUAC!zfcK8V4AsHN-`2oVeUGVxPiPbU%@AJq6u$w z)bXycEbRzuxzf8W@a$Eq5{M(vgEh&t`B>x9A`peszAA7T1VF9NMKniR5C*x1om3ip z8;`~&iN_gzyp_@}76H`D*cVP>_~Zj|qZrCpqgaf`6oHbOTPY7c?hD_fEkQDDOn$WJ zR*%K@bdg*-O%pK-en6E*C&P#-1+4DdGp-^zse48IOx-;Lx>oF=oZjtA&Q87)*<#}- z@{;S*=#F`DdFgOWE=bYluwUd$Ft&L|%5c^jdf}=~FAKB0gP1x<+;3UnV>i&1tCy%IB=l@?0ze@B(OeB&gNYGlP!$+p5J?RI#gJL_7RYtK zqkt^h)-A14nXRI6>1lb)Ia(5q904da-h{m9?(ybv3Bc9t5_0q&JB;}Cv~V)Ot+OfJ zW>M}w$)XQX$v||7Ax)#kJc+2Q>kY2?*2(^W3Ih61LH>?Tir--N9aWEsjnce~NPy-jAlIg)W!K5S)*T+sfb5uVBoBMG%qSFIVbLjwlZlG5dw!p(6|BT^JsLjT>{D2$YUu~-@9Sy!S)6Hgx5{LgAbNv|De+^< z*|>!Gc)cEW`;U>o^tka@^Ud85B~X&)kNb4>Y3>EjOZZ$a7rE>FXUP7_?M@$346+9> z_l*Vm2eaR3wW+sq|ALJ1DAOK&YVkcNlnxX)?=&pWC{ULRh(nEO?Qb{_=YB@Aq&%}WvET{Ma z|D}HB?yUx?b&X)llXgN|`D5Gmwt4mITuv6LtB>bFmmNd2{tbt&H$%1ALeh)Ot?hMT z(29wgwO642y$OGs0qAddx_M_*m)rxMZ+#CYuw(~S`q@Q4c)qT>CLM`4W5Ell=n5QL zSPrHva&963FZ%Irg$yicpU7>?(Z_VL`hxN=2%GmEmN%jvGx|P~Q`;A7w5{ z>z$CJfD%vgKlede$t33r>d;~>wn$b`8``>_f? zX`AR@P0CSDq#t`dYHu@6u@OxPa&+aFaY=cum)yb>Ki8UV`sBeufHi3@e>E%{FtV2x z0hgd*l92Lf-WNcKgel<=bwjP7u0Gb%K;m}g?;hZ_x>cwJ7B%9uHt)UehAd4*$I!CWkM;8xC>7zQH_+b?{vvNDEF zvbC@ax>;o7e6u5K_o+nsiSYh~*mt26Ih9#JZGRP!Zho6*d^@R&LP;sqCgd#|Z+c(~ z|FLHmr_ZSRbzdgrTGv83WAA;qz~ap+D?MFSYECw@N2~t0oRX?oA2_UNT{@J|yY(F2 z&2HU+lpu_yOZJQlYB$aA?q+|u(#!S8?0K(P7#1#_!sWe~JP84gy(ut8PM5UAVBToE z%g}&_zZ~>{>S&FnC8!2Eupab&9d!hvCJ%X?uNzZ6;L&dE|IKz#S~te9lH0%|ugs{w z{()4CpF{5xn30yqr+x{^MzPk+=dhrm`%T9&$yuMK=U}6el%8+P&yJeUe<2Oq>>QU{ zr7zDms(;LnAuB9zrE{bo!a`TMn$sJ}s)9TVE<0p(_!W7=BFcy5oBTf#- zT}I~@g{_9;R^#)ctOK|n)~{WyBza*UBS7B?dBwTtQ1@_Uyd)p-i^6>)@4Nz)u(uc> z6*wLm%E|&;{Pm~Fr3S`33lxH1Vt{Z^hx^g-QGNkD3>-L-1PB`q#w`oF4>McCBY@Fy zfhgfC82HWTcL!d3|1VDf)*l8FURXLdKFU?lhob@Dh_QS@qpC^IEA7iV+P{yZwP)l+CdRBOizCQbxT>Jh0M5V+` zm?;!cB%BzJ+5ZvaYvxEjUEPe%Mcx6{5!e$MSK+ZgCqGA9+mwkEn*;r*t96;QuNM=( zIa}sgK2$n`wp>+AJC2)=+1y)dX(Nk-8SSqRyTPZPVCy6G9E+B&eJp1v>c=6iQ#J?F z%g7t3RGS4VkTaErie7$3Hk#}*c_7Lrj*K*FvCo7nOoubH*)Ba@=j;pig)7n*OXuw8 zni{DOrpYaSj?ow*V5Z+RkQ$|;Ef4i+gGVomq5IQ8$LrEcaqSyDOD!}DEUh}e1(XXC zdrOPVnOj=zKFg)XF_fx@^=^V9)&#*#N_5a)c~~?^Rsx%|?C^_9rOSRO3sd|^C*|l4 zbU{Y;IK1}+M-VI|74L}+n|?+Sj#5|!c3oj>^R)yr+$pTU#T*VRW?NuLcNAehQ%Gvj zvFwIXF!!;Pd5hE53IWvz!g7;HN+!=S`eC~7-NALMM!v zgm4_=t+v7`1q_^U$mvzJf-Kg7#qZTeGy`44Tq>~$NU5Kw{=|xjzE{4)kR!j21%ePx zn0bx{CNWt*{zK8lk<)Du6vB_~SlPd~q9)}K9EhL~-ZWxzm7Bmh9;9!jOjJ_o3lmUc zV^9*2nrQZ9jQ$dKszD~~`B)MvcNHOG<0Roy^ihriW$603mm%mW;-Z3?A?zt2m5DLnlgI|eDc%MU_+l2*j6Z@uwIslC`0*kJgw)F00AyU3u#ISBt-(A0K4 z&hPGDejNNAJ8z6t%3GzSMOq|&Ik`JIUmyIuy*#pLH}U>49#&KA{lUP$SSp>X|t0kjQf`454AX@cK zN3&W#gNMNeXT`uP{y#n-K3-wbfAInRaqBN15bSp;E+!nK689GPrzZsmG>(mH|L@cq z#2|Ds)Om7?c|6lh#G8qfl&q2pr=&-N=`P=PK6Jd$L4(Wa6bqG9;@9A_Q@tTbm0xtd zpK$BmV;-t?MTTu4xZ%OH91bUMIU)G2+u4zFjUHBGLe?Do#N_S7Z?r-gg%^{R58~qO z8lu=XhsDiHi0Jj~>^!#pRv)WD;>~L70-6{F-J#Q~FFv#C@$S_=J^xA32=?T}YboJj zxcZH*oEM0-#&rat{P4Or&}L;%=#q`4SBV8hHjH0iYr21%SRx!(+Hk)0{*YC~apX|i z+M>jbvBUwaNHco)u!4d!_khC$(^LVnl0KvvqZTsz_p4faEBp@^TnD%;179mA z9CH4A_XqH>C?~XH0dr|@LG&~!ib#lwbE{We&v3nZB8!8)>uf=)?9LK7J(YDS7>)5oIaO9k&%KwAKGfJq+DQBr)W_L2kA6Fqh+TGyUWU^; z5I$qQ^z(3xG39R5(Uz`^TmWOQQcP$XCS<)s#pQjUXRUN?X!^J*U%|cnq=FVNjBWR- z&CaV;b)T6L8MRUbbB@1<*36ZhiU?7DRvTKM`SfaUiTYsiNtKVQZH#g6t8YaeTTT+l6C6xQ{!>lkDuN-*=-DxlbdIEV+)(EJL^zPfin8Ixo_MR1q>Xg_gROH zbf$`PN7b6by#(3HYvR#tWrte^Pl=lIu$>($B`R180nN^Q$7}1O*6>uddNm~@ z@|G*;SARhxETcPA;8y<_gpLnK4+o)P6ar;HOlXTRClk;)jBg8f0+ybI^Y#y8BQGx> zA3v17s6B=W|(CPjvg#P0gt%e3WQo<45nRT#?MHsp;DT% z2vb1R5R3n;d=Kg-7;SA@X-Mf>vZ5WaL4MckXn!_R>EOGf7-*$#opzM(fNq(iU+3M?{nJDK-96OC?=}`$IW$Ly|*$gXA&0YkgGgr!zYokTi}+ zcFuXp#kLG3vuB4zY*J($oZ-+IXDhd|5T%+c);JVlaZc`?;bhH|T zFYukkCbS)%J_(M|Kj9u2Yug(&AG$$zEu*GZ*J_9E<(Lm4(XB241lrdyNxHHtQ$Tnf z(1IN=MN*(l)a;K{r!3GY_q)vy5O|m4lopHcH<|%r>g3mpT`QT*EQYXwDF9}>aR>)8 z>txy0@b9dT$^3)WzDt?^K%bMfR0<;B=jC7(H3!Caugq-TPlp8#};(XgA4WSFnp~eMpu=^yYd7U3s zOjH~Zt+7UNVC%vN(ZYJaq=|MwG?m7z#D$Fsnm(G5tw8*l<@FH6&IP@NE}R@!l)3Qq zxOdk+)o^QMm=q3q&IiqZ2zukUVsy7qR~NMxP4k-E$Ju86JRAk%R4uIMdA2~q zwe#wQJbE7h_mKXWnW(YAx^KN!2|Z+GMf!dk!p(V^#($#Xhsb+T5)Cf{V6be_5iK3^ zwBklj+Fmb9L?jsWd&F!)JYgY>>Jz0kfnl=qxVBdo+YH+Q9NGlGae5g>XnMOM;%?wl zoyBQ0m8u#^N9OVDja!v=`ndXRF~W8-Gfj81TAOp5cbcxYFaQltKd$Qp9~<*jlKRP- zIoeA3>YJyGK+n&GGHbnZme^W))#$iZzf5d0iFH(VE8?BX@%D7Z6fb=rWxAS@ zZ6~gglx%*j#v+(tNv3B;eI2)C3s>KAylhaWK7a~~z4ET}umr!cZCO>#>tQ0ey$H@) z;`ATx{ho07!kckXS0}nS2-T~UXW2Y?P05qoAYEx zIBqHa3y0UJZe|Ha6pur9S0bEYGJzlrOg;fVety`;_c&Crk$9Brm9Q7|6CHMB2f~Jp z2!V)Uv`Ki(sHFh_0Mk+jiNm2uc!5AzhcFH^R7gOOSAh31|NrAgQ;jr(Z_1(mXu;|B z{FuRbja&NE?HkRa;`U??ut?7HW=tLxi= zD0RQSd4CVPe9@s*;$DN_q(eIxxmUy3=MOh|hke^-)1FOb+VHF1hzI%^XcA`6d0P>I zq^VvwO-1{wcJ&u0$}vF4hLOf|8lj&Zl$}*cPE-X_lZoN={VYw%ncIA{Dudga{OtBp zLIe8+z=-q@wyVup33jM8UifRrd)%nF_1E#Pxbj<243KmS++g;OhGj>%PJin+E)pSZ z!-8PYGtAJcfod2~h4hAqN9Q|HZIc{;%}dHgRIG+gEHtu7qREo^{pq!L<$KJlWYO!K z75>bohem>wr?<5#w!Mccb7yBYf<9CedlEtr+gyvzj~v5%S{&l=)-P9c9~FPz-W$qk zi%yF66fO2Lf15M1<)C6uVrtPw%0A}Q0k)JFn}fD6ZLl;+C}Y@Nyd6PN z;Sl@MeTc-?$$)1LeZ@drB-ya~4rth-fQGM3C?fLFlxL+$HRe&Jy98IAS(G4OnZ6y` z>&rm=s58SopVBE%J%D2>Hu6JK#`$g?fNv@`y0Co8BJTd~rXhg2(qN$Asm8VBXgeYp zO7ZuEcb1q48rV49d%wWiJ9+o)v`c=)KgT(TId;z8qS!HL|04|ap9$i06 zmqHwM`IAOUNiJ!XfnBAhG%P~%MdpBC7EWY=5#}a^K+hfWK%qNv4zdQ9rw6BLPhVpZ zci{&-zmMLI1}Ymw_vx~kz7MtFwl@2sVk)Pi)ch`9iiw+;qx7UwXIgg~Ql;n$->82{ zw9Oma9d3JZFs7ng<25}6G;3xzL#6ngUyP0JkyjKLE$q+M0muo3_R(K^YW%7W4GAJ> z29RX&wU>3SnALCtf-Y)#Yz;(aia=(o{M)GX{)gFn?ttLKU>+X>5$McEkXe)^4qb;QPB{{p)w}H4^bg8kDPu9RvE_bO#|hPH% zqZiuHZezws_H%W9W=bqAUMnY^NG<^brEpBygrC}amP|T&+o7bySPIUHU7AG7OlQK& zW^C~>Pq?O`{XH#tUV-A%8_y~bauAsawYmr_HfH)G%8{0>k(Pq>S0z>&A+q>i`oHvN z6fZH_pS1}b50Ia4V|+zTm&%{hY?X!!EX0#GT`#s-WFo(rh=lFicv6uGIVC3xE zaRvY&(?U5E7d{iNm2BNpOM9%7k|KRnka#KR;xcP*A;gv9_WC~E_kkt z)hys?+di(VpG57=SQx|i4wlXDVzlJ4;9a$|Bu%h;&P1ryqY@zM<<^C(e{!DkTp2os}qDNZ7 z8#Gl4M_`dH)71EfH^ms-CO<-NI>S0cDA3`Q_u<&#XTB7G9_#=rk5GEu87mKQ;n@m3 z%g)6p)J6^y8p@GXTrnKIog%=4DUcbE#kZs9#vLmBwKp1aVd6O`C{_k*#&Y!xiq#q{ z!XmpH^4J&f#im4)SY~EM!L>iru5c!WdoGI`UDX`fDr4 z&!awv(qb~|^WtRUp9I4*R8}v9!g`745-k|n?_=WRJT7?sj7IRmxJJcQyhGp^8Z;?( z+gT23!##A$vu$3LR7if0i;gJQe2^FFb|1S;WZscYQSD;zhd`R@2Z1JfkP~;;NNk#U zEYX0p&W&P!scdg3jOyOemUjz6@NEYUtB8PXfD)cB*6X<0W{XE#wtZ|F$$KKdd$bQ@ zg~G1*p7V`7^qRbOYA{gC8|{8>tPjnkR3wd@SW0*sjeD;vfHzZeK+eHp;H0NRX_3-) zh`5G;y63#0e;bdoqQEryQ^ag;_jQ}KOc?f#K_nvtM6lajj7H%v)18Ep72^S(0qo*bjHiRz~VXCv4plh;+z=(E^q57O?Uw%br#E-JXHm%fRln#ZQha7+(a>Dy)#&#d zx4{{-u1hNHTO9548ef>V@$FE)X{^+Wy4Tf8bKRB0<2{exPX?Ai!$Em;+wh3|>-2|h zxhxI`Cd`srDpR)mdaR2`4LI}eruTli;FFu?{p3q=4*nY9gV>TGGoBKS;j~P9RUNQH za3r*vtf5?N`YM}y3}Wk<>Q6ltx;E|a2Zx<1>Ob-QDZ9^l9GEVRbX`WAr&~+g`!}h3 zLv8Pw7F+iAk;KmyBgK+`A3F+nzatF^VKGUHV=W?hmy!^#?aXo9Z*j)+k-qZ@F`j7% z@Ka+uuCV5&Dya|G8`gD5dzh?BvCn}cAsBt`$}rAbZHozH0S0#Z3D7x zw`blzi0Sa!ZT|mB$NwJafc{6M;~&srns{j4?6SPudfDmaArwyM#gm+|-O!BzcB2zvH1I%z6 z_Cq=?@F4Vj`(UYacJsLN>v3oA@$9I--&l##>}E6c QKLj28|4KTL|2^sWFS9ZxDgXcg diff --git a/Hazelnupp/DataType.h b/Hazelnupp/DataType.h index b045ee4..2ed4970 100644 --- a/Hazelnupp/DataType.h +++ b/Hazelnupp/DataType.h @@ -1,4 +1,5 @@ #pragma once +#include namespace Hazelnp { @@ -12,4 +13,27 @@ namespace Hazelnp STRING, LIST }; + + static inline std::string DataTypeToString(DATA_TYPE type) + { + switch (type) + { + case DATA_TYPE::VOID: + return "VOID"; + + case DATA_TYPE::INT: + return "INT"; + + case DATA_TYPE::FLOAT: + return "FLOAT"; + + case DATA_TYPE::STRING: + return "STRING"; + + case DATA_TYPE::LIST: + return "LIST"; + } + + return ""; + } } diff --git a/Hazelnupp/Hazelnupp.cpp b/Hazelnupp/Hazelnupp.cpp index 195555a..1e09648 100644 --- a/Hazelnupp/Hazelnupp.cpp +++ b/Hazelnupp/Hazelnupp.cpp @@ -60,12 +60,15 @@ void Hazelnupp::Parse(const int argc, const char* const* argv) // Apply constraints such as default values, and required parameters. // Types have already been enforced. - ApplyConstraints(); + // Dont apply constraints when we are just printind the param docs + if ((!catchHelp) || (!HasParam("--help"))) + ApplyConstraints(); } catch (const HazelnuppConstraintTypeMissmatch& hctm) { if (crashOnFail) { + std::cout << GenerateDocumentation() << std::endl; std::cerr << "Fatal error: Command-line parameter value-type mismatch at \"" << hctm.What() << "\"!"; quick_exit(-1009); } @@ -76,6 +79,7 @@ void Hazelnupp::Parse(const int argc, const char* const* argv) { if (crashOnFail) { + std::cout << GenerateDocumentation() << std::endl; std::cerr << "Fatal error: Missing required command-line parameter \"" << hctm.What() << "\"!"; quick_exit(-1010); } @@ -83,6 +87,13 @@ void Hazelnupp::Parse(const int argc, const char* const* argv) throw hctm; // yeet } + // Catch --help parameter + if ((catchHelp) && (HasParam("--help"))) + { + std::cout << GenerateDocumentation() << std::endl; + quick_exit(0); + } + return; } @@ -281,6 +292,162 @@ bool Hazelnupp::GetCrashOnFail() const return crashOnFail; } +void Hazelnupp::SetCatchHelp(bool catchHelp) +{ + this->catchHelp = catchHelp; + return; +} + +bool Hazelnupp::GetCatchHelp() const +{ + return catchHelp; +} + +void Hazelnupp::SetBriefDescription(const std::string& description) +{ + briefDescription = description; + return; +} + +const std::string& Hazelnupp::GetBriefDescription() +{ + return briefDescription; +} + +void Hazelnp::Hazelnupp::RegisterDescription(const std::string& parameter, const std::string& description) +{ + parameterDescriptions[parameter] = description; + return; +} + +const std::string Hazelnp::Hazelnupp::GetDescription(const std::string& parameter) const +{ + // Do we already have a description for this parameter? + const auto par = parameterDescriptions.find(parameter); + if (par == parameterDescriptions.end()) + // No? Then return "" + return ""; + + // We do? Then return it + return par->second; +} + +void Hazelnp::Hazelnupp::ClearDescription(const std::string& parameter) +{ + // This will just do nothing if the entry does not exist + parameterDescriptions.erase(parameter); + return; +} + +std::string Hazelnupp::GenerateDocumentation() const +{ + std::stringstream ss; + + // Add brief, if available + if (briefDescription.length() > 0) + ss << briefDescription << std::endl; + + // Collect parameter information + struct ParamDocEntry + { + std::string abbreviation; + std::string description; + std::string type; + bool required = false; + bool typeIsForced = false; + std::string defaultVal; + }; + std::unordered_map paramInfos; + + // Collect descriptions + for (const auto& it : parameterDescriptions) + { + // Do we already have that param in the paramInfo set? + if (paramInfos.find(it.first) == paramInfos.end()) + // No? Create it. + paramInfos[it.first] = ParamDocEntry(); + + paramInfos[it.first].description = it.second; + } + + // Collect abbreviations + // first value is abbreviation, second is long form + for (const auto& it : abbreviations) + { + // Do we already have that param in the paramInfo set? + if (paramInfos.find(it.second) == paramInfos.end()) + // No? Create it. + paramInfos[it.second] = ParamDocEntry(); + + paramInfos[it.second].abbreviation = it.first; + } + + // Collect constraints + for (const auto& it : constraints) + { + // Do we already have that param in the paramInfo set? + if (paramInfos.find(it.first) == paramInfos.end()) + // No? Create it. + paramInfos[it.first] = ParamDocEntry(); + + ParamDocEntry& cached = paramInfos[it.first]; + cached.required = it.second.required; + cached.typeIsForced = it.second.constrainType; + cached.type = DataTypeToString(it.second.wantedType); + + std::stringstream defaultValueSs; + for (const std::string& s : it.second.defaultValue) + { + defaultValueSs << '\'' << s << '\''; + + // Add a space if we are not at the last entry + if ((void*)&s != (void*)&it.second.defaultValue.back()) + defaultValueSs << " "; + } + cached.defaultVal = defaultValueSs.str(); + } + + // Now generate the documentatino body + if (paramInfos.size() > 0) + { + ss << std::endl + << "==== AVAILABLE PARAMETERS ====" + << std::endl << std::endl; + + for (const auto& it : paramInfos) + { + const ParamDocEntry& pde = it.second; + + // Put name + ss << it.first << " "; + + // Put abbreviation + if (pde.abbreviation.length() > 0) + ss << pde.abbreviation << " "; + + // Put type + if (pde.typeIsForced) + ss << pde.type << " "; + + // Put default value + if (pde.defaultVal.length() > 0) + ss << "default=[" << pde.defaultVal << "] "; + + // Put required tag, but only if no default value + if ((pde.required) && (pde.defaultVal.length() == 0)) + ss << "[[REQUIRED]] "; + + // Put brief description + if (pde.description.length() > 0) + ss << pde.description; + + ss << std::endl << std::endl; + } + } + + return ss.str(); +} + void Hazelnupp::ApplyConstraints() { // Enforce required parameters / default values diff --git a/Hazelnupp/Hazelnupp.h b/Hazelnupp/Hazelnupp.h index 47f6f84..96e2dc6 100644 --- a/Hazelnupp/Hazelnupp.h +++ b/Hazelnupp/Hazelnupp.h @@ -54,6 +54,32 @@ namespace Hazelnp //! Gets whether the application crashes on an exception whilst parsing, and prints to stderr. bool GetCrashOnFail() const; + //! Sets whether the Hazelnupp should automatically catch the --help parameter, print the parameter documentation to stdout, and exit or not. + void SetCatchHelp(bool catchHelp); + + //! Retruns whether the Hazelnupp should automatically catch the --help parameter, print the parameter documentation to stdout, and exit or not. + bool GetCatchHelp() const; + + //! Sets a brief description of the application to be automatically added to the documentation. + void SetBriefDescription(const std::string& description); + + //! Returns the brief description of the application to be automatically added to the documentation. + const std::string& GetBriefDescription(); + + //! Willl register a short description for a parameter. + //! Will overwrite existing descriptions for that parameter. + void RegisterDescription(const std::string& parameter, const std::string& description); + + //! Will return a short description for a parameter, if it exists. + //! Empty string if it does not exist. + const std::string GetDescription(const std::string& parameter) const; + + //! Will delete the description of a parameter if it exists. + void ClearDescription(const std::string& parameter); + + //! Will generate a text-based documentation suited to show the user, for example on --help. + std::string GenerateDocumentation() const; + private: //! Will translate the c-like args to an std::vector void PopulateRawArgs(const int argc, const char* const* argv); @@ -76,14 +102,24 @@ namespace Hazelnp std::string executableName; //! The path of the executable. Always argv[0] std::unordered_map parameters; - // These are abbreviations. Like, -f for --force. + //! These are abbreviations. Like, -f for --force. std::unordered_map abbreviations; - // Parameter constraints, mapped to keys + //! Parameter constraints, mapped to keys std::unordered_map constraints; + //! Raw argv std::vector rawArgs; + //! Short descriptions for parameters + std::unordered_map parameterDescriptions; + + //! A brief description of the application to be added to the generated documentation. Optional. + std::string briefDescription; + + //! If set to true, Hazelnupp will automatically catch the --help parameter, print the parameter documentation to stdout and exit. + bool catchHelp = true; + //! If set to true, Hazelnupp will crash the application with output to stderr when an exception is thrown whilst parsing. bool crashOnFail = true; }; diff --git a/Hazelnupp/Hazelnupp.vcxproj b/Hazelnupp/Hazelnupp.vcxproj index 2cb5ad0..88ae8dc 100644 --- a/Hazelnupp/Hazelnupp.vcxproj +++ b/Hazelnupp/Hazelnupp.vcxproj @@ -27,26 +27,26 @@ - StaticLibrary + Application true v142 Unicode - StaticLibrary + Application false v142 true Unicode - StaticLibrary + Application true v142 Unicode - StaticLibrary + Application false v142 true