From 16f0bda2522cedaebbe3d6b52830baaac2ca61d3 Mon Sep 17 00:00:00 2001 From: hshrivas Date: Sun, 20 Nov 2016 14:35:39 -0500 Subject: [PATCH] Initial attempt at file system assignment --- apps/future_cons.c | 4 +- apps/future_prod.c | 1 + compile/xinu | Bin 187240 -> 0 bytes compile/xinu.bin | Bin 98304 -> 0 bytes compile/xinu.boot | Bin 98368 -> 0 bytes config/Configuration | 142 +++ config/Configuration.arm-bbb | 4 +- config/config | Bin 39485 -> 0 bytes config/lex.yy.c | 1917 ------------------------------ config/y.tab.c | 2169 ---------------------------------- device/tty/.ttyread.c.swp | Bin 0 -> 12288 bytes include/conf.h | 44 +- include/fs.h | 97 ++ include/shprototypes.h | 3 + shell/shell.c | 1 + shell/xsh_fstest.c | 135 +++ shell/xsh_prodcons.c | 21 +- system/bs.c | 89 ++ system/conf.c | 127 +- system/fs.c | 521 ++++++++ 20 files changed, 1045 insertions(+), 4230 deletions(-) delete mode 100755 compile/xinu delete mode 100755 compile/xinu.bin delete mode 100644 compile/xinu.boot create mode 100644 device/tty/.ttyread.c.swp create mode 100644 include/fs.h create mode 100644 shell/xsh_fstest.c create mode 100755 system/bs.c create mode 100755 system/fs.c diff --git a/apps/future_cons.c b/apps/future_cons.c index 230609e..f075090 100644 --- a/apps/future_cons.c +++ b/apps/future_cons.c @@ -5,9 +5,9 @@ uint future_cons(future *fut) { int status; status = future_get(fut, &i); if (status < 1) { - printf("future_get failed\n"); + // printf("future_get failed\n"); return -1; } - printf("it produced %d\n", i); + printf("it consumed %d\n", i); return OK; } diff --git a/apps/future_prod.c b/apps/future_prod.c index fd82580..51422bb 100644 --- a/apps/future_prod.c +++ b/apps/future_prod.c @@ -6,6 +6,7 @@ uint future_prod(future *fut) { for (i=0; i<1000; i++) { j += i; } + printf("it produced %d",j); future_set(fut, &j); return OK; } diff --git a/compile/xinu b/compile/xinu deleted file mode 100755 index f9dfc00390f209179d8d3edf7114305156546f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187240 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 diff --git a/compile/xinu.bin b/compile/xinu.bin deleted file mode 100755 index 6a5c380d1f760057d11ca4789d701b2d3899d4ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 zcmdSCdzf5RmG{3-UDBOOlT^|j4Na6v(t!v8D-t1Klf2boi977e0lO0l1VoSTw_+}oNU+3-yS}E zO5J%W|MW#m{QkDJ?(8eeo+;M(&eC?jq2p^oXDhG@1%FFj%ANB3HQv8gc%Lu(og2yT zFZgxF45bQR3vNrLT*oZ;O=r2$>6{4Km-tiP-8*I6dwZuCv%*Unv)-6Bu9NSnG*Iq0 zhYvT8Xm?%Nb9St&RNJdBxeqU%;QwRmyF$FaytV9k?<@OT#+Tfi+w1*x?d?(iKbF1B zVt%b{uHa8IeZk*PY^@{;ofXFv=zGymnetcu?uSb%69<-53OhHr4W%31+3!mEo7xun z+vxK+bA?+rYu%hv_Bx#s|4XhZK!etHzrL^~aLfw7-Iz>*=L%z*|efliaJP)VpPdC!&A-z}iZ_xVDliJQ$?FIc-*Ye}ZlrPp5QaB8In3 z@CI&lzx(F0w`9iUZa2R~?jpB7cli`2S58iV-i%G-Y-4Uu4lJ&WGb{Zj(h2ezzvc<% zGB0b)19}>l@dF3P{Dn_?Z$0BX!7TGKX8D(-{c-K?8xScapm$qI{JHWdAEj6%G$+DMn3huf*GzVAoh})F!56%Ej z;g|;2Ni{GJwOZUuWiQczuIMa#CyavMY~dg3`qr~!!Jk{`59;$}uP#^i#%0Ui{F=5V z*tS&nC3KZ3Lnqov&`z?19ue&RvUmK%i~Zw2T|Oh(aZ@GP@jZC5?A@Fc{X6_O!Bgt* zoHL_7ne67^#M$-!!5QcI8)xovcV1BTb}d@tu0bblZd&6WiS9knUA(+`;!bxLb#_wc z^YhoZ!{c*DI6jhxxGg8w3;$}Yuk+DojTvJeO#{Qp_g0+TvdTeZan4B*f17-FFdn>r zxP(3xT>l!%)t^1y^33MI$#sXY<}@@E_l!kuBHx8vm;HN9mv?XHF0a1W6Et-6 z1md$3bGvx{ILPXW%pV6W#^o8~M%8U~7g$(Mw%eUpy0PNWX3|_FU7K-o|3#Z#Snm(Q z^9;*ptEs!{o$k0&k8AR-pUdAEOo7%d=EgvJeQy4{!MES?U2n%3-}Ub0_s{2K{LDE8 z-{jW@a|X5tE&0AmgV*Dx+*>Ls^awcJ?&OzL(%G^%F$ZpD%7K)b5zNW=1x|i3^Vo7< z?KkW!d)a}jDh)++rhAK<8Yugz{CSmBIUTfQ&x1Dn&&`6?%e|L{Z;p51W1tQ5g=ex~ z*lM!fTT|})HW|~sHkDgcaq`P6zo+c2XC!?yuiamePY27XvoJq9sP?x?XK;qL8lx*1 zBk2l_<7&}4fSx;=fgD2(&{3)}#D~Xf3D<|d+<5c#0vzvnK89TjR z_(t`l5A@7RpV;;aW^-_ZF_kK;d7B5-9=1XzlxbV89lYQ#za6}?=nBEuo-hYzrp!V8 zk99|jcoSJlWt-rOrG6TnpE7Ngs&1oCNwZY^^MG{42`X>(R7(!JpwFDQAj9ahBs`ZK z*ff|LNKvPIFl9Cd4~;hmRqr_JsgJdKOZqVt!n@E%jxwoI*_-|jD<8C*VvJMJEjKC; z9e2tf-ZP9xU3P7yF1yoz@a@C0CD~wZo(%u5*F2HT$wt{kAD5#8S4_rkTL0h=D9^Yy zFqbu`eRoqZ(d~9?^Cy~%CZoGg0l%RHa`xb9)S=JJgQEFR^jt2wWgO;P@ul$lQ4M}E zyj1ayz=79O#SH;)z0|;_w3FRnQrYfwqEL2BzISRW+dI`1x~HacTY^NkSN0QQvpJo} zb(vJIH*NBp`Sqs10sIm4gmzz1o6s~1ojr$i0s59YLm95mcLojoG!}PLPJCQD7XKL6 z%_4KW+j{tLSYPG8Fh+TeT|M)N=!r4cJPzJ!Fum}9*{{#{2Db=a3A@y634RC{{BH|Vx~6E7{b z{aRxAAOl>Dope$P9uf@XwE2VZT$X(ChyLGe|7*U`|8Lv>(myI!J9duwSj1B&+qoB- zIOe0$E6tx=*x)xa7Z}qs%mcZ|W~;(LPfFLy7kRm6{{G}#>LTw+r+YBe$u&GQ{BF}= zwNBXX$H4caN!~Y7x6x$X#^mJg*PD~;8qpn%v@r$S0Mpq`3TAa22c)w%Fz@vQ2Q1DF z5B0c{O#ic!%!X%GwkaO-nzH>zD4UDRGG{os&Jl1;qQ@1yX=9X$;l*Vn=NcpC_4V<* zVe%Up=guJFrOsf}yCeP=FTHtOr1Sg9i}@s;%i{Xt-pT;~>TpX}kaOJ9)OY`?tXtQ{Z2d6Yp&a7W#o;;-}hMljrseV_J7RZKeqp4{tk5- zZN5!ybU-I_A-dT-Fmi6bFr1s~Xm`HKAsf;aEhTirs&+rU2pbhLM*at{sLFWJq^ zt4saU>3a$}lU`4gJ{h~B5#5}!JdQjzgYS?7><8a~T{0OR7wYt`Ahw0D9gzLY-4r_I z9!o>%PQhf}K4o z%NcgAf(J#yM9kZ3l8BKeQg4?g%vaGG%`gGEq;PUYT_wIi)-xt6f0S{`cHt*S`GOJp z0lX{N`k$$-Ur@Ofp?`DbWx!|Nl5Owct0r>2u4G0w_NPM}u~RAgJ77L{>A0}0DHz|- z?{s#JyUxP@7-b##!qmOf=3Px*`$gmZ>A;WUl&Z7azW+c?ou_QxD)M%;LmS2@g>P>7 zz5EVvoY(F*F;31jV!HMC(N4R+8M>ZLEczAf(NK12drl@5+LRXnr(se=yCtMmM!eNY zzf#22Qu*y64b#N`lvWHt?Zx@b)sMZ(+-Pily4ea$gTf5x*+}+;S2X=d%Gr9&l%y*vIFqu5F)B8I7BwVG_ zVw)y@j>a3@j)*r*6X9*=D$PqTx_dpR&_xX8GVdhb$Mec9J2wx?N5yA)AksDXv-Ba6 zyUM-A_DR07V8;D|hxS8ne2yrF5I;p1hq`f}J9pBr{A1qN-N&kZy~R^se+Z4b+^?I* zydG!cpvhhC_CSlc?;(tMo}J9xT7Wk0PGIze^t#0(4;a0z%(uvBTrb8$|25XJ-R5ZH{!P{|$Hy0cDfT9t71@0BFm~CT9`sQc zviC7!UDuxP))m)kJzwZe5J7Df{>3yFDC+p;!l}YGPP9=J*C1S9E4FzB3d?;`PDKlUnm_@#3l^wcs>eCy=fDv1fpWv8D~Yp1J^@a=xZ8sDwD9j<>S zQ^oa_t*Lrfw(Lh4C&_~8pe^FvvL{q;A@zuT4^`oIXnb!9{kk|7S4S+a zPO-Qh#Nvp-)t5gLj{OOYn<+~le+Iee2xAsiI3b@b3gM`onY5Fk?TNJIWMzjel}zqe zoY~~AsHEX7_-oL~F0E+oslIrHn=aiL@~I(qEEto4Av<2N(&{`;J0{-{&M%3xdfe=} ziC>GZiaBS`P1Cz;s9`Vw)<09+hkp7s3F%w ztgL&`IlHHFeEsrpZg;|X^kp8r)ogN(J)J%vx{aWN3nXV)G9j5svNi@zZ)LQ|21qeRHe-(#fnLfUE4K zaQzM#CJT%gm~PqJUso@f-)O}?pkUNYNa=iv_{H=3h9Y~x#p z@Jkve79%;!9eyUxPasb_vb%5;I(1dR;MuZs~gRzHZ2$ zT=w}N#YOBq6YF!Q#QX#gZFnbqR~)ukKcoLvXOHDSX3-^exoF*}){p!Y^`ygM-Gn{o zeO!52bf)d|Y2zZ>Blepe+D`}%=yiX7z>__!F;*Nj%NmtztqJHNL(Jk#_%Kz7>@V4L zO}VYXK0Ci@eTf(?Yc9kB(4|Rpv2SBi46|MH6WB20QmjMij5=MVCkGK|SvM_?(Ip052nZ@od$B zjvDu|%FEXuM_Z;;tRTA&i2oJG>P0{FGN+`>romURljUQNE0uN#W(zPi4+!R=^YNd+ zX}a2hhSsmS`vm18%DxkY^y_GlO7okhP6t*k9lg#Q(vAx&#vpBtA5J3*0!hjgS=ONLf*P**w+&O{#@^B#-%p_UQPi$ z7mZJnwbc9bdq#}QUe&SVGA;)Vpv$GmXSLlzPoTbhpK=cU5UpcA=v*540xw`!RC$j% zHl738EuX(5)BzC=r%gm>iS{|@gdC#>gK6-%beQM3dx%wVHPcasu&B%C* zk4=eR%rjGv>B+6ygT%gw2-XOms(Bx-@ghU`lS8tp$AnRvFa6yb#iztCH!$WJ>qqH_ z#zOswWnW{yQ~hJiRg+x^`n<=#DA#zRl|OC zvtlGG)QjV%OuS+I^bY*2+V>`h-9bF*K7LvHF&cI)|H{Vr z*eJSv)Y47#9gA+$j$mV~v9wb?#U5BYJR-f=pA`DQ)}Rf0erfFZZD2Oy^#Bn zcPP8pdj!4y3Dy-f_G9%+yil-xsoKni%|YBoir9zt4JC8k?%e$2A>YG`&98co+{>r@ zOWGRYFIrxl15ATnn@j9Y{CJY>w|FKC4kz-z+J2Vy&%htW9&zwFyJkeb<=p&U=7Z%v z?~=Sr^3Lg+yvQI&2KZ^LaiXjE{fp36x&~d*tUmo_ailBMr&rOZ)a}+;8W96OI5+>}NQV^MBx|{uxW8fh zW6m;>b-5YNr^cvsqW(S(uR*BwaCdRrl&QA|@Ytj@|0ppV8JdqVm-li;a+7H>d* z#xzmM68Smi}-)TNyUc+~3@KL|tSCcn_w`N4L^g=P> zVUKxBFcwi>{3X7M@zDHmw&2vv4-0DGj-}^vW6TeyQYYqF(Z&?Y-YoLsHJAn)M@!)+ zq(XcB@xge0oo?IHn8xv@6mwjv)y{G7aifK=G9m8ZJ0Yxhp`Vi<60bK?b`3Jv@O@%E zJ0qVV2`<`ywFbIj*MBL5EgI#X0*7Vt)$qxq*qFw9G_JCPli7y`wKoqrZbtTqUo5RW z8~XCY^@bKf$AYVv{?Lei*zwSwFpn}Zo#HY0sp`=m(TZ`s{Ym|2zSB63#wD2_rrQr+ zt6Zr&v@IjN%l;YgYAU}i!1u4DayN#0iN4%D4%)nA_IW>g>F~je;S;UPMP+)!GVFPK zK(aWC`r@6h(584L^FR~)769B`EG)0|1nM&l2EmAw~< z)uricoo!cn-(ybE^H<@!viCmQAK?-6(mQMVB3?SLru}#v#*)Fe)t0j{->RI5mR6sJ zz6UacEqixN^IBPb34Om6{B~O$XOG4aIy(jYf3;T{$uD=pFQVDBT3oE&7|lDP)5Mx` z;*Y;$oE3Y)F5DmE7V?q!p-3NyxktRcHsoz!-2IYy!ut@o-pbD@tf*+MRXp=SU`c2G zwsn}_V;cX8Jn@U#LKieAS>u#!45@6P?6Y1nv}Stb!^QJnDkq!bN7UIItp5Xe7N7&X ztA42NBGZfntaXrO|9PG0$bq}i=s^abBwtv?$0-X6Z1dgdc?Vi{)THL!uQ`)$Lc62x480A>~hw`Lj84D%{%Q$ ziF9V!``6!(S|^}S?BxynB%K-eJ)Q&Oci*AEBjl`gcx_&|Y@ofE263NyYx*>%Oxr#3 zv0eA~H8`{81%EGZ6fb_fCO@`^dgW_iE3Kx#(D~6gzkBlL!Cr@bv#jHG6TcKr*V1R< zxEeUI-qg74A^$@7AX_857uVoS+qYj-)Ano0?vmPaN0MFEg+t#GoUu*suJRZB7}LGh z*BCbt`5L)GS9J|&gq&j^e)47PJj;ux*7Q$fpuTS7U2Id!4vgs(`f8Sb;4(}uFc=FxsCx zT!{EQ_Jd#1e|Y#v{@nB<_;ZJ-r?FK%jpYU#ANUgb`9x#o&W#jUH zd~+0+i)p^b+OvnWXQ{?lM&2Kd*KB)cY#h}70jv+EQ-^YEf-Sh680(~ggq;*&5 zL%GoAzGEu;1}3-ri=pE?UOas8DP$<-G4071jYpM6=o$QsAa1LWND%`paMr3PSVI0a z&Ex&UCtl#sCEWu4Ez-N$F29BU)A_GCI?pp6TkS*8*s>3y^7;81*A8Mp+o!&B;o>R9 z{9^WD_D*H2*;a+`$NmG=i_gmBnM>8Lob8wV91fm@b4hLfanMfm70<|5sjVNzo_Mdg zQ!R~*QGBpF=rGSeqdJoedtr&cG=MMXk=WbO7sPP-PllE=blz!uFkxK8n+@QaaSBjss#{>Hk+VlmFS=eu3d=kxNe`UHZ+*k7F z7Y-l%5i}2s`z$bT z0p{~|ugd2CitzE^?;Pbi-W2iobv$DlYphp58`d@b6^zv-wfqcENam-RXur#5`k1zQ z;qFs1;Temxm4o@z%SQat9GAIpcKV2A7Fw8}2BvsVx=?`ZuKOov7cxCjI3CdyE*DbYE}fs%y!=7M;I}Cu5hw)|#Ae3i)e3{HOSZ=4ROz z*k2iVa%h2t^)q0}mT0s8f5Lyt4i)YHz5Jh?pNdR{b(_a$rv@wSyT@$VHTM4_{Lf@B z4CFgJOnQP%KSa90roTh_IMUbII^X1fn*Z0^|NpN4#WvPbeoK6}?0uF0Db^3OlEzNs_(R5N^cZs3H5|k5*fCsZao7f&cnmj_ z-eU9nNylT@NBVx7zn=7yHhmLm$@ABs;hg38y2wz=YMzXX$!!Y~*rwf~Pq)_9d5f1P zM?CdHaa#|VF6weDW;iDQ8O7-fY2THr6350A|g z-kMu?1y9a12N$$Od}lhg1S>9&`0a1<&p#s_bMgE^_A~QbFgSSf+-U8X^PH9Ol7nTG zg%)+_h-|K}QnGl-);kB9rGR%dIFgOH{<@m_r;y)p4D|fc&ZpF_3>>yM$nWFv0> z&YJoe^0UWK|9ds{@2jc*M`+%h-xnO8+ZXIv7SZXA*?r*|*f;R3&-Mk=d1@{?fv4d) zP*Z=1`nmkR;6&=T@Lp$UXYo|MnLJf*22a&{xu)JzcC3m24<#AnhQ^4`q~A`kvhgYG zh&AYM$`k#)!Cz`*e@Lh+vq{=<+WiMQ*;h%&x^f5UCAQ4}CjFn_EnL(2J%c&+g|!lg{207=Ji2O^&OWlIM=@fR z5$#z!_g)}A^L5G28OS8O-7?F@qq5jdHF0(A4ZYsdL$W!J_MD>5f^y!8HpJ&e_`Nu1 za4l_WfG-8Srt+s+W(BA*v{)ia_;!dLJHYT&WK zDTH?;@ap4OANFW6OB@jSTZ~*f*-E(1#Mp*=U+Qg4&&jfGjZL%wo=D~Tf(FVPo*&B} ze&*x&t@YWmFC72H+HtJGyc$33s%pI2D3-7VTXsv}R&m_peFYpP|6dav`p!DZ(EV>S zzS@O{D|*)}I+UXIc(s=_p9s$vy^6la(B4){lUCYUU@i*J>>dq{_F4%a(-g_Z3&}lR z4{%;pZw&rvsn*%+eS$iSr$3Xnk3KJK3>MVX{h;a|WnQ?<_D!iv58iO zYd<6B(rv*c$ycFR!9PXDw^i+-UEmeV_<+)>NcO))I+pPVNXIh%@1(Dy4^Gt1{&@d- z%kpS0)!CxqIkcDgaa-`o8d^=K{)jS#sLb#jy3cE*40eIPjCP*1eas@yu1zl zr;2s*Ex{c4BFR4GhHN7~5OxJ^Oyen>9?0)wUshjmKTqNEQ9GwEvvc|~=Jc7&>9XzK zC;FjV7h;2rBYy3|OZax7%|91j(%f)p@oB#t_tbkUDe+T*eiX~zWxwvL)Uy|G;rGCI zXFGEIAm{1+l`}ARJexAN9N59Sw(jxx9{7*sudTt~pjX9T4}|=+HMrB#k+-Kaq6IYvPst(B^2eEPiTw9XL;J_ca&vu(w|P^B>f$JH5fz8fHEE z@bAw7$5N!Tb*}bRa7XE=x_2~STWt*%RAKM&uClQ21NM8~SoSZQ2+df-`)l>Tlf5MU zW&gTQMB`qcgQjofJ?nfL>+9YY$@{U*7h8js)pqxK@3ZZ0quo!vqwGI5+k`q;aM!9| z1=>b$94l;S;)zxZ1h@Y$DtqCP4*^@c=lZc|GfIDoF1!bW7+Gp`%Z+fDRA!y za#yx(*IT+2h5Nv7(48+JV=Ke+y;@t5e;vmITSmimT3uol=%}s1?rLB5c>h%w_2F%T z$zHD{e#{{BIWUfKMb1A#o02Ei=ZCQ2(B)f$3HfMjFQ?ox^mbJ*uBI=N{o45zv^b)QA8GfqLY}VLzlG@4DwDX{ap*26jxD^;F zbBTwqp4lGSV(6u(=#%tBPh>;B|7rZRQsk#;UqM~2*4N$^T#uZNHMh)#PO{30ZV7 z6yGxg($k$4lYc50kKfRud6RP^3&HET_n5Aim;B%P{dZvBVR5*Vr*RoSaC3NaS4G9i zJr(5hi$Z^AJh)@`tyk=$a~}E(dpp6N*gSV^Il14AD93puTny<>!MjW}nG)_B8wHPZ zS{rF|^Do2l%5!s-H)7XXSj#g$qyVL zFT6`f{3t&&d(@;)5pPi@Yi})R0>p`iLFRqJKT? zx&c#Z79vus}-v0-1)181T zWDoCvCfLKW@fDjn^OI%&itCp6w=RHw^EmTKzEk*2#h9N3v!M;^+>Bc>wCjK55UVL@ zEuEOALq2zE8#OzfkPAIkBS`-+nv)%f9LzVBAmR z9cRo@8G9LvOBk1)M6Q#ynB3mr6!<1h`}yo5_M<-k%y@X2`KO1t_j>a2D>zeH&{~`J z$>@w*ALowHF9q&V;!I9&q03D$Pv#56bh-Dc7EY*(XybIPot4Xt>_=;MY@5WSGlE%L zo-#e0AsTMC9Ig{o+hrYeh%$Zx-JZ!2XQlma)|MM`U2a}HJwW?rNkwZt<0CrVo+y_+ z@t3nhd-b)qF`{!Vjjn^{?fF7QysJ6lu-duMbj`i!fBq}4IJUai)6St~rfbFWk>wY@ zM*Gi=Dx0(aH`L_sq5W{|SSMMS|3M(Sy}kScd{D*^{%a`r1@Hj(b>Uy|{|9!g^2SEmoZY)gjHkB52EAS7@s___TcatCate{LO{gzRI^*Q%aRc z+qM*A3+t7K>%nVxn-V&MyVO2Wdj6R@)9<1)-W|?ms0Aa-+xM zZPl?Dp6`w{7AWJPSntNPk9muE72X;iL&;FRbmZ_p@k|1}9P_etqT~o(ZjO1mh+n%L zJy$fB`tRbI$#2n_bDF)By^@zsX8sQ4M{_yjMfi1vbaE1%pGg%yKse^`Py=#zn&$dK zTLPRi=LqLQWJBs1zlYY1#F&!I{m|?ZpE}6|GOhk4P1(~Nq4|OR6SN=RpSfSULhp4( zR_~qi`bq{LRx*;M-5hYB3->DtRJ8V}@(sjDRNfGKWeswFJ!K`A<4Qg3z2rUuv;TnJ zXSkD1>wRi>;VYuc3jdr}4(}JuMzo7ANKsbpzU39&>$SrFHtFx#IZZfVqfFgH9!h>l z^rY{b@5ZM67XMf5=?m`<)x5k$^D?}zH51JViiv4#HI~2ncjo1QR>iny;x3&0_w9|1@B2g+QPlkuCtjUAk$(iK+C3#M%+{ir*oFV&3 zaGCg)I!?Bn#P4mq&hDweuR#}Je_$gdat}3f-(%8fZ#udfJ`42$dm=%w@!Gxvz%0#dx#qG)te<(;(7MRPZcd?%ZWDH=S!T&k?l=BAz8_0 zx$$FyL*MCtasx834jDN|GLrx4VA8x!=N3a6B=ChzE|S$mZlfn3TreHkfU?=ZBLO}t zr@VU8$h^gqK7ps-R1#hn(TDF&We%N!UVvsRB-i_E+f{uON=EGq26PGc3xsgNJ+ej7 zH~I2j?7aP=kzmI#B>(aKm$XlOE7G-1xv2edX4&MYfFJIAravb4-Kn=w?i%`1Paj10 z>q%$mOP2rAWif2gMYdax@j~V^}9+CH1Z)vGxmj_V~!qOPkk0X8j~5t zzKZO{Q>mlzAa81}*f#}wu-~JtGP*8h!g`bm*A#W{G_itrXREpn+;e5_aqA;iw`Xwq zJa;h3p2@e;pIm;Rx;Ck^2nPF^xaIm)xdQt@wRXPNolZUS(QmrLj5S938N-0h=v)`sn%Z8i#(yI zwOceyA=^&&;R7T3jlDme@l3LAx*z#S7B%li^N7Y)_-cG)?}a>HSTiNAAM-&jPy8qx z`(^O|g_Bo;n`mkB52NqHc_5SE2`^=IKd#0?W2ieqcNBJc%!A=v7M?dL^aK}-`u`sN zxA4KKIW4?^FWc6!{zx5qU3?lnm;0Z6Ixq^LV1RU*HTX~)Ytf3Tt8*D2Q$DyPxRmrIQfie_&kAU z9lZ72S&@IZGCcFu=qEbLj^v*6Dw%z>E!fCn8Xiy11b4&Oh~L$B(L}g0KSuPVPwLAO z>fTG9bOB}dYENi}|7+~r`2V-qgy!;fK0JhrV}KzW34*zW2DoDBru(TbZ5JctrL7N4|H* zDBrtd4Bxw>?B9g%ds7F#cgIa`zT^DLYx>@WawA4o^K1Iv=qv`OE0O^9nWoa-lEum)p>H@_nDT zbQbS$2i?B9CgRqbp_^vS%aibK4FACxzU(jjS`l)s!HwkezZRO>IF`hVar ztF72y7S6BfFW2Dw*;<_OD=*3SRsG62z?|l84<_MT#&OD4&X>!l6y9@ce9CH^@+dxK z9H*?scX1WpBlwgx_^v(*zD@s+;XB%IucdF{HT-tPg5@t1YG|B;=fXJkQE04k(jEU( z8izW{>fV^oV;)DpADiD^1XuilSNZMa7rBpS1v*mx`@4A7RsHrAep+{+*ZA$JqU?@~ zWeX;;TQYTpE5`KOwMHyC4(D*5NAugYzbl?!UgfuU5R0gJkB^1_eDQ1g?G0JkcGf4s zF0YII_73)BaYoF^{^UUXzRvE`RlA%y4E^>~<+nqd5$!@h?dg@Q%?kbYhz|JenFkqP z)n|M{-<@+<%@79P9s8uCy!oH8!&GMFp2&C4vUc*;A)R9@;`6y*&1&z7zMTPn4)TTH zraLd831?EFrDGmGa9rpo6dNZ%_t+2O-TrZgJGU$>)>7_Pe}sqZsq(pvE@iMwBipr( zvf5`XxOz@B(YXPgbI2n1scfiAy_aVve4QCk?Bge#Yf*WfZ_t?mogL8nkNUtEV_vX_ z1DpFVpO4OIrm#)vQ&N4B9p=yvr@)$Jc278OqT@4Z>Rh1m*?o+|((r7j)@amD^mO5! zuIgEL(L{GfYwng^3-8??{8D)J0+YQ!c710${cr~GMTiUOek=J*{KD9<)@t`H80Q<- zD%?3d)j#^&051Q+If3cwAM1tc*U{E)UrFrs`s|*2jiIq?v?i}UhU=Octvi4#>qw?q z^irB9zVxB6jABLVuigzmm&uRaAFWve%l#2|{jc<#d}o4%4x{x2#*;lAdk;A7Z=!eP zHJGd2a6Q!ODZz{W$MBa$YkBydvT>Y&A01FkQgfbSco7a!nMAJBg693r@);qg--6EgQo`e1djUxKh`#(wd49>TsuX5>3i{& zY;*CI;;M?XRpIQ|9DD{C;<1KK_F{B##-&KSu-FIu?c5R87o^P^cS1kwS-`s(o^3)e z{UdurWqbF(=VaHE|GJVXtaa;(%;P2PQ@coh^eL(Qt%3F;Nw&kd1U#04k22WBaXzuY zgX{~&2MX^;cmQ3^IVH1xCj2p;wFJH;gI{)`_eKkkbETf-t`^>SeNV#XqobsR)y=T;h&A*NO3^tkC)^`V#ewwG?=)8%1#=6{US93u! ze+7DJnecs}9-2%rYu!7kU*FLe{BP9(rhLjTk~e`kLkb%IFTte$|)kFTIM=|j4} zSykRkhV^YFjd{ZWW3rQTCEPu2avOq;i5afWxoJ#ajL$on=-&PpYtA}-MI!t;ljBlE9V}yGoiz*8YbX=ql(b@27xW>;K=^^m{4f-csW6$VG?BERMl35{) zQF_tQo{&5`EAP_Z<#ye{>Na=<{Rk~+7ka@{=*U$re&K<5jiMH2s9PBm*(MDX79`@JqE+@TyS*X_~3rV+xEUxg-7oonZ zrKM~Q!47Q>=p@`7?ccDp6)$LCp>!={7v77nGPU%M`6;9g?O!|a{4?SAmvY2`M$Coa zuJ@Lo64((T96P6;3@(R|Yg0l`cgXL#h`ZzHGdf)3(Zu`4H(%rZBX>%O-spGWcZV@+ z^qKbhGA><}L{a1TVpxaHWgPeM18+R{8t+ToTM^B*Jz*VeDfp5Y7Uf0P@R@&tddvMo zo!_dDaes=wtIy}_P*mC`mZg1(_9-c*#ji)s+cxx9n+FsqCK|7g!>~lv3 z{6pL$7|*L|&UUP|b7=$fR=v(b6xO)9e?D2*4X>+D>njQN*9a#4**`vu?i^^tR$Ek= z*ncy+bK?Q*CO665iK+ZO0ed0B@tSCQHP53TI}eP@mAxE#SocwkXnU!>V1mZU9csI`D| z^ln>CzcttD46F40e0O`0FR~6_JP-dJAA){4{j8aHk}g5ljUmNImiQJ9sirWlrL$dy`D*mcYq(RZc3v z^M!{7lck3S6YMDz|6fMCrayY`bdG$-JU?VQqId5YqwWQ~Pm*s6w*)h3>tyhfJSTP_ zSA{+3ffe3G;KACYPkgfxcp0b6{w8Rp`_-JnqX#I546pE5yQ!9wy|M(@4tId7ypw-u z&=E}JhravgQ}!3E5jk1bFIb=XGiyi-WxJAgvJOWemipYO8PX9NG;)SC13iG(3ydLX z@uv`u)&`CSNAwi^1xGSQAAS1TC>^7Ipc{wugh#@s1CvXX$@M!p~vu!xQ5j|xmshnf; z1O96smK`B}{N^vBIlYDX^vScMSoYjgc;Y`y&*>~eU$DUbZ{q(No7UQNzfH>@dC;b{ z2jy9t*1n^rQzKY9tCWh%HkZhJ7t;@*O-^8wmKKSJNg zetq#o&S%pvy?a0Jp5UE>Px8QgbUb>l6q+|RCXKYU=a*GlV&ge@cD~`i@fnjY; z=PcNx%zdM6BkDNp^I{J5O{v_IFZHcuy=J}co_+uvsqD^8WRa_)aLkOx@$KO8RpCLq z!o!)|?cTF$a+-c7#+AB_$(57&TwnU08Iz~hy`gUk{!^C!Q)#O)#`~TbQvz_6J>#Dv z|1C$`&^f`q|8u8IW`5Vc#G;SvtWUB|CpxFNpJDD>8o_J%n0UP&yznu>YpKqBF~?jq zX1U`i*F(7wW@`_)HwATX@2hBk0(-cJ@_EHV#%|*k{NC$o>&~O@8yJf`ad5_6FcaW; z&%DOq!FlwrARhubDsfLjN&Su27UJg$;ky4p+El-!M<29tSCvg=?Y}L-_l{S z9a8y7_B9_VkLOCJ| zHNYHEEPG|Ue{ycIFPNCUW6#VE_w=aX+3E)o@6|JFimqUc%Yn z6OR+)oOIwVXq+6!_W^*<*ee!i9z_QZZK#2L3$Rnbejj{0Kie1amDA&%FtLE#-W$~Y zKx4UqdH)~6K8e;N@UZi{?1}}{mu``Nm_(j`O)RWLd*VCBH1nX02u>-2Lm!*-x$VJ$8aNjM=RXv0 z6K~K)BFh=F3U$D(rL;XL&x!PBcz4uN-8IzByo(beeQ*6HnbC zakXH;Bf_7#A#=agb>auDzdbl_dvF1Cm4CY)yGZ54cd6--9@f~N4sLgX+X$O!Mil$_ z_NHClj@7%ovkyjh1O0)g_B`AQU6}|;U+8UR9W!gwinDA4R^4%GKbqH8llMW!cX~~m zlWEg|{@?tCougV$!zQL5^hJ94Km+(W?fxdpY3wr6N3x*`^#4=5V{S<0zQ!Kj=v>@7 z!DEiso+Nz(C%&(sJFJh*rh5sjU1rM6*;&bbQTOJLJoCaB>z>*N&_{+dZ|FfgA8!t_ z$3-}O1eo#Jmk*O}vH9Ya`0UFX(kpEKD$?;en9E3ih%uKQMJ6)zXYUpCEk|BV|0A6< zR=n<~2cr2-_EhyO>tbRAtvZLq_a1BRIOxC!ImEfDlN47S^-i$9YhfLNUZU$_a7e-D z%v1h@-=wc!VP0Mh>{ZNl%Xuz^<{jT4Ci#SF?b+A=k9ff9T*to4OTF(}T1YNM6TOe^sL+>X+?bE{ z9}({vk=&Tv#$Zbo-@V?2!k7NbS1nt<_!)Wfxs=y|PZ*x(FQOZ0qdb}~IfpjY^5jO| z8NLx0-yQKry~?>_R}+a$_p96u;}+wXIm9CRn9r1h61={tyJ zY20-dZy)j#+hK8ehcf#9)|+kla!q;NH$1w$;H&&BTmH_P@(+$tK4Hs?myd-8wfBDf zMEB>_o(~*@20x^XXmAqn+e}|&Fa8vp`UcXHh4{R>_*FVgcG9b40pHoF zxzAxw4St)2pNZB-p0&JoJouz0Mf~_W((4M?{?cbf_L5ygKKe&@7}TS~(&&+Kl1cFm zHjK_ePh)LN=Po2m9mtZ_poAO#=zdd*=9E-+V=&*g@n>+b`<|Fn*k1@O7TiEP*V0b* zYoV|IVo1kmK9Ri<&nLeoU+ri0>$}K!Kaz24)PZmv?OU~roLW_g$0+S54 z+5b=SKbGMqNUyN@kCXnSP5&q9cz$_|^j$Xp`=s~S^mj?ea=VMP<`s?Mm^y3JI7v2Z z<#!JC#h0?zL{DOKk3MJHxrcWz+4Mh?#^!bal2 zie6iSP%mKDB1mMXnA@IR*4&7@;`-AFp7R}bl!UY(?4dVPv?Os~Hq9n|DgU zMUN{xS?i<;_&8ig0k1CV>Yf78c#R#yGoXiX{yX0F+Pu@rdnsOb0FLJVOCviby!$GJ zyp?Z7mNvHg#d6ty=|*I^tKH8aw<&Ym;H}alDgg8CT#QWa=ybUF1jh?)jljn=+m5;ko4PknctLVtMcTko#)Cp@AVL zYPk1F_OR@4?e}@-Dxp3W|aFB&?xzqP(&`&-e&=llviEWOA=O8AtXuZ~Aa<8hI{0o|P{ zGL~-HpE$sHTp#JSbSGzWtxi9W?+xBeTIUF2JN?7((ADIn$&1&ZYIWO{uaecR!6EoT zbpK1zNnb=Y4IALTi(X$tJCV2wt6O$?1WCA_2e z)pqI_y0c;OF#Mm^z}LK)#^%(VjxK#QtWh>^7)Jo#d==gv@8KGF@jMsa5uC->xBfTr zpXPmx-_dQ9jlq&C?7iV#wilZwJFQ*R)`>#!m!DP?-CeOU-yPK z=d(5a{iynK6r1crqBp$Op?2t>nG%hyY*6V%@w{TlDc+@O-p#e|9O53>qnR}C8*1LS z*!KzEpUivW4SrM2`|0*QdNhe13g1t!dEaE;*YkeNz8mft=qUT2E98im=v!S|gBDv~ ze$yH1J9n#pZgI=2Z1K6a&u7r*&Qi4BD*=85TVLOPd=c7fY>7WNpMFN!zmheTMD9lK zO6=)1q{o#W^464kf|-_XZ8dcRTUYUi(`QjPzlrkPgIekiKF4g)(xmaPId-dEg#ym7o)8<(g-csPD3hY5KTLSJL3;TAg z@Z1`Bvn;%~YmBfpqyv-XNBtygbjck*)Au|x*?!I>c9y-D&tN>Tt+b~(H9tzr&T6n} z**;Czk$)|Fju>z4Q`BC)t+X*7K1Ih7r`vWQMP5I7X>3I8H`9Gj8~C4HL)}&FtOf2n zkh5oObbc*?+{j1l5w74_N4hhtze4M^&C^oUbK3pC7YyP)+5Vfc!#>RZfxq-v=Lu~L zWOit}EqATpz$dl7jP5+p+FEEIfv02&V_}p`Z42&#pQSIc*N~}gLA!;y5}2_}{RQb2 zHvb~h>uh>C=~#}6O56PRl8$4D$i^|<(^l)(-TPZ`%GJc`!uft%jlZ(b`)A6i&lhN% zi+nG3DgJog_=fRJ7gxKny|rf=-!7TVJIdZaOLxgE^V@Qpr*iK=w)R`-V}45bH`Pd3`JC*jL{~I`-8+OFH%uHjqwnHbrp>e4u9Ltf3739oFGn zg6~`0+R#bTd%qyACR~%mG1@J?{|-1WP*?ANqW2x#-^_pY`MPoGUFeBj8^)#g^4xn3 zWe0huHi413$HMp!`7r*_9{c|a{{Ni+pZc`+8I}D%2Zs+XcyIJ=fM~BTeld9q|0?=! zfH7->2F9)4$Uof@-bI)!F_tCng&H-MsY%gT9{SnggWG_idImdBx-_nU}Nj2X@TQnUlAJ$3|q>+{~It**}#$_mkvZtGt`=L5WS0cfI}2f$;t0)xbmd zn*41czM+0Bus3g1yVAoC)8=2(<|DUIr)#*5?t6QARC)QM-=O^aDX)HMzEHW;StEH` zaQ}^R7mg~|Fh;pAQ|>*Z$~BEq?(>vu9aV1n809un?yOPeT1J&qKW?JjX`{-`9i!Z* zC^u_Vx%p$1`xxbpA60JQ809`hxk+KU&sFKyHmaQH_kPNyN0nPLM!5?q_b2>U!?$JQ z@mMiNx%W`+H>1j}9HU$-Z11>RfDTi62b*G=+gG{jd+^fE;X5!VaR=rka|`j@(5@Rb zhi?s}7d3|ycL?p`_`dnS=9><&Ub~X?hC1Ln?fw;{V_kMR>Dab?Kj~GW+=cB7&)ch` zHMSA<>KN-OyLE^EQEb|8Qbw|PKJDy2AADNd{pT!gb+5upHXYhzHTR!pZCc|y&88JE zi|<)|@MK`k;LJf&%C5zfy;JGWOLi}jU<;=7P<-EN$ScaT_p0XRL@)|dhha1WW5Htj z51xu^&A*Z|tJ?h?^VmOuEvLOx3t0b7&g*t_`NklXYvLQ!ikUU(-Ya5cP5iVTj^52-VSYOtzZE$x;3m73^GT<58>M00_-@=&7mC!k4W!d%Q%mo=gt%l5R+aV z^1$#n2Zo?`%mag@d+Wj9Y4;D1j(Gs1v&sWchvonKG3N8AH)8C^h%qmu3_R{L-yKs7 zd&e|zogBr(PCEwpEfzk$@`(6bTK+6D_dkovZ3!N!!DE7LLvhVc_Jeks?kFy2M#kl? zmfoVT+7B0g2d*X#1}>O>hcnujrSbd{vCaoXPf0OBQXIugu=P}lNZ)@}H%iV{Q6a0U4-W9(4hbzjS$DOmAPg?EXTwm|6t8eEU zTwU%zd=y)6F~8O}S9^6E#z%a8I(^bz9I}7X*ws0kKPSw;D9o3=J=f;X4D&Az^R)+H zq0OHj=5uF>Y%}tg*!Fe`5c z&n|3Z!*?jfBiY-qt0)JoG|%@lpG2|xi?!ZxxAyXC@4Ia6=)Tt(!EMYtvJ+F-iPu@Y z4rwfif0D;K7k7o&{2|dF-j~fB?SseWBd-6)Nz3&epyn9%+;hkKb^6{J`!W$R|bV^vhahAI*$2SdiPYg5~>;2-RynoM8-mf#8 zgX8?@8(O2=R-3;yyMnOY)4*#6c%4}GH_nPQo})fk3nP1Eys2a>aIIwtJ*IQw2Ohz0t3uW=ABrDyC8-UEJ`PlO*Z_N$-LZR4GN z!Didf(KxRIXRW&m=X!8Xf%9+at85>Qe+)yq>$4WdVcv6>jYrJ9`4wB1`7$HeW(KhG zm&32U*hRhg?wm==Z+UBHzUM7`=j*Ln|1|S@L%(0RX`HVDZrqN>`AXZ)pKLqrwDU*X z&Uv(B=Fv`s-;+8!E_hMD7NbLZiP=KKT<`1~XcIi%THBuxNBH{&>YvDd_ZcA%Mg1in z8S;?uLTCH$1drd@cI#^1<#=~)4bCe2wo(7js;OH`N7c=bDm$0|8poIhf_L(3)X$Bo zKi$?Be`U;tjT)D@&zj$2xEjMZQubJQz)a@bw(RQ{|NcySJngs%Pvz}l&ssDNI=9$Kbo)a{r&|{MnABVkIwIn##655}x`FZOu4Odlk;$umQXT`$#Z+3nSdiQ00+f zc^!-Q1us1>+BeEvKUsRgDWMYzd~2Nf>#1BnF^c6Lc2)B}^usOC;avI+o%idT!3n-a zlOk3oI9C?81%=`j71=BB@ct)}kEf6|)n{!b^CGIr%Y~%fU^!EM+{Nq<>EVOZo&FOjG`O zmPXL$Vd%39`aB%bXJeH<-^4~vU=OJL*^~!1>HgqM((El6(l}JV6Gu$6KBQ4&IDf6n zv6q6mHN_sy>Ky$3vcGl8YC~pz?KBTpHR+Ur4q-0>8!i+Ow6QY?-pE7nflla`->IrvSc675js5 zzD}pv7qhlf_*4}4s$-u_x^PpdN7MP6nCHv>1Zc62v-->}73P*;1HS_KY4Z1x@8VyC>X zW7x*RFU{z_5A2%esy#Jt2KL;>;M4Gj=_poCwPkqjuPgPs;-|k4_sj2Q{V7^^sv}Rd z`8fFr_HxXmPDh^m5lX%6!Pp(1D?5%k4S8)uPLq!A7^#t0_CsWx0{jA;HNcQfmr3g`swY{IEv&WV;r~m+y_8OV_BXM>OK@k%OkQ?3MVhzOyz5 z4_puI4%w@j*R%cz4(pfjEtlqb#E%9x2Pbom5amCCa>ij{5fz>@|`E0x4$p@123*?a>#Fv?{nJyu$Nwq-dP*@ zw@+F>aL3>B|Jru{P4qK4z!t-JYkG9z-6)^)!9EGzGouv*=D&HWp)-fBHbH zSsdOGc07H~<$E@9C*d|H|JVV^GPKMH=3#h=wbT7hL-^fn?o}vzn~-6_P>e!rx2#`O z*i%Lyqi==RTYq#N<)ZHut?(Ex_O|^Tz4wDqSMZGq`5NB%d|yTV#UB{zKaW1OvaZX2 z>Ft-Tul-SAV@vt<&Ai9Q%w~8x?Vnqz*w1sXJ(PmNEkxAYA6 zf%6?KrvqQN6WN%{ctCUUn{&8*H{t7j-n>)Z<%2 z-;ChJ@1RdOcQVHeNuO(NRr46%-$fU>z6rS@l3GH0AaIq54s4*@qhfS!gHzdD~dJ8~qP8(d)LR|cuv z-occa;OL)fYgXVR15nZ(e3-UV&2rTI<@bE$YA-OxZ6{DYw3I`L}(UW6VPzw zoQa{1f8U9U_snpmH&V3stMF_^bmk`J8}UiQ0?MO@v&GGPccJK?0<1W%t+bi@@!8vU zIlN1o6P{+>wVm>!Epou#j-hYof9xgBNpjEY;b(+v3VPOK%jkROqNgeKr17_glviMW zXp{X4z1y(AmSD5XC&`v>d`nwL@9c%8Ewiu04xj%EzGu$!LfTtGdBt>)nFkbmqmTX; z(-S<)x~%x=P2kLPT8wiZoLg#eewuQ%IK$&d#5rei&Ve(2QiyX2obwiE>9BmhcP;pK z=R110wv@JPT?3x=;H&4Gz;}L5eJXnFp$+kMp#K);GU5GAi}Q($*@U1O?ck()ff8r;_}LP3ZT=+W zEh>|SCx1pc@k?EQ+3W1B_utrA@WH*7!#0$4sh|H7#HZzcl(u zX~kZ&#un$J6CdTyQEbVJeVyqQ4Q4Zb3E82>-8EBoQ3<`>$+wEGqy3J8_GVSozUFVW zf17QeI9Avf-9t|M&AQV_d)DLjqy6i|d$hi1^TYO;Gq^*(+CI3_zV5zucR|y=4*!Lh zbV|HNEBVviZK7?e&>u9!va48W%S`vsSyndl-NA9_-0UfBps`eei2btp*Qtq5KU;Mj) zc4Ax_kdcO(a&dkW`3`OByY@<_#we4uW$G!Tbp04*re&$i8A1m+Na=ngU`{iegOzrC z&@asktgVul55qliQ`ir4s18~=;dzG8o=PyT(@cLb%hs#oo&@nr*V`L)&ZK#Tg>fP< z@D+vZn9Xk>Kcd&dE|K+jjtNd)^Z%QUy!FU%iTF9FNT>0;c z`4GnoV@l7iHNMk{Ix!C)9$71i^ z(qeC7j=NQu59gaZ;Ps-`iPmdA%^J#%qQ_kD&GY*Y?Yp4gYe=i_pBMx8EVNnztsH3O z(AR}Eef{tl<(JgZY7+fiQbViXJfYayFs&~gtNtijy}~*4h2#~0yTpiAMa|EAHvk(O zS~>$|Pc)lcYVZ$VbAdnfacK4|H1jOY4xH|02Wsdw5Yem7(rbzN0^e-a{f!aLM$-!V z_-*vRo!z2d_DxG z=bZc8uh-jsUDtix_vzEVvAwxpF}K$w_vYrL_U1~L-E2|^ppe9qnU&5QQ&ekGc9^v z_VhJ30k@;97l|&cei>Mob_P7+XTqc2!lNE|tUe1oM9)PQ9@4R$80V!j zuY8CxOGg!-A=|O-cjq>v)5<;(J*>kP(m9mUVJfVCRfZm-dBA@Lf8Q-~(Y^E@I@Wxy z@m4yJmXd>TIFE@=XVT!4SU4C5y|mGqGo8FgJ=P zfOpk()4aTrqdRxAmlj@>-7Om=kV<8iE#`Y{SBJ&|bGXh6;)pvwxIE< zu{eVM3vFG`SVGJz__D&9U!>y<*|NWe&Q!LBviqYy%slG;FcVxdmKFPHEuy@dh(LHH*gz_ViA7w(6nLTG9)8+p4PXm;ZO;Ekq zj2FILD_>RBKDA@t&ElP4Nk66sh%v$kc{0%S-myc_=a+0hpQ4{Z`YHNWe|?+X-!CBh z{4?mfqFbN->aK#$z*Q(dz{36>X!n+ET>Wj5Jm&kAz=Jbxv)7VV44kxvC|%jNIYQvP z3}3x)U%^$fBf{C9mE1QUKmFni;&ms`;hZ_?#^~N$V|>VyANb#iWnc|`F!$I0c$#m( z@6CPW+0!rnG53lqDn?F^T=A6AXZF46sZ3*J7@3vIuEXD_Gn@VXoAE53o!0qzw?t$g z;kR)!(4YOrR$P0NHRlbFNj}9Xzl^bH9P*6|_rm!z7M7ANPLlJF>BB+yxdJ>qD0xy< z0xW*_U&^DiX`Pe5wdLAvIc!AEu)_yvuLdVP8=P=0rTk|!zrl;L?-T(HfVIQU}W$_QG_)eCzY*(-{Q{TSdhJ=_1v$H@XW8?rZtk*WbfB;zn*tZ{MG>< zon_b>9m?H{p7c%TWQ}1nc?1jbs$1ddpG8`yskxUnZZT)-ipK&GzAc zkdbH7W2@hJ@7VLyZTS7}doN%foBsUbd*2kJuj|2Q-QCdH9mq4vKTwQ*z5CvD4>8}8 zBaOV@#{E5!kB-G{+c#Kwq5d@4v@|+h9^XmUbgsB0-MX;M%t<3l{wAX}*#B|$im}gN zo9^RTbLkMi9-Unz`czEmuB#av^!^=aC~#3Kd#t!3>jdhv?>r{jyEhMmy|&H6g>6!1 z&lPji?aZ710DTG%X1{`s^?gXZ1^#@z`FP|TJ|_g1HH^jZRV? z&%Bk&h?hh+(i>vX@e0W%orlW#%&Jdk4T-+55&gajpRD8TnOmTH&lfue%soA2LLcVN zW_~!6N47!Zq6_G`YC`_vVl$rI6<=n3OnVlL-%DrV z!TSx_PYSkNwN~_rj{_^gGx{A*?nJ(mS$BaacRqDK_311h&I%}XcLGzLsXGo+2RZW~ zwp@vu%B+UgKSBOWfML)X1-C}Vg!j4l>+*8lJG=D97H*e7Zw=Amv5VcIu|4PSz)t4; z$;dCT>rES;pWW3y4gCg?q3A#8Ecj6~>)dZ}&w47ny)K4ajSX12Je2EU?AO3&(qm^J zW6QX&@B0Mbz}$|HeQoBO_!}b3pAqz4#UEg|u!hZ<4)z&88Q(bb{Dx+Y*VOY+?pN?Z zk^2z36FGzlx4Cb-Y5%RX`LO)%eGg#=ug#nQ*7$r*3f|Jk1@8!L ze5Q7odQ#bali>b8Ilt+Z;4XN5k+b$f$e>l{4Ue5~;KsS+k*w(5gBx|5b0(~w_ewC6 z+|U>Wv!63Q;dC`=!s&zfbcNG>zk79@wg6Ab_-|lGHZjHk;}P7ytoj5W^`!uR9;}9P zo57pfJx;#0l#}gaWJ)>m6FHTaDaqYtuD(lniXoSqq-)C0-iP19(<6^+P89Hzx512D)wH7=-`4Oq*rg2fa3{yfz0-o3m-Njy8*^Q+1g(t)8+g zmCAnlip$br>i*4dfn^_K2RG6|q<<9crp=hAe=K`i`p3>(Bj;H(_T2|>(6+l1xbMt4 zeS^8rGrw))GYEGB>yL16>Vik-07|z2K5KqNaYM(3hf`&5B}H19>_IG&v5lU`o_#v)Gs|-yzR#hda?z1 z;?atcErRO;V~-(6$m`i-o-CO#H(*cq?0(SL^7FCD0+HC5boeiDA5#BflI@K;Tfd44 z^5pm!h<{=XK|?R-pIpV~k@yh$>QL@4zb|?jnmB*I?QQ6*pUgGJc3ArHDBTwdW%Ur(uN;kb$G#X1~o`aXQCMn!WZ_wJ2Y}sS0;A?ytWza&+TbQS& z;Xftc2KxE(E;D&5uawxb-^X@7rkJE0VmEWf=3j za85A0YSyak1G5gNLrwkZ$FE6cu5E5f2izTF=hBx^=JFlQ8`H&cew=l=eGPGX(P7@# zjmho`@GZbXJuS$3yKs8Sr{$(8+QC1hc9vJSqzBe)NCzT`bbz}1sXLGy7%K%1YWoq| z7N1F02e0P*X>7P4wvOhcdf+iRF32w@zA7o;hg0-N>8u$iC zbVpie)Ju*QNB@C&q#;{Od&R)UfA=-blhCNf<>S)lA=wB+=(R(O2Ggr+sJps8`whNd zDjHHf{<~x4ybCDqs4smXHu$kiy}aiAia~7n0b}nLMV{ac+6QwF(5BB1Ca$6n{4)3L zpx-;__pw!!mz+s%r~jYI_0az!^F3d0Exfo%eEg}Lnd9lZe9A%QNYTAdZ$;44M#@QN zs|!JI(1g;uX#3bz)Q`=$1E0-~mVtB$uvfpf@J@86`s807vUI!!c>8180X%lJ45mxm z0m|&jeZay`WzL3&`3}o5qU7DH9+~L ze6&ST+34&sW!@>nUa#o8H&@B;!YKPa=;I~GR|9MCA>CiG4XmYB+eKq>>O~gJ z!}nD0GA}U))i~S7hPAIL$)2v{cH}dA7_9!|I6Klic=snaQGaYGy>0pS+=si4=I-IA z{+M+N#voZ@c{K2AS9A>WDt`M*p%M+)nD9XNd}IMtaU6Y96LRT=g4a(J3E^Ym?%9XVeXFjup7 zaCl-l^(zMb)S~aXgJaufA;;M>W8$UJ6Qz3rx9o@45>pJ%eS*IGd?kK&`qqvy2OM;o zz$x%8OUlQMzdz>b4K>z}XJjKX68c2#Ym^>kzN031>ichsjVeVil-_D|G17f_`&T1h zXlDWrku#or^l-Qy92Q#~;)@6uyGq}a+f)eisdy5&>8z0wXcB(B>ga0bsT#S5KKjI&_k2Ih%1jMwz*r*kUjCRGXLD_Qql!09~SdJgs1+cu*%tz?Qei(GGRRhxe+KPYP*liO6it8E?sZscStJMB5nME8A7*ylcM zO5laLA1%u68CsrwVCP4fzuVGZOnx+d$sNQx_iswiD!wJNg7tvUK~JJ($rj0-J@^wk zwTBY8#%JNH+Z5Mn1>*4KTFL`gm3@wU21djf=V98%SU77R-H({Tbhf^BmWicR{_o4bVf%M3&)3nv z(&YQn!dYpYvB66^8$-H}^b?hN2^v&9x9TsAebmTT`4kJ`oF$L){>67adJUp;irx&4 zx%#m6ZCu$-zHHIi=pUwhMSO3rrfF#Gv)2rbjYNN7^os!fg5NVC`aLfyyRtj0^8t%k z9}PHnnLPvV=N+=$z(;-P;TfF)yWZ2mk!L6Uwn|*~A2TlL>B=`RiH+#8Hu0_}ve&TB zCyEX)o$}bWvO(nhU|@G@5Orn{8FU|ONGFw7F>9K8*^6*lQT!8m8L7I33)QVY&5IA^ z@P(bMVO+AisH3V@eT}o18GBUuJ)7ZExh*!o+7DKFKAPpE-LvNieirBCc-^1MU2F69 z^iAD&_Eg^Y^qlO8;F_WI;wHiAPUGj*ymz=I*$+KtOy;|Gd7DOU`u5MS z@wv#Rk^R%tB)fWVt|9uuiEYUFP?UMIb|?=A;j_xeI3HuvyndL9rWFuiY-na&%I@ozNV288XN0< zd;^Mgh4t(c@O*>6&$v46xMmPLTgErh*soR9L7LA;!to;oeVR@`is?t;`#&mp@23aw ztw+!kcM{9AvwAsxq``D0KB!=1Fzt+T#tM6mFXmfhnlmQ*;QcyG+5YA1t)h&Z&d#7d z(Xjtsefv;B+xG`knfo)b^z)oWAp68|?oa#r&vta{?X%IXX+J>w!O_DfDxCgYh&ba& zQ$O&fPdr~ppC+%fOsJ!QZ)>0nsXy~ve9Zj*t;8<2kIIYwcOz{tWdoPrF{6s^dJAiy)g=(;KTx;s-5tm$- z{JbL@P@l-BZ)G@5I-{V`+XIA5@y>cu-mpr;=SPsqFg}p+^P1%q4qRSA^kk&qtLObfmOQ{1}co*ZUc!Ko> z!&_c_>Q4Ae@bSOtXwJ2WvX&NU$*GT$iT`N(SlGW)$o;jf*A+>>1djn=8ca@v>qmfV zAbQyQY%~3TYsh81la$fEw`I;{`1(Rm5+C#AuJPEK(Ou)QHKU)&d^|dQ0lMb} zA9r>!O%F%pds0kHVLKt)4)Gn#Fjj%E#!gp&e6eKVLd-% z&NY3ipidQj<9%}a#{0zm+Mi&n@`Jybv;F&IKv|^9|oY&prKL82SeKvX!L36 zQ^*JTNc=tzz`wy+`1zsHow131{kG8$JYTZnO7eWw1Yf~h!AbJ!&*)DeS~n$MeZ#i> zr@*fWek^MG98-#yGuCnnx7d@5P8!6zK`{0>= z)<*gU(+}+)9uwbaoo5a_(}#Ybd-03bk|(z@WZNK47=B@&T6FYz!B_keFlQetEuB-E zVm5u)7WV%&@etp1tFt^*G>M0b;G>zmw`X`hd!1dME{%-u`4q3K{lGaoN6tAY8fH$( zu0@W>mlJrW=i_x4yKFA)6IEWy9Nf)(Cf;222Oe*}+sM{4c~k44qM=39J()LS$kjsn zywc{KN8ZW235>&qdEajHVrQKcf8^yZ^jWf@KP^98Xr_3kKQp@$`7$%WTu{I>(f-WN z2>TsG$E=MO)?G>6zZcIDgYz=_i36Pm`k?bB=H1lz98zgx5%G!S`RkzjgUo@*575^i z%!M!Tl@&02v{_;u960GHcG@E5;{Me_0@Y^BDV&s*c&V|D3ji(3#p6z3D37(Y5yb zpGN+G7ax|=mp%%fi(-3oL&(7*Fj3cu}}v$JkP#WVjs-<8F5%A%TBUx#;=LrE`A623BK4q*{^B6 zDFz(@Tg5^a_P2vJNIR*##pL~bLEe><^0ttdG?TZKybl%RMQ@%^?>h35X7cI`nBjuF zmru%j19?e1sr@TPb|MG%Aw&1#YuUv;XAzF=1a7;5+g12RgEsbPGQ8eNJ%X3k7YoOD z1?h(OR>QlihsNi-*wFZV$36DxN#n;j-}Af82mgij%(nGIpA+hT3+aIv{d8DgV~tjG zo8wNs&iTt1o&M+f&3wuG9Vxi?(~gt&|Ce=6`7rK@z~|`x@+%cZ`=6g<;WMMu<8y4R zs;Eu-%9Fs%%7qpi%Xol22-=enfDXutG*RnFQSf}LcP^2?5pzQ0mD z2M@bNgP8+m%&+w2;F70^0~yYJ9Qv4SGw@A`AFe;#)aZTo4G!@H5a^52M# z2U?^9?MVCYLrnwe57Hm4FYQME4r6Qm9NE-n)B2{cz5Wo`N=_w|$Heh@`hdz!Wvg}C z{I`-H-p{Oow|3e6HIsR()#kmCydn7X5U`gldu+y2=+eWvKE|^b{`}cbPQUn|!H4$A zk1;+^AK69x#M$)sN^}eHdm-N5W$`w-KQY^%%hVt63GVW-n%5wMeOi(ny~5_zc{yj( z0WPz7S)aj=kjn04uZHMeXBidN>5{LAco_`ylRy3-GQOF;?amJ4zY+cZ3I2t`{FSy| zUq0-$wEmvA;=3Y$Wx<-hA4}uskzdup4h9C{5Hu}WQ)y}E9L8S z;GJ169EEV?ehj=wK8c^CcU3}D5!RGmf;NKGjZ6!hdfD@&SgF@qZ|~%Kp;y1&{g%J} zNpcgqRNIfa$Go|i`2WYEqnVNF@#m3+qnZ5$&--~kwD4HwF{QnRIsXv(wXfnau8-Cp z%N&^X+R8mz>y9*`8lu5{gnASG3!oKig}ni@sSjt>(Q!oM#(MYH|IrZ?X*!o;;>l@m){t_ ztKyD{BRqLNa*BZG@9wp8NU#<;2aSfJ51bI4!9P`gn)+XXpC%9?4u$^zkiL{~-D6_s zQ&}VXC==3HN#CXZL02ubQ;Y0!k{&Gl_e1tQ-_ts|*JTXV_zh{_QTq|%I(NexyNOSa z_2=d+A~uaNN>-P#_vn@{kpB_$T>$&Nwc)X^t3M;xkEx&MFt3D>cVAW75{EOEpUUie z;HgaTovG}8?o0ako@(Dytna6?7e=4T9pIgGWR7wX()`T9~>z9&ES z2B?9QMRSYgH$Y#O%`Q3>{hdaZKgJ$L#R_QdA6a-j6U6^z=!mla zas-{2cBZRuO$BuK7HBGt40c6##^)G5RDC@2Sb)7!^9GE)gAB`jNHoaWt7Mzjvdp{( zT-A4fjNUh)p|7ZX-<*vU88{K(s`!n&z6b4dzhC{LkI=MP6ZsqZrLmogI4^2_z~>`> zKN$LZ_|e+q$Q#Nbr4wcdRplJHnr290jxo;ozoTuwJb;rl)I@rgzO8TG56uX}N zC)z$i`HP|#8roL6+7oSa=+uk({sX6jwNDv&eTb|2lL8L99x8{<>5u4IaSiwVy*GCy zEG+H^7SQp@;x1&|9rvd9_A!Qj&A&ShZF*zx8#_vSrO}5@h~B{K^qug*J@U|`9XXy0(DyQ@#GH#Hy?}GROxjGFHkY)ZO^ezz=>;L1R%g>L zCT%}-|ETNHhw&lI#D~BdjM--wDcEPnz1m%8%T`eKKm?v4t=*=Tl6KIh_1Ux_Y1$wB z*zeKCUR(ATz*oGuPjsbuRz8li^zW;-?DLcrzdZVTls#h0{*bZKYJ`wgDkd0t|l z|AOa3?*^8C0NiJ=hY{E}+IL^#T_Abgn9hParF9zilAYq4T4jr<%gi6d2khhi>+H$e z;PvIJ4{&_|AHWE{GiYNGe2*LnpU>KQ3HK|wM?T-D{fQTIkAHV5=Q3sA#{JXK`P;ew zbM9-oew^$1T%SZ%T+h3u+<%ZX=JNZlb)}+5ciL zTd8u;Tcb_;57J`4M_ui<+>4ac+Qw_8lU=slbCjDyxv$#if8^PRyYclEz}@H9W90GS zO`P}1W47#f3(CSb6L992eY~J7{J_|U#$K@H52`$A4lwj z*}veu*$0XK65xz?e7xyXoH3`f(rEkBr<`NhNaox!Z$FFk1M^J%JP(?)8UrSccx`;a zDu)hspW}G@B>ZcBpKJ`<+s?y9b{-Dmvv?DG`)*p``3$8$RPh{W;<<_V5Ps4zgMCMc zJw%U<6ECB6rn9V(?Z*$}?L9w|IS|J$!|xEk$M}t`Ig;7OZ$H0B`5oYQkl)PRL&Ppf zS7I)wA1|}-O?s#F1wFsW^Qe7Ke9zb^o?B|YeXNJxeI(O>Y$eZ^CGsP>H4np)aTrSGeUW~ZyXY76ThE{7xe$h* z<@r@%$XEoYpGQ47{xW_fr*m;@N&6LPg2}JlBYc~B$Joo@WPtjvBu(Fr*1T9Rdnw|5 zdvs37lNmq5Zt&lK^LL)jj(jwJkl#|L&eOe;`v1$;f13IO6+>fNsJl4ec({_zk6smK zAA)qNnGWBR!9O&^WnGE(S46;t!}<5;IPf{~cIds*vzu%mj?o9%bT85F8oQ>vSba@- zww?0sw0V!(yczNq@5X+L4zr()IW{$%Tf=%2aWZ2oXw!+L(eEG5U4Jg?3{Boy38ImC zM!$SGcbdM)c9hM;d>K}s{*G&n`*3dN6`VoF+&GIhpIHTKK0)bjI@dvGB%EbUNHKF? z)qLA`-Pk<(sP(^VwRVPH@*d=g6UWaPAI=qz(1#edAhJn&c#(h1;SI(d^Z&THU*^KGF?Wq(6_zbU&Oy>I>YalJIYecV6JeWA?M_b`ql z(}K=z^0!y*w>W76C#A09`-aDS{GC4uf5&Xzn=StCpg+I0X>p~!0{)(@a9(^Ld3|_Q zEqpG={=4kWv>yRi$Ph?jZ5I2?#FB9y5Fq5dar+#J558&1Yk*PSeq#-<%&g~yhznuw zaU`7yvBsx;uCj|}a88!!Y8rG^Nxd`ZgXb?^n?HMarb*+>LY-k84Y9W0kev%&gYaP^ zw$61X{vdA7Z1DMW9_dZkLh|{^CX5t${8P`A$Hz_(H*Kf*k&i)~+iioafCe;S;KUwz+r zm_0)N-09aPJ6ZG_Vk~}|>i7Mej-g}8Z|{s#`3dD)2hZ|#X6}Qwy>p@AWn_=wf=?+N zNUt0d{bRf0Q(#{?I1z2o&Pj6~CcemEMMD-JM>sJ0U%3UGg&JsrMn<1_6KBM}iSvXn za7K^3$%#Kv9E_y`Cgu^p0WoC8ry6k7o_^oXDK6&g(QjwI!LOLMlJrsI)>VBCsIQ9A zOe;q716h}`&ZZyNaL@iU=Kc@JNBwLdvV813#&lj~_ zsRw^@`t+ySCveh% zj~QJ8EUy8VLFCpu%=j9zSIBmeE*1Ud3DGxa7gjCco#NQ!6Rbe~{VQpY?*4wJocb@_ zJD9n9x9Yz&3;jMD=mRH7e&9~Nf5kw`?*EdN8%~pSG}530`eO7B#c)EE#^5`hEvC=Hsi7b8 zd=Gd9xw0mF(wsGG&hw3D-%FilZ62H-Ux*HZ-FKB6%3dMZLf3D{Pv^ZInSG8G5 zo8c(@NE`CqDD6tdx;0Z`!fDoyJUku)>GoIm~`o5IbfJAZAxXT#RHrjz5qFf%;!7O zS_io~JD0vmS4K}i8690dc2D}>ei|g*8Rfjp(bVB`_yN8j6m4tX8ho5@8%KAgl{dsy zG@)~{be6+uXov~qyQMu^2VBb-kRzPQ$^Me8{C4W!DR`{#`{l9^!n7SC57+NH$$n%X zdasoiujR^l!h(f-``M$SJv(-t@f-yf`i|_jC8gl>DRc$C7Xkeh*?183(NAly@y=#9 z>yPq9Vv9KJ6;*#eAX<+}{~R7`v@-n*;8OJ2NF8l+!`Zpevt;~T_~YPBL%ZiOZvT75 zb7tc+ug3qVIg&W3{_5o>hHEbJqN$QOYnt~xyf*fE2v*Bz^KR?wB(5$TB%geIqNBT@ zFSQN7zNY$j71X~*`udwy+U?y&-)wprtGgH-!i@*9{C}0v8l|jNITcw|APDTp!-9X4*rd2#nHb_vcHLaO0iUC zb3g6Ur(b?HWPDkbe@cCiXwPeRSyn={W%dYE>fA#ECUG8eKo z^k&T?#5txiPm@krU}WOP!W#Eeqy-{Be15;J?{D=i*^SSQgS7Mhyu+lM{WaQK2c72O z*h3%h@Zcyp`B&td49ESXRV2@Z?dI4!y7c-7PefFa~Pv^PLK5yr_(v}(E z{!RA&Biz3^wjF#BlfeCIoBwX^XHGHJZqlb3>sHeJvCg!0Zzk<6_CCS=AJ}#_a6e~? zy4RDQuiMh@Eu{JN&ari^C2g*~zlr*Z$bo`2OKhl~tn@w2_gcR!#y=xE+@^UO9!T1 z=K;>F-GkoPptJd_o_U1+!n4H>QqKdc=r8kf^u7~?xa9#;Ci!oFD8&TGwFOoc-)BH~VT7M=+E7%ka}_uI8-#!=Aofr?p4sd{5W* z^Fl%g+){=wHQ2Gzp_op>AozJ=w7@sG*hU@uUXL3HnNcE9S(Iw37 z(7Tym9c%$-Ah&NC{yF?gqNO*>{{nn2tkz;l1LA%AhgqoT>w?gFebS=)u78%%R6QTXWj+%uIZ!%=5X+u+5+f_k;Cs&hhU_tSdcYTpm@{++z{c`yWT42m~K6?eW~ zx>s21N{47aFk>L&^F}B{zCaARVh^`jpEdj2%$RPlb>B(dbEc{r8jgsD(aj>@q9U#P z`>}5Zav}D04Z6$IIt!XO;j!Sd{u8C}1~TSZaFhuVLp(TbSsJ-w&Vs0j==|>Wng^?% z3BZ@gcQb~C%i-HT>^SV$NZ*M{+WS6yC|JkomuzdJH!#4$u{Mbx!QdOK-?zi|3N?T@D}@%@$5LEHlVFrH~o^4IV{65CMq zr{wp&MRfk@x9fR#I=fKtvhul<*w=d{e|GOdPTi_};cA;tx>>*>9`q>RSFg#pIrsLUub$C-xR{F66@j_iumd}kMD zQ>8OW=k!k%JGfu5Nz@@*bw6=Oj}|;D9?8Tm+4p{2((5VX@2R?jZ)=Gj)+|18LiDg^ z$%zxytQ9m~fNsMa_O#u%D*96YBFKOXvA3+>COi$CgrL>8m3ZGi)wd8M%wK(iHP`dp zzOh;Gg~q)v@^rfJ3|PTO>m`CuP1&wAa@D}$^fl*GXB_yZLXxwSW5MG`qC-~ymG4Uo>L4(Mzlaig4$j({F=i4T= zH>;q%ZM=Job@UM%f1i+940@6(*&J`F#>C%jktYS+)JZ}KRw#t^pk`{f)X zE6q1~!+x44KO2nhq%wCDl>g8F<<<570#1$I7z4-9(s}WLF`w>*J0CBS72?DHP0X{_ zM9yQZO4EE=h^L>)ZwuclPI-TjIUKlr%jVS_t>;C0ws{T&ytLEA#}~Vv?@RLNDP+EE z8Rh>Xu+$!I_$GwxoSpkl|P5}G=Gemcx`Vl zRo)MaycG{JRzok2&HI-HdHp%UFXP7#o>4jDK8eh*#oTeTpaf9h8Av5SHvDW5`g7XKu9H>=DWWdb zGhgK_Ui`8q78IYgV$cG_SXN*I34XjkjF0p%y8L0@9rg38t?$v6>br>gq!)-rBx9x9 zEU5!e%j&aV0`AfomG4&IF21|S#kWkFcqR8&*wf@W>E4mD*d{&pl3^?4SNM-)qS0 z>4Uk{FHgU?rO0{lgTKYbvGp_mz+0Sy$S;S!&Up;TWzXJmN<7=U7vCl82=bX_b^fx> z3Ym8$?-tf)Kg_odf>o((r)BF|@c`epq0MkJH4A zmCSR1V}oQs__?>0nR{>_R%|A+&crw<|Hq&!zCmT^=xXRxbgcA`96bFZXX=^zd$|8G z_fc?IW8*%hpEg=Ju7i$t(C(aw7qfcrf9n3>oR4cK0v;m6Iq54#PeET(lk%Uj&v#PCY0i5w-(MwNvhEJjr29($(>EG*MlIiCOIM&X2GBo(E`Dd-yR743 zKXtqR_S1+voNJhK;zWh6w8`1(x!G4EgVC3!>d#kg`?Kj!4LFQi+I8)?%g~=n`A%U; zPQ*{|*Et%nDW47GCqw|`0!GdzqM{3ABqL{pbbk+AZ z(x=nE3+Uf^TgUU%v42ut)q(G@sxT(@Z1H9JxKQF+Sqovky${`Ze2qYT@%D4~WnK@i zhHQTi&|eomR($Wz>0`d#*AVx3G5DDQEmU!><@=*6oD* zH-n$^Bgb>+6*1ppYb+@0LA;3hzFsA=DRTO!W!R=Qa|SYQWq;;LTYehlSueysZpgl83fO4A zd)ekKA+Hac5cmIGusOwi{NDwe=cr45Bl(78J64u^bo(PS=gZgMkY#(2@YMb}ldM z|6gQcH*M%l3CYB7(T1rP+f!})cgnn5X{S);-OTeNv@01fSiNz?W_N z1IP0+&6j7($>YnjYq&QsyEHUrcn%#D`V0HA>>a!>)p!fOF*;eMEg+9%+IN0)c9}Mt zyuM7ECwwxVLOFIZ?|ojK!M)*C3*V_^i!Z0nC9mN{i|?uO`f?~pUSAHKMyC{=NXG1+ zMO;7SeHrsI?~uDj#w@peEtD&#c<=Z1U$}p*eI0uZdHufrh`dwDh3}J&y=3G9YqEK{ z@OPwZZ;fO_p8rXc-R;W<$p+t75&>uHF7@W2^%qT=hpfDKl=6l0V;|4H{7_u3*4UjU z^k;O}#j%HT2OfMbGvYp-iH_n=9UacSgEMudQ(p>Q?Hmkb`#*wR(1%@+B>q2&-Rp9; z0lH`jG!)0Tt-RjpUh`$`60^74hx&|4Oz}*uL@FLc~u_YdFC0V8MvmIj|E@Wp^%k+T&>P~l)pci zN@dtvmg%W`E~hmKouw#Ww$1{oM1Rm+&Yq>|1hIt!N%=)@<@tT)TP69%UJGW+^z(83V$nzMrl5rNbs>sd8)%`r6a9QA+tr z?2zYeUlvgR65{MW_iN8~`YYOI&&A0i^2rueyxc;3<}-kca4Vdag}wRht+sEY0J2@>{llyXJ7P4T4!-9j#{#&h(1Q&M;-XQ0}kov>+;v@TXw%= ze-FL~{E5VYoBgyqI2)IkboD3c#l)1xG(OH9U`*xj8Xj}GUL74)%xSK2G5Z>@RTp!Q z-JcDP;LC3s&P8LxxtY-Syrze9W!x8$=8O!Rbps#&g3AoXy9B#UG*CfYi^g2Sn3vcw zk6~jf&-b8p(N{lXS1e74*qax?gZR3JHli_bMB9qVK?Xk?VodF}j_=z#zGdr3Qby|- zqMHCXT1@@lAx}}{J!9HCH;eMuxY&`L_jAt3U|RSuS%~c$_#>^oWY8_{^WqZL>nxD_ z)W82p-F}_GJa7y3`ul>uuDXHmTG|ao?*qR0sDQ0_rYs6<`?Rm{=k$lO3HUa!x0ZOD zjUR(H7*~Kby>j?QJfoOP>45U_D~&ViO?t4x?DP5ZIq_6x8hFzB#RzA&AU9Yq@Nj2f z-o$w5&rHDs-0J?$g8qv){Jsy+cdb!FAJc$K)k7Ah_mD1pz=J1e0!#6R>;%z>+7tbp zL)~{{vnwC#E+-Wu+Yo*6#LwTgVob3}-7(fIBKWm!otvohYVuE&?@Fb^H^+bF@s0ML z>I_srCRFPYlC83_vA2oQo`wDN9DRY0?D&Jgn)hQr!p9&vrS*uk@56y76tj9Yzis^X z^E<__rg|`c2EJf5AeaH)!g3+t=f?qD1?={Zu}(Sq1J0oNK!zB`ssr3>?ND&t$2+B8 zPP)#TQ#v#pKA6DF|wFBzCF zqK$xUqk0AFX5M;Xko7`+*Z3$tFUg5IV30%~RxHES;JpM{j4#^wRWEqd%kxf~M?NKJ zJre+C!KPHEmh^Nb?O?;b@88&y4Nm<1x90$d1JG+Rep~fN=MGUf&%nwxK2zh*oFg1S zQ(8Y%`-*dwO!mj;*3&9!Tp(qD%0a_4}lli=t{T z=Hg(}VfL~d&J-mFnVXT#qrjRU--F?qb27P#wusL-aT=K|9#@}!t2IyCzx*11jPV19 zP+uzZGrb2E#mFjX;?t-6{HzV8=Kve*T*X=x8$9nhAst<`^V7n7mTnc(P;C0kxu23N zY`U}+a2)Nu$yY78c#$?POCgZEDO>1rT39cGTVN8bP!r#(nP-7{G$x!;?SL+M$ zYZY40j`WRbJ-T>S!mNvHfBsD9s1$lDq{+fDI4*1W?qJTxrFpl;i_0+I?IspOu`XKI zEVFSL_<}RRcAz@M+!qJaSh@BChmV=)f z=9zUCPs-!R&Ilj3)28sGzWM7IO275h`tsj^r^2;TC;HLcKF-I`_sPzRKk~_rxQzAP zQg9QRj6dey;?V)(6`p=x=V~g}Tlo9W{T}{iGcMsz>nF(p2+N*c9a;OqZ!9ljL*^BH0r&O>jBaZ_8-m6+sQgM*T?QS znz>{f>y}+dGyC>Y=5y4CKKbaZqnQJ>M>E7ABfFeuFO3olNDRH=rFGsOGS%QnczNk% z={yhT&~IOaukiOX_sTW^U-|RrQs9a)8-7D4`HIf+>Jz_tF(6;o^GI5;?s=Rk2Bg%= zMd3`aO4)oX$X5v0bv|52#^EYi$KGFbaQ1;&-V=OveuiNCJ@%iR0bAam51eL3iJt;i zW$*A}qxW$po?yGrIqbo<8rZU4@a8D6MV4O3^#EyqweYsgLCSrT>mja>J#sX2*_VJX zaP{e{bUNd@V_CYCdHEn`weJJY`}gSk(ZHSi1He952=~Z1+;vWhctdc%AGm9bw=u@R z2;<`3@QCK&xY0pP?4QpU(0G2XdL_OPjIS%m7jRP9Z?GQZ_q|Yl`*RSs+_ULcXto*I z#-4}@)=C1b;c12wF zj16aPm>8Sg^re(>vX2d2HD&aIeFbqZ`&eH;Ta1g=#9mJs$2mXK=T!Xcyi?MnfpO&g z%mMeaxnLwfY|1ElA?Gffx}0~!vXH0GDKmLh=D*Nsi_$laO)uX1AJd)S&raVy|DXT- z8>~6qPK;pqTQB!GpUvr9;YZNB+PVKA>w1y%r~PX%JerN1ANbexq(#oJ_}50RjS+tC zXLE|DaQLop5xODsfT4>R?_<1=nfDXlMR^zHofGNHsedz0eKzL?oj~l)Kz|KC=X=qZ z%kTNC0{wHi#`q<uL66O80i$^D{***JFMB^!>z#pFfCQSCoGE`O|Ox)(aKX z9dOrZ4|Cv3eGi4c%|iDHI@2<<(QVEPPRsUBO9jfzezw%~KyXbKTWn$Ag4DuLZE7L$ z(o2H@FRee4S~wW>(j0hGbp@Q5OI&L8Biuj2{pY!_4#YFnftWkHnsn|T;r{d7%hsG- zJ2I{Mg48s{;08rI;2+uvp%YIx_hoCc)iYAn>`$Ie8;b(iR@IfMYQ6z6D}w$)*=oN1 zHLHkw+8ubr9oQWWdi8kzjP!KHFUp>z@8J->~TWrP-IzJ?dbgq>7}DC z@q5k71*1!NcA_K5lBVV8ewnvfIL#}BlbZ^$#%SQgK5zr4;H+^tDNS%1a4nqR3)MyJ z8tCl(aSV`;R-9)K(1d>zg~AYZDus8=AYEWyvnCcRSbjcJOO=mi2CO8WKt8 zrj{P(#?CvPxs;H_<}@_-I4f?tvEioGE1er}UcI_* z<$Il#jrA+nGI8Iy?1q&M@ntJk(%#y-RSoaab=eKP;dNZ#EHdpF4SL#l7b@aBkbAm-% zN3XlFv&(Jn+B$#3h7Iog`R<*GuI{$Z4tMqyi(Gf!Hge4G?7q}>frAU2Tz9csyKrf3 zbm^k2T=3x5Mik%SrL#3b__*`xWyvtH53S8T&8FB{%7vki zwhlMh)!CBh?$(&vJ3EtY9h(*`SU@UiF8?HY!qCm8t%;7F<{km++UDMN(inTPxudOR zDby!8P_V7Xo$t1FboXxD*w)fU0SgHy-r3dTcHiCIli2EZHFvn3y*&cfR+?zulyEy3 zr)fVNUe@03_I4+_{9Xao&CPcv+?LL*$@WA~qIE%-@rLPPOIL#abZl~)-R{ka_IAO^ z+;9zt3rEH%@|nG?%DeEY+64=*T(V%{f`w5?sNlKw3P{GOYwK>_(4KIY-LPoU72Djq zntNI{w{~uFd)l_ry@g9%@~p7EV))Md`Sc=*rPiJBK%zPl-7Q^hNr4RtaGY`~O}01R z-3^o=!>t}bH+FSyb$d3`)Y`b)(%iB+p}aSlV%=Ujukv!Y)hkc#HUL9=ZgWSgo7mO{ zLio#9;L%$H7)!YEHspotu8OVwL+b==w94v78YCcSmRT>HN>K7yr!)7<$B zuaF@3E{6TL8QhU?Lsw^WYfCfYg1UKz2RF8DXl_FWe|l<4B&hGi?{e`B70T_5h^w{nQuUA5wdxVy4tbEo8%!~}rvLefEEn>)J= z0hU`_l|z;yxN+3Et(`q^uiKhvY1`T?X05xi0b=jy=1>C|5hQ3C)U3*V00K$V z*Fsp2SB=~R2c~OXiA_k_F3VHRZS4tDQ13fB)kdx=OX zNT*G7YeRF(7E)>5W_MvaaDAuY&%*xrxL5yotqk<<<@XtW<80&_yd%4EV6Pkz7b((-ZgfqT!S%!zzmklDu*v$dC}rL(ua73wl1takF)_2@?U zO>}jkaC9d+T1D0BmPfOiN8n**GVj^TXQ;EcHF>)ky5A0^Ay=P1CGvTlfDlEsWKug_ ziDdiTOb{D4qR_a_kS{uk_u9z=11+V8sjS=W?rqVezp>ZMn^V#9yzWa4?!3C8JrtR( z%{$6H2AQJwzK1aV+fzC6K%Ey8d9^hT)6NY&(odS*_Rf~( z_5yj5@0SNN4;Hoy`F8@MppLNGm=^|O74ui7KmTF;S{9l3SCs#=>C4PtV2VF4!*cT% zoZ?UKMa$8JwTl*CapgOfT-Cgxr8R-XElgXsd_~>LYn3)nDk}@-HLC;t0VUkSnf2W3 zww3!OHvJ3#!|9LNbmt>Zf4#jQ>390$_I~w%)4$H<-_L!MO@Cp~>ECSAAG+7+PuldR zVW)qay+5$q>F=}m>mG9YhwOddr#U;{-nW0o>ECPbRp&$YKJuW`{{?%0h<3kf@Ar~^ zz}{CZb@~t4`zPP&^dGVJ(QBOkC+)qn!s$O|?=eaGpRxBnt0uNp*oSfPbhbOkx%jq) z?_9KSD|+MHZYH5u`k#E!cP_eWtD!N7265;AYuYeRO3{rc4s~Pnqs!gPU3WeIx%Vhd z|K7uY>vcn-sv?7zm%GbNR@c3qOt+itWbzA{l73z?n!3$vDl@s(t8Oowx%28Zb(+lg z++ZG)+M+*Oy~mCD3x>qz!WDY=XGUMUaq*JQHqjg^q_O%KX8$gpr*+B=z#)F2ap zk#H^8$1Uv%tZaA@9h-~Onz*yIcWctIA`rcz&CIu+Rp2;V+GK$`4#uI$$F&>%+(|M^ zcef|7%$fJl`L|M=lxK<6+qZ7*RT*_daurjpwFNCkY0X_pr!6TBi*$sa(vW%jnJ(z+ z30>JkjhGiqApQ)-1ksf+riCMX%9{Y(3{3sG_BH{N+3Ee7Ywzl6lYvXyJ<^bkrORt> znA&=n*`yP413*&t zW+v70`OU9TXQ$iT+tVq-u!Vlk$EhHHfjZ!XpF_yRNcyYc6NBN8iTVU9E&Kb8G5^lqX;Ab~&*rMf=Uz##^ zZEkDX4Bo(3xo`1Jt~~6^DpiN=-qB4L@ddRS%}k_X$kd0Ps9+O_Z-&si!AYBxQmboH zL%nzsAk?@85>WWKtFsHGkP#bkXyu`?K~TCj`$KY3!Z0x}F?|V70*+x$-sEj!H@>P) ze2B@nwXFks7i6vDhJ59`cFWZ`S6a@$(-`t)JUz3cvtxd1+a@%*ao-QcOg{>EQsT-u zC8UNFG*!sACXelf(KJ=Qt)rzAzC?QafaIiF&nM!pURig$1OTFfF?e%Cd1G%^hlYdd z+tD*0pHiY-8DT9+4wQPv?H62H-n#WeHSS&Q%^fvZQFkS}YTTB#?v~EG>=gnKJsRU_ zX?b}k*-Q-{|9JYMbV{E?!VVQWs!!!ijaJya4UNmzHd4)v*EQA)mvzh*8n>4+?n3muhXPTT=if3S72JbfOZyO_ zSDSBO&)d-1v)NDc=2Bp$mSkfaVdk+EB^kc8!Uf;WiEW;qFPT{0wh4hiGdT8o?soA+ zwQTWbQ`?Xyx`D68QeJMm>h}Vp!{gb{P*pNj!nSH_7{GLF4-nWo~~RR*S*Y{+u}HKQe8&R z-rL-cJBj8JzRMEt<)*|t<)U=wZxnYK7nBA;k|r!yR6X@PWuc|AQht(MZJJ6!tARne zF@7a2J>RYGzsifVSMd3*u(P0buZ~ks4^_3b7zd&+)L-#R4+?z9^E|iIr9xKT5v@+X zLLSXB%&yQDM2pX)JBiEU)$-qoL1vt*TM}Jj_sxmsq%CD&Vf^N+=|8i}a_ZjVqs(@7pvH&b`WbB5X?7xy=`9tLol0xApyo3}jOK zgbsYRNeIaJjzb+CXnJwJanM$Jg7Yluk3FCCc zD}b+Ok}t74>>@guip^9;xy=bVA)&|)Pnkvtdd(VEHLz>&EPHd$Fj{+C5>itg>5cd| z&HY9_;Pl?847%!>RSk1x?ZsSKdofqmUQE74_PW?!agv*Kzg#WPsz>>BRX$z)e7u)$ zZ2h`Ge=9%v$7D;kbKk@79)9C|Q>YU(Z$PbdyLvl1WaC@Z7)c~WMq@KxulWnF1S4`- z$=9Uc!YKdDH~;bv5Mf$?mKxeVL@Dn+-Xnl`_shW_cue9j<1gOTCY9UjMm`zMpRY9e zyQo<0sVN@#c}qF|W$qGaLmH|}e$d}4-(7cacT&%HH8cHkMOc{ul-DI#6_}{}z)j0q^1c}$V#(EWYQ;U;oluk}9nHZ;z$|4NGb*h=D{FRW@9fxQ+;fHbm;$AWZ^eQ{ zA@>T+Z6({~JY4QA4T2-NvX?rSdpDP>t;>z)>2fb0&;NteE?^}eytNt43YohSDUKxT zapU#30`UCf>b8z8;@6v#3*3ezeltBRjNY&zX>fVAe168W=Cc|7=B|~_R@aMc@YWXm z^!n!ZjfLs*|1a~GSD+t;#avjsPUF*6w6nQ2=|*dOEqSh~5FfJq#wglbd>{VCHd*Ir zR(aXJfn`9%jfIn3ahfkZ=z2x1Pw-r4rSXx9OT^)YS&Uax%WF;}tRgvpT8ImBv*uy< zt~O@#!tD7P$Md)LGSB8KH8yB#LQ9F%+O@G83hn9YY+veb#G7o^H=$us3zEC7l{~ip z{v2nQG!3s7w(N}-yNK1p1qDCH*F6gS$Z}5nJF;>~Z<`XdUnTIp8+k156{ zd)mP4TI2W>*byJdKKZG~F_&-F@tE-J`8HECRzIUe=k?Zbwb<-#&>T%_`^MG{22eg# z2&EpbO%`>^mV;ap+x&vNZ@- z1&!Nj{9NZ+<6i>#1uwhZc_bjwXbX3^$Pj#bb&L-@U&VMG<1f2a%BS5aaHXD$&3v3s z;uAx!ma35}Q}Kz(;_-><@!NVOKABh}@@ymK)2jlXweeck$)gJvEx2OgS?IZ-_VF=I zq+>6O7Yxvy*xH=jjL9+H?U*nebl=)_o=sHWcx!y+q~v<+s!2&s{Y~+P$!Y6W)r}`D z@hWUsxuPK7Vv~67>SfnWPF&G$q9;}rbjj3kD|0XFAZONV*0|1ma~)deT__e)6me`D zlLG;khH)(0C3$E0O*b{h-3G6ADO;7YT+Xy08ckE{O%GBMK{aV48@-mK{C+|s5Z z7OEZ)4D1_vH)yuJLF?I5y+M9{$S=EY_f`83Gc)_AtgS4AF zwsdsf)!~{xbb2u>wo2#b4r8sE>AR<^ErG-}*(_rgPHl>1G4F2D>`#YK@{AVMmSkZ+@FL>?RW!K5r zZERfa#@F8Du6R$w%{M4vRs8mbwJUU~YiLyWskgkGq}$^-tm+6roFBi5JN|5irYJep z53NIaSC@7Xm~LGENKCqM{d1EbMx71y%cz0SLAs#Z#`rS5XlvP;ynXAIgmCix`hQFOGzds1{|1hJrDX!u5C$V1HA4wDT-;;@@9vA;U_P9SY zsC}#7**U5$DNoOM&hZJ#v_pQn)h1`5EoU?jvuf|7fl666v1&rwheTigP>g$o_u&GL zF*Z>?TnGsH-WSGJphqqs+>v-qBQ_NVXQFVuB{Uk^a%S1zQ|lkSYwWUNI`j zeK$7UD?|*LLN%`HNXXpjL9X$nx!81h@wQ8ATK22Ww5NLqQ^Ao{wwgY+cXy4jinC-?{jeI!;Wo)6>~) zZ25)TYTTY4b)m*3%u5%9j#h-2*T}cAy_v-z$GNTU+V`t(x7}c`7~=_(LKOPZ1dGF{#Jn zZp#+D$t?x|$`HP-XJd~SqOtJ(CQf9n7t>F+`Z!s3~}|n6C+P z+hiPw2Id9T-`p+1V`g4U0KF!QQ1iy$8xVK{0&hUz4G0uKfc=2ZTlw*w8*^pf-Gr;& zO-_6A>OlW7e#iMe!|%uZ()^z1_X59{_?_bSOMWl&`z=4`U4i~0er5bB_(k|t@}qk5 zH-r1+mz@4z&hUOUUv~N%zvA@2#PiOS)Bl-2BYy9*PCxs8>r!7N-j7lNTh^tlU#{?~ zvi`H~mEFH;-1?hG+28)9*N)z${ugZ>8h=*W)%(1%_tju7AY7;S#X>EHj|iRE4x^~z`rDpRa~_^YGrwkOHYFUju^ zzcjzXHvRVevL#+oXEkM4zeN1wznq!hFTehuC$`I;E%UdIvgx!}ZVA`E3^9q%gC~9m zcy8o*a=T@e6rP%1N7-`92~V3}M_JAK!c+2fls$)X!qc|bQI>OW44(R4N7-{JD?IId z9c9m>oba^!b(B4ya>CO?ucK^)a>7&Ub(Eb(IsJW!vOE8YxL1BY4Ni4cUZ0*X&;x(_ zDLeE7uiU9)@X-&6nf(W+zk=Vkr;!uKiNF2+M0%c1Inm^y*HN~Ta-zv2ucPdnC?}eH z@^zGbGv!2+$6rU;3n?er@#EJ~R&ctEKX>K26)WS7t8Ti{)g%5Q)}mU`!;S84{ALUA zx^--E*P0C}a>(qWY`&o%a7eB0BiL-RkS@ e?HlFZfWR9Ncmo1&K;R7sya9nXAn@M{f&T-^I0&}@ diff --git a/compile/xinu.boot b/compile/xinu.boot deleted file mode 100644 index 523060fb6f5c5adb03c3cd8144ec6145eb8f652e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98368 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%0AgBOa|OrfPBYk?fFNvjKLM`{o@_ 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 ZOv{KGveUPQ#@)J%z@{|P2_EocA$ diff --git a/config/lex.yy.c b/config/lex.yy.c index ec1152a..e69de29 100644 --- a/config/lex.yy.c +++ b/config/lex.yy.c @@ -1,1917 +0,0 @@ - -#line 3 "lex.yy.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in the main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -extern int yyleng; - -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno = 1; - -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 27 -#define YY_END_OF_BUFFER 28 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[60] = - { 0, - 0, 0, 28, 26, 23, 24, 26, 26, 26, 26, - 5, 6, 4, 10, 25, 16, 18, 14, 22, 15, - 19, 17, 21, 20, 23, 3, 2, 16, 18, 14, - 22, 15, 19, 17, 21, 20, 1, 5, 0, 6, - 25, 25, 25, 25, 8, 9, 0, 0, 0, 7, - 12, 25, 13, 12, 0, 13, 11, 11, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, - 1, 5, 1, 1, 6, 1, 7, 8, 9, 9, - 9, 9, 9, 9, 9, 10, 10, 11, 1, 1, - 12, 1, 1, 1, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 1, 1, 1, 1, 14, 1, 13, 13, 15, 13, - - 13, 13, 16, 14, 17, 14, 14, 14, 14, 18, - 19, 20, 21, 22, 23, 24, 14, 14, 25, 26, - 14, 14, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[27] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 1, 1, 2, 3, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3 - } ; - -static yyconst flex_int16_t yy_base[62] = - { 0, - 0, 0, 71, 72, 68, 72, 65, 61, 12, 62, - 30, 32, 72, 72, 0, 43, 0, 25, 0, 47, - 0, 0, 0, 0, 62, 72, 72, 40, 72, 27, - 72, 72, 72, 72, 72, 72, 72, 42, 0, 44, - 0, 40, 37, 39, 0, 0, 37, 31, 25, 0, - 0, 22, 0, 72, 14, 72, 0, 72, 72, 55, - 31 - } ; - -static yyconst flex_int16_t yy_def[62] = - { 0, - 59, 1, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 61, 59, - 60, 60, 60, 60, 60, 60, 59, 59, 59, 61, - 60, 60, 60, 59, 59, 59, 60, 59, 0, 59, - 59 - } ; - -static yyconst flex_int16_t yy_nxt[99] = - { 0, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, - 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, - 15, 22, 23, 15, 24, 15, 28, 29, 30, 31, - 32, 33, 50, 34, 35, 58, 36, 38, 38, 40, - 40, 40, 43, 57, 48, 56, 44, 45, 49, 38, - 38, 40, 40, 40, 55, 39, 41, 41, 54, 53, - 52, 51, 47, 25, 46, 42, 37, 27, 26, 25, - 59, 3, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59 - - } ; - -static yyconst flex_int16_t yy_chk[99] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, - 9, 9, 61, 9, 9, 55, 9, 11, 11, 12, - 12, 12, 18, 52, 30, 49, 18, 18, 30, 38, - 38, 40, 40, 40, 48, 11, 60, 60, 47, 44, - 43, 42, 28, 25, 20, 16, 10, 8, 7, 5, - 3, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59 - - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "config.l" -#line 2 "config.l" -extern int linectr; -extern int brkcount; -int skipping; -#line 501 "lex.yy.c" - -#define INITIAL 0 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy (void ); - -int yyget_debug (void ); - -void yyset_debug (int debug_flag ); - -YY_EXTRA_TYPE yyget_extra (void ); - -void yyset_extra (YY_EXTRA_TYPE user_defined ); - -FILE *yyget_in (void ); - -void yyset_in (FILE * in_str ); - -FILE *yyget_out (void ); - -void yyset_out (FILE * out_str ); - -int yyget_leng (void ); - -char *yyget_text (void ); - -int yyget_lineno (void ); - -void yyset_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap (void ); -#else -extern int yywrap (void ); -#endif -#endif - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex (void); - -#define YY_DECL int yylex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 10 "config.l" - -#line 690 "lex.yy.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 60 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 72 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 11 "config.l" -{ skipping = 1; } - YY_BREAK -case 2: -YY_RULE_SETUP -#line 12 "config.l" -{ skipping = 0; } - YY_BREAK -case 3: -YY_RULE_SETUP -#line 13 "config.l" -{ if (! skipping) - if (++brkcount == 2) - { return 0; /* EOF */ } - else - { return DEFBRK; } } - YY_BREAK -case 4: -YY_RULE_SETUP -#line 18 "config.l" -{ if (! skipping) return COLON; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 19 "config.l" -{ if (! skipping) return INTEGER; } - YY_BREAK -case 6: -YY_RULE_SETUP -#line 20 "config.l" -{ if (! skipping) return INTEGER; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 21 "config.l" -{ if (! skipping) return INTEGER; } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 22 "config.l" -{ if (! skipping) return IS; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 23 "config.l" -{ if (! skipping) return ON; } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 24 "config.l" -; - YY_BREAK -case 11: -YY_RULE_SETUP -#line 25 "config.l" -{ if (! skipping) return INTR; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 26 "config.l" -{ if (! skipping) return CSR; } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 27 "config.l" -{ if (! skipping) return IRQ; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 28 "config.l" -{ if (! skipping) return INIT; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 29 "config.l" -{ if (! skipping) return OPEN; } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 30 "config.l" -{ if (! skipping) return CLOSE; } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 31 "config.l" -{ if (! skipping) return READ; } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 32 "config.l" -{ if (! skipping) return GETC; } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 33 "config.l" -{ if (! skipping) return PUTC; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 34 "config.l" -{ if (! skipping) return WRITE; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 35 "config.l" -{ if (! skipping) return SEEK; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 36 "config.l" -{ if (! skipping) return CONTROL; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 37 "config.l" -; - YY_BREAK -case 24: -/* rule 24 can match eol */ -YY_RULE_SETUP -#line 38 "config.l" -{ linectr++; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 39 "config.l" -{ if (! skipping) return IDENT; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 40 "config.l" -{ if (! skipping) return yytext[0]; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 42 "config.l" -ECHO; - YY_BREAK -#line 913 "lex.yy.c" -case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), (size_t) num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 60 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 60 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 59); - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up yytext */ - *yy_cp = (yy_hold_char); - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register char *source = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#endif - -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve yytext */ - (yy_hold_char) = *++(yy_c_buf_p); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void yy_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ - void yy_delete_buffer (YY_BUFFER_STATE b ) -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ - void yy_flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (void) -{ - int num_to_alloc; - - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) -{ - - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = (yy_hold_char); \ - (yy_c_buf_p) = yytext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int yyget_lineno (void) -{ - - return yylineno; -} - -/** Get the input stream. - * - */ -FILE *yyget_in (void) -{ - return yyin; -} - -/** Get the output stream. - * - */ -FILE *yyget_out (void) -{ - return yyout; -} - -/** Get the length of the current token. - * - */ -int yyget_leng (void) -{ - return yyleng; -} - -/** Get the current token. - * - */ - -char *yyget_text (void) -{ - return yytext; -} - -/** Set the current line number. - * @param line_number - * - */ -void yyset_lineno (int line_number ) -{ - - yylineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * in_str ) -{ - yyin = in_str ; -} - -void yyset_out (FILE * out_str ) -{ - yyout = out_str ; -} - -int yyget_debug (void) -{ - return yy_flex_debug; -} - -void yyset_debug (int bdebug ) -{ - yy_flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = (FILE *) 0; - yyout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(); - } - - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * yylex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *yyrealloc (void * ptr, yy_size_t size ) -{ - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (void * ptr ) -{ - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 42 "config.l" - - - -int wrapped_input(void) { - return input(); -} - diff --git a/config/y.tab.c b/config/y.tab.c index 32a0936..e69de29 100644 --- a/config/y.tab.c +++ b/config/y.tab.c @@ -1,2169 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - - 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 3 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, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.0.2" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - - - -/* Copy the first part of user declarations. */ -#line 5 "config.y" /* yacc.c:339 */ - -#include -#include -#include -#include - -extern char *yytext; -/* - Workaround for type conflict resulting from unmatched versions of flex and - bison (lex and yacc). Force new-style flex output (lex.yy.c) to treat - yyleng as an int (as done by oldest lex versions) instead of a size_t, by - overriding new flex's yy_size_t typedef. -*/ -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef int yy_size_t; -#endif -/* end workaround */ -extern int yyleng; - -#define NIL (struct dev_ent *)0x00 - -#define CONFIGC "conf.c" /* name of .c output */ -#define CONFIGH "conf.h" /* name of .h output */ -#define CONFHREF "" /* how conf.h referenced */ -#define CONFIGIN "Configuration" /* name of input file */ -#define CONFMAXNM 24 /* max length of strings */ - -FILE *confc; -FILE *confh; - -char *dbstr; -int ndevs = 0; -int currname = -1; -int currtname = -1; -int currdname = -1; -int brkcount = 0; - -struct sym_ent { /* symbol table */ - char *name; - int occurs; -} symtab[250]; - -int nsym = 0; -int linectr = 1; - -char *doing = "device type declaration"; -char *s; - -struct dev_ent -{ - char *name; /* device name (not used in types) */ - char *tname; /* type name */ - int tnum; /* symbol table index of type */ - char *device; /* device name */ - int csr; /* Control Status Register addr */ - int irq; /* interrupt request */ - char intr[CONFMAXNM]; /* interrupt routine */ - char init[CONFMAXNM]; /* init routine name */ - char open[CONFMAXNM]; /* open routine name */ - char close[CONFMAXNM]; /* close routine name */ - char read[CONFMAXNM]; /* read routine name */ - char write[CONFMAXNM]; /* write routine name */ - char control[CONFMAXNM]; /* control routine name */ - char seek[CONFMAXNM]; /* seek routine name */ - char getc[CONFMAXNM]; /* getc routine name */ - char putc[CONFMAXNM]; /* putc routine name */ - int minor; /* minor device number 0,1,... */ - struct dev_ent *next; /* next node on the list */ -}; - -struct dev_ent *ftypes = NIL; /* linked list of device types */ -struct dev_ent *devs = NIL; /* linked list of device decls. */ -struct dev_ent *lastdv = NIL; -struct dev_ent *currtype = NIL; - -char *devstab[] = -{ - "/* Device table entry */", - "struct\tdentry\t{", - "\tint32 dvnum;", - "\tint32 dvminor;", - "\tchar *dvname;", - "\tdevcall (*dvinit) (struct dentry *);", - "\tdevcall (*dvopen) (struct dentry *, char *, char *);", - "\tdevcall (*dvclose)(struct dentry *);", - "\tdevcall (*dvread) (struct dentry *, void *, uint32);", - "\tdevcall (*dvwrite)(struct dentry *, void *, uint32);", - "\tdevcall (*dvseek) (struct dentry *, int32);", - "\tdevcall (*dvgetc) (struct dentry *);", - "\tdevcall (*dvputc) (struct dentry *, char);", - "\tdevcall (*dvcntl) (struct dentry *, int32, int32, int32);", - "\tvoid *dvcsr;", - "\tvoid (*dvintr)(void);", - "\tbyte dvirq;", - "};\n", - "extern struct dentry devtab[]; /* one entry per device */", - NULL -}; - -/* Prototypes */ -void yyerror(char *s); -int lookup(char *str, int len); -int config_atoi(char *p, int len); -void newattr(int tok, int val); -int cktname(int symid); -void mktype(int deviceid); -void initattr(struct dev_ent *fstr, int tnum, int deviceid); -void mkdev(int nameid, int typid, int deviceid); -int ckdname(int devid); - - -#line 179 "y.tab.c" /* yacc.c:339 */ - -# ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - - -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - DEFBRK = 258, - COLON = 259, - OCTAL = 260, - INTEGER = 261, - IDENT = 262, - CSR = 263, - IRQ = 264, - INTR = 265, - INIT = 266, - OPEN = 267, - CLOSE = 268, - READ = 269, - WRITE = 270, - SEEK = 271, - CONTROL = 272, - IS = 273, - ON = 274, - GETC = 275, - PUTC = 276 - }; -#endif -/* Tokens. */ -#define DEFBRK 258 -#define COLON 259 -#define OCTAL 260 -#define INTEGER 261 -#define IDENT 262 -#define CSR 263 -#define IRQ 264 -#define INTR 265 -#define INIT 266 -#define OPEN 267 -#define CLOSE 268 -#define READ 269 -#define WRITE 270 -#define SEEK 271 -#define CONTROL 272 -#define IS 273 -#define ON 274 -#define GETC 275 -#define PUTC 276 - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - - -extern YYSTYPE yylval; - -int yyparse (void); - - - -/* Copy the second part of user declarations. */ - -#line 269 "y.tab.c" /* yacc.c:358 */ - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ - || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 4 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 47 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 22 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 17 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 33 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 55 - -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 276 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = -{ - 0, 118, 118, 121, 124, 125, 128, 131, 132, 135, - 138, 141, 144, 145, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 162, 165, 166, 169, - 172, 175, 178, 179 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "DEFBRK", "COLON", "OCTAL", "INTEGER", - "IDENT", "CSR", "IRQ", "INTR", "INIT", "OPEN", "CLOSE", "READ", "WRITE", - "SEEK", "CONTROL", "IS", "ON", "GETC", "PUTC", "$accept", - "configuration", "devtypes", "ftypes", "ftype", "dev_list", "devheader", - "tname", "id", "attr_list", "attr", "number", "devdescriptors", - "descriptor", "fspec", "dname", "optional_on", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276 -}; -# endif - -#define YYPACT_NINF -17 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-17))) - -#define YYTABLE_NINF -1 - -#define yytable_value_is_error(Yytable_value) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int8 yypact[] = -{ - -17, 2, -17, 0, -17, -3, -17, -17, -17, -14, - 4, -17, -17, -17, -9, -3, -14, -17, -17, 23, - -3, -17, -17, 23, 5, 5, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -17, -7, 23, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -3, -17, -17 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 4, 0, 27, 0, 1, 2, 3, 11, 5, 0, - 0, 31, 28, 12, 0, 0, 6, 12, 10, 29, - 0, 9, 12, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 32, 8, 26, - 14, 15, 16, 19, 17, 18, 22, 23, 24, 25, - 20, 21, 0, 30, 33 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -17, -17, -17, -17, -17, -17, -2, -17, -5, -16, - -17, -12, -17, -17, -17, -17, -17 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 1, 2, 3, 8, 16, 17, 9, 10, 19, - 36, 40, 5, 12, 13, 14, 53 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_uint8 yytable[] = -{ - 11, 23, 4, 6, 7, 15, 38, 7, 18, 20, - 21, 39, 52, 41, 22, 37, 0, 0, 0, 0, - 0, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 0, 0, 34, 35, 0, 0, 54 -}; - -static const yytype_int8 yycheck[] = -{ - 5, 17, 0, 3, 7, 19, 22, 7, 4, 18, - 15, 6, 19, 25, 16, 20, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, -1, -1, 20, 21, -1, -1, 52 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 23, 24, 25, 0, 34, 3, 7, 26, 29, - 30, 30, 35, 36, 37, 19, 27, 28, 4, 31, - 18, 30, 28, 31, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 20, 21, 32, 30, 31, 6, - 33, 33, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 19, 38, 30 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 22, 23, 24, 25, 25, 26, 27, 27, 28, - 29, 30, 31, 31, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 33, 34, 34, 35, - 36, 37, 38, 38 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 2, 2, 0, 2, 2, 2, 3, 2, - 2, 1, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 0, 2, 2, - 4, 1, 0, 2 -}; - - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -{ - FILE *yyo = yyoutput; - YYUSE (yyo); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - YYUSE (yytype); -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -{ - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) -{ - unsigned long int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, Rule); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -yystrlen (const char *yystr) -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -{ - YYUSE (yyvaluep); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; -/* Number of syntax errors so far. */ -int yynerrs; - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (void) -{ - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (); - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 3: -#line 121 "config.y" /* yacc.c:1646 */ - { doing = "device definitions"; } -#line 1376 "y.tab.c" /* yacc.c:1646 */ - break; - - case 9: -#line 135 "config.y" /* yacc.c:1646 */ - { mktype((yyvsp[0])); } -#line 1382 "y.tab.c" /* yacc.c:1646 */ - break; - - case 10: -#line 138 "config.y" /* yacc.c:1646 */ - {(yyval) = currtname = cktname((yyvsp[-1]));} -#line 1388 "y.tab.c" /* yacc.c:1646 */ - break; - - case 11: -#line 141 "config.y" /* yacc.c:1646 */ - { (yyval) = currname = lookup(yytext, yyleng); } -#line 1394 "y.tab.c" /* yacc.c:1646 */ - break; - - case 14: -#line 148 "config.y" /* yacc.c:1646 */ - { newattr(CSR, (yyvsp[0])); } -#line 1400 "y.tab.c" /* yacc.c:1646 */ - break; - - case 15: -#line 149 "config.y" /* yacc.c:1646 */ - { newattr(IRQ, (yyvsp[0])); } -#line 1406 "y.tab.c" /* yacc.c:1646 */ - break; - - case 16: -#line 150 "config.y" /* yacc.c:1646 */ - { newattr(INTR, (yyvsp[0])); } -#line 1412 "y.tab.c" /* yacc.c:1646 */ - break; - - case 17: -#line 151 "config.y" /* yacc.c:1646 */ - { newattr(OPEN, (yyvsp[0])); } -#line 1418 "y.tab.c" /* yacc.c:1646 */ - break; - - case 18: -#line 152 "config.y" /* yacc.c:1646 */ - { newattr(CLOSE, (yyvsp[0])); } -#line 1424 "y.tab.c" /* yacc.c:1646 */ - break; - - case 19: -#line 153 "config.y" /* yacc.c:1646 */ - { newattr(INIT, (yyvsp[0])); } -#line 1430 "y.tab.c" /* yacc.c:1646 */ - break; - - case 20: -#line 154 "config.y" /* yacc.c:1646 */ - { newattr(GETC, (yyvsp[0])); } -#line 1436 "y.tab.c" /* yacc.c:1646 */ - break; - - case 21: -#line 155 "config.y" /* yacc.c:1646 */ - { newattr(PUTC, (yyvsp[0])); } -#line 1442 "y.tab.c" /* yacc.c:1646 */ - break; - - case 22: -#line 156 "config.y" /* yacc.c:1646 */ - { newattr(READ, (yyvsp[0])); } -#line 1448 "y.tab.c" /* yacc.c:1646 */ - break; - - case 23: -#line 157 "config.y" /* yacc.c:1646 */ - { newattr(WRITE, (yyvsp[0])); } -#line 1454 "y.tab.c" /* yacc.c:1646 */ - break; - - case 24: -#line 158 "config.y" /* yacc.c:1646 */ - { newattr(SEEK, (yyvsp[0])); } -#line 1460 "y.tab.c" /* yacc.c:1646 */ - break; - - case 25: -#line 159 "config.y" /* yacc.c:1646 */ - { newattr(CONTROL, (yyvsp[0])); } -#line 1466 "y.tab.c" /* yacc.c:1646 */ - break; - - case 26: -#line 162 "config.y" /* yacc.c:1646 */ - { (yyval) = config_atoi(yytext, yyleng); } -#line 1472 "y.tab.c" /* yacc.c:1646 */ - break; - - case 30: -#line 172 "config.y" /* yacc.c:1646 */ - { mkdev((yyvsp[-3]), (yyvsp[-1]), (yyvsp[0])); } -#line 1478 "y.tab.c" /* yacc.c:1646 */ - break; - - case 31: -#line 175 "config.y" /* yacc.c:1646 */ - { (yyval) = currdname = ckdname((yyvsp[0])); } -#line 1484 "y.tab.c" /* yacc.c:1646 */ - break; - - case 32: -#line 178 "config.y" /* yacc.c:1646 */ - { (yyval) = 0; } -#line 1490 "y.tab.c" /* yacc.c:1646 */ - break; - - case 33: -#line 179 "config.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 1496 "y.tab.c" /* yacc.c:1646 */ - break; - - -#line 1500 "y.tab.c" /* yacc.c:1646 */ - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} -#line 181 "config.y" /* yacc.c:1906 */ - -#include "lex.yy.c" - -int main(int argc, char **argv) -{ - int n, i, j, l, fcount; - struct dev_ent *s; - int verbose = 0; - char *p; - int c; - - if ( argc > 1 && (strncmp("-v", argv[1], 2) == 0) ) { - argc--; - argv++; - verbose++; - } - - if ( argc > 4 ) { - fprintf(stderr, "use: config [-v] [file] [conf.c] [conf.h]\n"); - exit(1); - } - - if (verbose) { printf("Opening input file...\n"); } - - if (argc >= 2) { - if (freopen(argv[1], "r", stdin) == NULL) { - fprintf(stderr, "Can't open %s\n", argv[1]); - exit(1); - } - } - else { /* try to open Configuration file */ - if (freopen(CONFIGIN, "r", stdin) == NULL) { - fprintf(stderr, "Can't open %s\n", CONFIGIN); - exit(1); - } - } - - /* Parse the Configuration file */ - - if (verbose) { printf("Parsing configuration specs...\n"); } - - if ( (n = yyparse()) != 0 ) { exit(n); } - - /* Open conf.h and conf.c for writing */ - - if (verbose) { printf("Opening output files...\n"); } - - if (argc >= 3) { - if ( (confc = fopen(argv[2],"w") ) == NULL) { - fprintf(stderr, "Can't write on %s\n", argv[2]); - exit(1); - } - } - else { /* try to open conf.c file */ - if ( (confc = fopen(CONFIGC,"w") ) == NULL) { - fprintf(stderr, "Can't write on %s\n", CONFIGC); - exit(1); - } - } - - if (argc >= 4) { - if ( (confh = fopen(argv[3],"w") ) == NULL) { - fprintf(stderr, "Can't write on %s\n", argv[3]); - exit(1); - } - } - else { /* try to open conf.h file */ - if ( (confh = fopen(CONFIGH,"w") ) == NULL) { - fprintf(stderr, "Can't write on %s\n", CONFIGH); - exit(1); - } - } - - /** produce conf.h **/ - - fprintf(confh, "/* conf.h (GENERATED FILE; DO NOT EDIT) */\n\n"); - - if (verbose) { printf("Writing output...\n"); } - - fprintf(confh, "/* Device switch table declarations */\n\n"); - - for (i = 0; (p = devstab[i]) != NULL; i++) { - fprintf(confh, "%s\n", p); - } - - fprintf(confh, "\n"); - - /* write device declarations and definitions; count type refs. */ - fprintf(confh, "/* Device name definitions */\n\n"); - for (i = 0, s = devs; s != NIL; i++, s = s->next) { - fprintf(confh, "#define %-12s%d /* type %-8s */\n", - s->name, i, s->tname); - s->minor = symtab[s->tnum].occurs++; - } - fprintf(confh, "\n"); - - /* write count of device types */ - - fprintf(confh, "/* Control block sizes */\n\n"); - for (i = 0; i < nsym; i++) - { - if (symtab[i].occurs > 0) - { - int j; - char name[CONFMAXNM]; - strncpy(name, symtab[i].name, CONFMAXNM); - - name[CONFMAXNM-1] = '\0'; - - fprintf(confh, "#define\tN%s\t%d\n", - name, symtab[i].occurs); - } - } - - fprintf(confh, "\n"); - - fprintf(confh, "#define DEVMAXNAME %d\n", CONFMAXNM); - - if (ndevs > 0) { fprintf(confh, "#define NDEVS %d\n", ndevs); } - - /* Copy definitions to output */ - if (brkcount == 2 && verbose) - { printf("Copying definitions to %s...\n", CONFIGH); } - - if (brkcount == 2 ) - { - while ( (c = input()) > 0) /* lex input routine */ - { putc(c, confh); } - } - - fclose(confh); - - - /** produce conf.c **/ - - fprintf(confc, "/* conf.c (GENERATED FILE; DO NOT EDIT) */\n\n"); - fprintf(confc, "#include \n\n"); - fprintf(confc, "\n"); - - fprintf(confc, "extern\tdevcall\tioerr(void);\n"); - fprintf(confc, "extern\tdevcall\tionull(void);\n\n"); - - /* produce devtab (giant I/O switch table) */ - fprintf(confc, "/* Device independent I/O switch */\n\n"); - if (ndevs > 0) - { - fprintf(confc, "struct dentry devtab[NDEVS] =\n{\n"); - fprintf(confc, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n", - "/**", - " * Format of entries is:", - " * dev-number, minor-number, dev-name,", - " * init, open, close,", - " * read, write, seek,", - " * getc, putc, control,", - " * dev-csr-address, intr-handler, irq", - " */"); - } - - for (fcount = 0, s = devs; s != NIL; fcount++, s = s->next) - { - fprintf(confc, "/* %s is %s */\n", s->name, s->tname); - fprintf(confc, "\t{ %d, %d, \"%s\",\n", fcount, s->minor, s->name); - fprintf(confc, "\t (void *)%s, (void *)%s, (void *)%s,\n", - s->init, s->open, s->close); - fprintf(confc, "\t (void *)%s, (void *)%s, (void *)%s,\n", - s->read, s->write, s->seek); - fprintf(confc, "\t (void *)%s, (void *)%s, (void *)%s,\n", - s->getc, s->putc, s->control); - fprintf(confc, "\t (void *)0x%x, (void *)%s, %d }", - s->csr, s->intr, s->irq); - - if ( s->next != NIL ) { fprintf(confc, ",\n\n"); } - else { fprintf(confc, "\n};"); } - } - - /* guarantee conf.c written later than conf.c for make */ - fprintf(confc, "\n"); - fclose(confc); - - /* finish up and write report for user if requested */ - if (verbose) - { - printf("Configuration complete. Number of devs=%d:\n", ndevs); - for (s = devs; s != NIL ; s = s->next) - { - printf("Device %s (on %s)\n", s->name, s->device); - printf(" csr=0x%04x, irq=0x%04x, minor=%d\n", - s->csr, s->irq, s->minor); - } - } -} - -void yyerror(char *s) -{ - fprintf(stderr, "Syntax error in %s on line %d\n", doing, linectr); -} - -/* lookup -- lookup a name in the symbol table; return position */ -int lookup(char *str, int len) -{ - int i; - char *s; - - if (len >= CONFMAXNM) - { - len = CONFMAXNM-1; - fprintf(stderr, "warning: name %s truncated\n", str); - } - - s = (char *)malloc(len + 1); - strncpy(s, str, len); - s[len] = '\0'; - - for (i = 0; i < nsym; i++) - { - if ( strncmp(s, symtab[i].name, CONFMAXNM) == 0 ) - { return(i); } - } - - symtab[nsym].name = s; - symtab[nsym].occurs = 0; - - return nsym++; -} - -int config_atoi(char *p, int len) -{ - int base, rv; - - if (*p == '0') - { - ++p; - --len; - if (*p == 'x' || *p == 'X') - { - ++p; --len; /* skip 'x' */ - base = 16; - } - else - { - base = 8; - } - } - else - { - base = 10; - } - - rv = 0; - for (; len > 0; ++p, --len) - { - rv *= base; - if (isdigit(*p)) { rv += *p - '0'; } - else if (isupper(*p)) { rv += *p - 'A' + 10; } - else { rv += *p - 'a' + 10; } - } - - return rv; -} - -/* newattr -- add a new attribute spec to current type/device description */ -/* tok: token type (attribute type) */ -/* val: symbol number of value */ -void newattr(int tok, int val) -{ - struct dev_ent *s; - char *c; - - /* doing types */ - if (devs == NIL) { s = currtype; } - else { s = lastdv; } - - if (val>=0 && valcsr = val; break; - case IRQ: s->irq = val; break; - case INTR: strncpy(s->intr, c, CONFMAXNM); break; - case READ: strncpy(s->read, c, CONFMAXNM); break; - case WRITE: strncpy(s->write, c, CONFMAXNM); break; - case GETC: strncpy(s->getc, c, CONFMAXNM); break; - case PUTC: strncpy(s->putc, c, CONFMAXNM); break; - case OPEN: strncpy(s->open, c, CONFMAXNM); break; - case CLOSE: strncpy(s->close, c, CONFMAXNM); break; - case INIT: strncpy(s->init, c, CONFMAXNM); break; - case SEEK: strncpy(s->seek, c, CONFMAXNM); break; - case CONTROL: strncpy(s->control, c, CONFMAXNM); break; - default: fprintf(stderr, "Internal error 1\n"); - } -} - -/* cktname -- check type name for duplicates */ -int cktname(int symid) -{ - struct dev_ent *s; - char *name; - - name = symtab[symid].name; - for (s = ftypes; s != NIL; s = s->next) - { - if (s->tname == name) - { - fprintf(stderr, "Duplicate type name %s on line %d\n", - name, linectr); - exit(1); - } - } - - return symid; -} - -/* mktype -- make a node in the type list and initialize to defaults */ -void mktype(int deviceid) -{ - struct dev_ent *s, *p; - char *tn, *dn; - - p = NIL; - tn = symtab[currtname].name; - dn = symtab[deviceid].name; - for (s = ftypes; s != NIL ; s = s->next) - { - if (s->tname == tn && s->device==dn) - { - fprintf(stderr, "Duplicate device %s for type %s on line %d\n", - dn, tn, linectr); - exit(1); - } - p = s; - } - - currtype = s = (struct dev_ent *)malloc(sizeof(struct dev_ent)); - if (ftypes != NIL) { p->next = s; } - else { ftypes = s; } - - initattr(s, currtname, deviceid); -} - -/* initialize attributes in a type declaration node to typename... */ -void initattr(struct dev_ent *fstr, int tnum, int deviceid) -{ - fstr->name = NULL; - fstr->tname = symtab[tnum].name; - fstr->tnum = tnum; - fstr->device = symtab[deviceid].name; - fstr->csr = 0; - fstr->irq = 0; - strncpy(fstr->intr, "ioerr", 5); - strncpy(fstr->init, "ioerr", 5); - strncpy(fstr->open, "ioerr", 5); - strncpy(fstr->close, "ioerr", 5); - strncpy(fstr->read, "ioerr", 5); - strncpy(fstr->write, "ioerr", 5); - strncpy(fstr->control, "ioerr", 5); - strncpy(fstr->seek, "ioerr", 5); - strncpy(fstr->getc, "ioerr", 5); - strncpy(fstr->putc, "ioerr", 5); - fstr->minor = 0; -} - -/* mkdev -- make a node on the device list */ -void mkdev(int nameid, int typid, int deviceid) -{ - struct dev_ent *s; - char *devn, *tn, *dn; - int found; - - s = (struct dev_ent *)malloc(sizeof(struct dev_ent)); - s->next = NIL; - if (devs == NIL) - { - devs = s; - lastdv = s; - } - else - { - lastdv->next = s; - lastdv = s; - } - - ndevs++; - tn = symtab[typid].name; - devn = symtab[nameid].name; - - if (deviceid >= 0) { dn = symtab[deviceid].name; } - else { dn = NULL; } - - found = 0; - for (s = ftypes; s != NULL ; s = s->next) - { - if (s->tname == tn && (dn == NULL || s->device == dn)) - { - memcpy(lastdv, s, sizeof(struct dev_ent)); - found = 1; - break; - } - } - - if (found==0) - { - fprintf(stderr, - "Bad type or device name in declaration of %s on line %d\n", - devn, linectr); - exit(1); - } - - lastdv->next = NIL; - lastdv->name = devn; -} - - -/* chdname -- check for duplicate device name */ -int ckdname(int devid) -{ - struct dev_ent *s; - char *name; - - name = symtab[devid].name; - - for (s = devs; s != NIL; s = s->next) - { - if (s->name == name) - { - fprintf(stderr, "Duplicate device name %s on line %d\n", - name, linectr); - exit(1); - } - } - - return devid; -} diff --git a/device/tty/.ttyread.c.swp b/device/tty/.ttyread.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..4f91571a3efbfabef0bcd9eeecf35b29c69beeb9 GIT binary patch literal 12288 zcmeI2&x;&I6vrzfXsgi>y#xf`Cb-Oxogc{x3cIt0-OR!ovn#V%V~8R>-8D{=p6;Q# zdXrURPU^v<9zA#v6#NrB_zwt*!k+XZ>QOKUJ?i&W)y%9L2@-M%RKq7TUETHSz0a#2 zSknFWs~Z>S`Q~#1$1x%1pZW39>-!Ii{o_JhPqMO+7kuT82jBNUZWHgifUWJkRFQ1) zX)Bhy3BGH+$0!-b&FGG+`HS9wH*j|bj*7)Ir`tUD)X6z|^7zi(h4Hhz0dK$?@CLjA zZ@?Sy2D|}p;J!4V$4A6XWd4B5e${;*IrQmH{f9T;4R{0IfH&X`cmv*mH{cC;1Kxl) z;0@e|2Etef3WPZK2$IMD|4;t@|LqAOeg!{(@4*M418zMo#P8rI@F^(3SlKLvR+n2pZsNa02}Gm=J%0@4&aC%{wS82IH;A-)D*fiJ-q z;B)Xkcn>6C2+o6-z#@1SoCI^=Vek<61GWAP_Q7Z1Lr{PSyasl_I$$Sjz#ra#H{cC; z1Kxl);0<^K|2A+#1WM{sWt8#zn@b|VNMOF#>o^N){c|T0# zW3$Vn!Y+;rU0Q$oTUk|Hk8p-8sv()S=`tfG}bwD6J|Q&_R7uF)ilRc)Rm-^WaCm(s8q5m zi`%l8ST>m*D9;u3A7VKnC$B^8CEKToM|WDU8`m}{*Ni@~W>^e&!z48gx1&xpmw;#6~mLk+L1n2lTd7`2xB1 z!ZfuRg?+f?Muw4=%6Z~=vsFfUEZvUUxUjahb-sJf_R8GSp?S#CVgHKVgpHMWca&tg zdIKdLX#4i%?QXA!v01Xqwnl-y94h>?1RuzHQ(o7ud(*_Q|67=v>BTd_WW(7KdG{T@ zoAS);z1bYwZWq5C^`#;xnT9XmC5#WOVY_ATUz^!6!$w(>5kHVkUZT*djC24EQ9r#J z)QlGtgIZq6kuw&< + +#ifndef FS_H +#define FS_H + +#define FILENAMELEN 32 +#define INODEBLOCKS 12 +#define INODEDIRECTBLOCKS (INODEBLOCKS - 2) +#define DIRECTORY_SIZE 16 + +#define MDEV_BLOCK_SIZE 512 +#define MDEV_NUM_BLOCKS 512 +#define DEFAULT_NUM_INODES (MDEV_NUM_BLOCKS / 4) +#define INODE_TYPE_FILE 1 +#define INODE_TYPE_DIR 2 + + +struct inode { + int id; + short int type; + short int nlink; + int device; + int size; + int blocks[INODEBLOCKS]; +}; + +#define FSTATE_CLOSED 0 +#define FSTATE_OPEN 1 + +/* Modes of file*/ +#define O_CREAT 11 + +/* Flags of file*/ +#define O_RDONLY 0 +#define O_WRONLY 1 +#define O_RDWR 2 + +struct filetable { + int state; + int fileptr; + struct dirent *de; + struct inode in; +}; + +struct dirent { + int inode_num; + char name[FILENAMELEN]; +}; + +struct directory { + int numentries; + struct dirent entry[DIRECTORY_SIZE]; +}; + +struct fsystem{ + int nblocks; + int blocksz; + int ninodes; + int inodes_used; + int freemaskbytes; + char *freemask; + struct directory root_dir; +}; + +/* file and directory functions */ +int fs_open(char *filename, int flags); +int fs_close(int fd); +int fs_create(char *filename, int mode); +int fs_seek(int fd, int offset); +int fs_read(int fd, void *buf, int nbytes); +int fs_write(int fd, void *buf, int nbytes); + +/* filesystem functions */ +int fs_mkfs(int dev, int num_inodes); +int fs_mount(int dev); + +/* filesystem internal functions */ +int fs_get_inode_by_num(int dev, int inode_number, struct inode *in); +int fs_put_inode_by_num(int dev, int inode_number, struct inode *in); +int fs_setmaskbit(int b); +int fs_clearmaskbit(int b); +int fs_getmaskbit(int b); + +/* + Block Store functions + bs_bread, bs_bwrite, +*/ +int bs_mkdev(int dev, int blocksize, int numblocks); +int bs_bread(int bsdev, int block, int offset, void *buf, int len); +int bs_bwrite(int bsdev, int block, int offset, void * buf, int len); + +/* debugging functions */ +void fs_printfreemask(void); +void fs_print_fsd(void); + +#endif +/* FS_H */ diff --git a/include/shprototypes.h b/include/shprototypes.h index 52a09eb..88a576c 100644 --- a/include/shprototypes.h +++ b/include/shprototypes.h @@ -81,3 +81,6 @@ extern shellcmd xsh_mmu (int32, char *[]); /* in file xsh_prodcons.c */ extern shellcmd xsh_prodcons (int32, char *[]); + +/* File systems */ +extern shellcmd xsh_fstest (int32, char *[]); diff --git a/shell/shell.c b/shell/shell.c index d8df648..8e2e4fe 100644 --- a/shell/shell.c +++ b/shell/shell.c @@ -26,6 +26,7 @@ const struct cmdent cmdtab[] = { {"test_mmu", FALSE, xsh_mmu}, {"hello", FALSE, xsh_hello}, {"prodcons", FALSE, xsh_prodcons}, + {"fstest", FALSE, xsh_fstest}, #ifdef ARM_BBB {"arp", FALSE, xsh_arp}, {"ipaddr", FALSE, xsh_ipaddr}, diff --git a/shell/xsh_fstest.c b/shell/xsh_fstest.c new file mode 100644 index 0000000..c25f032 --- /dev/null +++ b/shell/xsh_fstest.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#define SIZE 1200 + +void testbitmask(void); + +/** + * @ingroup shell + * + * Shell command fstest. + * @param nargs number of arguments in args array + * @param args array of arguments + * @return OK for success, SYSERR for syntax error + */ + shellcmd xsh_fstest(int nargs, char *args[]) +{ + int rval; + int fd, i, j; + char *buf1, *buf2; + + + /* Output help, if '--help' argument was supplied */ + if (nargs == 2 && strncmp(args[1], "--help", 7) == 0) + { + printf("Usage: %s\n\n", args[0]); + printf("Description:\n"); + printf("\tFilesystem Test\n"); + printf("Options:\n"); + printf("\t--help\tdisplay this help and exit\n"); + return OK; + } + + /* Check for correct number of arguments */ + if (nargs > 1) + { + fprintf(stderr, "%s: too many arguments\n", args[0]); + fprintf(stderr, "Try '%s --help' for more information\n", + args[0]); + return SYSERR; + } + if (nargs < 1) + { + fprintf(stderr, "%s: too few arguments\n", args[0]); + fprintf(stderr, "Try '%s --help' for more information\n", + args[0]); + return SYSERR; + } + +#ifdef FS + + bs_mkdev(0, MDEV_BLOCK_SIZE, MDEV_NUM_BLOCKS); /* device "0" and default blocksize (=0) and count */ + fs_mkfs(0,DEFAULT_NUM_INODES); /* bsdev 0*/ + fs_testbitmask(); + + buf1 = getmem(SIZE*sizeof(char)); + buf2 = getmem(SIZE*sizeof(char)); + + // Create test file + fd = fs_create("Test_File", O_CREAT); + + // Fill buffer with random stuff + for(i=0; i +#include + + + +extern int dev0_numblocks; +extern int dev0_blocksize; +extern char *dev0_blocks; +int dev0 = 0; + +#if FS + +int bs_mkdev(int dev, int blocksize, int numblocks) { + + if (dev != 0) { + printf("Unsupported device: %d\n", dev); + return SYSERR; + } + + if (blocksize != 0) { + dev0_blocksize = blocksize; + } + else { + dev0_blocksize = MDEV_BLOCK_SIZE; + } + + if (numblocks != 0) { + dev0_numblocks = numblocks; + } + else { + dev0_numblocks = MDEV_NUM_BLOCKS; + } + + if ( (dev0_blocks = getmem(dev0_numblocks * dev0_blocksize)) == (void *)SYSERR) { + printf("bs_mkdev getmemfailed\n"); + return SYSERR; + } + + return OK; + +} + +int +bs_bread(int dev, int block, int offset, void *buf, int len) { + char *bbase; + + if (dev != 0) { + printf("Unsupported device\n"); + return SYSERR; + } + if (offset >= dev0_blocksize) { + printf("Bad offset\n"); + return SYSERR; + } + + bbase = &dev0_blocks[block * dev0_blocksize]; + + memcpy(buf, (bbase+offset), len); + + return OK; + +} + + +int +bs_bwrite(int dev, int block, int offset, void * buf, int len) { + char *bbase; + + if (dev != 0) { + printf("Unsupported device\n"); + return SYSERR; + } + if (offset >= dev0_blocksize) { + printf("Bad offset\n"); + return SYSERR; + } + + bbase = &dev0_blocks[block * dev0_blocksize]; + + memcpy((bbase+offset), buf, len); + + return OK; + +} + +#endif +/* FS */ diff --git a/system/conf.c b/system/conf.c index b1f5014..6be7df9 100644 --- a/system/conf.c +++ b/system/conf.c @@ -24,7 +24,7 @@ struct dentry devtab[NDEVS] = (void *)ttyinit, (void *)ionull, (void *)ionull, (void *)ttyread, (void *)ttywrite, (void *)ioerr, (void *)ttygetc, (void *)ttyputc, (void *)ttycontrol, - (void *)0x44e09000, (void *)ttyhandler, 72 }, + (void *)0x0, (void *)ttyhandler, 72 }, /* NULLDEV is null */ { 1, 0, "NULLDEV", @@ -33,157 +33,80 @@ struct dentry devtab[NDEVS] = (void *)ionull, (void *)ionull, (void *)ioerr, (void *)0x0, (void *)ioerr, 0 }, -/* ETHER0 is eth */ - { 2, 0, "ETHER0", - (void *)ethinit, (void *)ioerr, (void *)ioerr, - (void *)ethread, (void *)ethwrite, (void *)ioerr, - (void *)ioerr, (void *)ioerr, (void *)ethcontrol, - (void *)0x0, (void *)ethhandler, 0 }, - /* NAMESPACE is nam */ - { 3, 0, "NAMESPACE", + { 2, 0, "NAMESPACE", (void *)naminit, (void *)namopen, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)0x0, (void *)ioerr, 0 }, -/* RDISK is rds */ - { 4, 0, "RDISK", - (void *)rdsinit, (void *)rdsopen, (void *)rdsclose, - (void *)rdsread, (void *)rdswrite, (void *)ioerr, - (void *)ioerr, (void *)ioerr, (void *)rdscontrol, - (void *)0x0, (void *)ionull, 0 }, - /* RAM0 is ram */ - { 5, 0, "RAM0", + { 3, 0, "RAM0", (void *)raminit, (void *)ramopen, (void *)ramclose, (void *)ramread, (void *)ramwrite, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)0x0, (void *)ionull, 0 }, -/* RFILESYS is rfs */ - { 6, 0, "RFILESYS", - (void *)rfsinit, (void *)rfsopen, (void *)ioerr, - (void *)ioerr, (void *)ioerr, (void *)ioerr, - (void *)ioerr, (void *)ioerr, (void *)rfscontrol, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE0 is rfl */ - { 7, 0, "RFILE0", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE1 is rfl */ - { 8, 1, "RFILE1", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE2 is rfl */ - { 9, 2, "RFILE2", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE3 is rfl */ - { 10, 3, "RFILE3", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE4 is rfl */ - { 11, 4, "RFILE4", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE5 is rfl */ - { 12, 5, "RFILE5", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE6 is rfl */ - { 13, 6, "RFILE6", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE7 is rfl */ - { 14, 7, "RFILE7", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE8 is rfl */ - { 15, 8, "RFILE8", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - -/* RFILE9 is rfl */ - { 16, 9, "RFILE9", - (void *)rflinit, (void *)ioerr, (void *)rflclose, - (void *)rflread, (void *)rflwrite, (void *)rflseek, - (void *)rflgetc, (void *)rflputc, (void *)ioerr, - (void *)0x0, (void *)ionull, 0 }, - /* LFILESYS is lfs */ - { 17, 0, "LFILESYS", + { 4, 0, "LFILESYS", (void *)lfsinit, (void *)lfsopen, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)ioerr, (void *)0x0, (void *)ionull, 0 }, /* LFILE0 is lfl */ - { 18, 0, "LFILE0", + { 5, 0, "LFILE0", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, (void *)0x0, (void *)ionull, 0 }, /* LFILE1 is lfl */ - { 19, 1, "LFILE1", + { 6, 1, "LFILE1", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, (void *)0x0, (void *)ionull, 0 }, /* LFILE2 is lfl */ - { 20, 2, "LFILE2", + { 7, 2, "LFILE2", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, (void *)0x0, (void *)ionull, 0 }, /* LFILE3 is lfl */ - { 21, 3, "LFILE3", + { 8, 3, "LFILE3", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, (void *)0x0, (void *)ionull, 0 }, /* LFILE4 is lfl */ - { 22, 4, "LFILE4", + { 9, 4, "LFILE4", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, (void *)0x0, (void *)ionull, 0 }, /* LFILE5 is lfl */ - { 23, 5, "LFILE5", + { 10, 5, "LFILE5", (void *)lflinit, (void *)ioerr, (void *)lflclose, (void *)lflread, (void *)lflwrite, (void *)lflseek, (void *)lflgetc, (void *)lflputc, (void *)lflcontrol, - (void *)0x0, (void *)ionull, 0 } + (void *)0x0, (void *)ionull, 0 }, + +/* SERIAL0 is uart */ + { 11, 0, "SERIAL0", + (void *)uartInit, (void *)ionull, (void *)ionull, + (void *)uartRead, (void *)uartWrite, (void *)ioerr, + (void *)uartGetc, (void *)uartPutc, (void *)uartControl, + (void *)0x101f1000, (void *)uartInterrupt, 12 }, + +/* LOOP0 is loopback */ + { 12, 0, "LOOP0", + (void *)loopbackInit, (void *)loopbackOpen, (void *)loopbackClose, + (void *)loopbackRead, (void *)loopbackWrite, (void *)ioerr, + (void *)loopbackGetc, (void *)loopbackPutc, (void *)loopbackControl, + (void *)0x0, (void *)ioerr, 0 } }; diff --git a/system/fs.c b/system/fs.c new file mode 100755 index 0000000..2c5f776 --- /dev/null +++ b/system/fs.c @@ -0,0 +1,521 @@ +#include +#include + + +#if FS + +static struct fsystem fsd; +int dev0_numblocks; +int dev0_blocksize; +char *dev0_blocks; + +extern int dev0; + +char block_cache[512]; + +#define DEBUG 0 + +#define SB_BLK 0 +#define BM_BLK 1 +#define RT_BLK 2 + +#define NUM_FD 16 +struct filetable oft[NUM_FD]; +int next_open_fd = 0; + + +#define INODES_PER_BLOCK (fsd.blocksz / sizeof(struct inode)) +#define NUM_INODE_BLOCKS (( (fsd.ninodes % INODES_PER_BLOCK) == 0) ? fsd.ninodes / INODES_PER_BLOCK : (fsd.ninodes / INODES_PER_BLOCK) + 1) +#define FIRST_INODE_BLOCK 2 + +int inode_id=1; + +int fileblock_to_diskblock(int dev, int fd, int fileblock); + +int get_next_free_block(){ + int i,block; + //might as well search linearly + for(i=0;i=0 && flags<=2){ + //get root dir: + struct directory dir=fsd.root_dir; + //check if file name is valid. i.e., no file with same name exists + int i,fileloc=-1; + for(i=0;iname, filename); + struct inode in; + //read file metadata inode: + fs_get_inode_by_num(0,ft.de->inode_num,&in); + //printf("in.id=%d\n",ft.de->inode_num); + //cp in to ft: + memcpy(&(ft.in),&in,sizeof(struct inode)); + //copy ft to oft: + memcpy(oft+fd,&ft,sizeof(struct filetable)); + +#if 0 + printf("debug: file %s opened. fd=%d,oft[%d].state=%d\n\r",filename,fd,fd,oft[fd].state); + printf("debug: open: ft.de->ft.in.blocks[0]=%d\n\r",ft.in.blocks[0]); +#endif + + return fd; + } + else return SYSERR; +} +int fs_close(int fd) +{ + // check if fd is valid + if ((fd > next_open_fd) || (fd < 0)){ + fprintf(stderr, "fs::fs_close: not valid fd\n\r"); + return SYSERR; + } + + oft[fd].state = FSTATE_CLOSED; + return OK; +} +int fs_create(char *filename, int mode) +{ + if(mode==O_CREAT){ + //get root dir: + struct directory dir=fsd.root_dir; + //check if file name is valid. i.e., no file with same name exists + int i; + for(i=0;iname, filename); + //write back to rootdir + memcpy(&(fsd.root_dir),&dir,sizeof(struct directory)); + struct inode in; + in.id=inode_id++; + in.type=INODE_TYPE_FILE; + //write inode + fs_put_inode_by_num(0,in.id,&in); + //mark destination block: + int bl = in.id / INODES_PER_BLOCK; + bl += FIRST_INODE_BLOCK; + fs_setmaskbit(bl); + //write inode to filetable + memcpy(&(ft.in),&in,sizeof(struct inode)); + //write inode_id to dirent:inode_num + memcpy(&(ft.de->inode_num),&(in.id),sizeof(int)); + memcpy(&(fsd.root_dir.entry[dir.numentries-1].inode_num),&(in.id),sizeof(int)); + //copy ft to oft: + memcpy(oft+fd,&ft,sizeof(struct filetable)); + //update fsystem + fsd.inodes_used++; +#if 0 + printf("debug: create:fsd.root_dir.entry[dir.numentries-1].inode_num=%d\n\r",fsd.root_dir.entry[dir.numentries-1].inode_num); + printf("debug: file %s created. fd=%d,oft[%d].state=%d,ft.in.id=%d\n\r",filename,fd,fd,oft[fd].state,ft.in.id); +#endif + + return fd; + } + else return SYSERR; +} +int fs_seek(int fd, int offset) +{ + //first, get the file table entry: + struct filetable ft=oft[fd]; + //update fileptr + offset=ft.fileptr+offset; + if(offset<0){ + fprintf(stderr,"fs::fs_seek: offset exceeds file boundary. resetting pointer to beginning of file\n\r"); + offset=0; + } + memcpy(&((oft+fd)->fileptr),&offset,sizeof(int)); + return fd; +} +int fs_read(int fd, void *buf, int nbytes) +{ + //printf("fd at fs_read=%d\n",fd); + int orig_nbytes=nbytes; + //first, get the file table entry: + struct filetable ft=oft[fd]; + if(ft.state==FSTATE_CLOSED){ + fprintf(stderr, "error %d. fs::fs_read(): invalid descriptor.\n\r",ft.state); + return 0; + } + struct inode in = ft.in; + //calculate inode block for fileptr: + int inodeblk= (ft.fileptr / fsd.blocksz); + int inodeoffset=(ft.fileptr % fsd.blocksz); + if (inodeblk0){ + //if all data we want is in same block + if(nbytes<(fsd.blocksz-inodeoffset)){ + bs_bread(0,dst_blk,inodeoffset,buf,nbytes); + //printf("debug:read:buf=%s,dst_blk=%d,inodeoffset=%d\n",buf,dst_blk,inodeoffset); + //incr fileptr: + ft.fileptr+=nbytes; + buf+=nbytes; + nbytes=0; + return orig_nbytes; + } + else{ + if(inodeblk==INODEBLOCKS-1){ + fprintf(stderr, "fs::fs_read(): requested bytes exceeds limit, wrote valid values only.\n\r"); + return orig_nbytes-nbytes; + } + bs_bread(0,dst_blk,inodeoffset,buf,fsd.blocksz-inodeoffset); +#if 0 + printf("debug:fs_read:inodeoffset=%d,nbytes=%d,inodeblk=%d,dst_blk=%d\n",inodeoffset,nbytes,inodeblk,dst_blk); +#endif + buf+=(fsd.blocksz-inodeoffset); + nbytes-=(fsd.blocksz-inodeoffset); + ft.fileptr+=(fsd.blocksz-inodeoffset); + //write ft to oft + memcpy(oft+fd,&ft,sizeof(struct filetable)); + //cross over to next block + dst_blk=in.blocks[++inodeblk]; + inodeoffset=0; + } + } + } + return orig_nbytes-nbytes; +} +/** + * return size wrote + */ +int fs_write(int fd, void *buf, int nbytes) +{ + int orig_nbytes=nbytes; + //first, get the file table entry: + struct filetable ft=oft[fd]; +#if 0 + printf("debug:write:fd=%d\n\r",fd); +#endif + + if(ft.state==FSTATE_CLOSED){ + fprintf(stderr, "error %d. fs::fs_write(): invalid descriptor.\n\r",ft.state); + return 0; + } + struct inode in = ft.in; + //calculate inode block for fileptr: + int inodeblk= (ft.fileptr / fsd.blocksz); + int inodeoffset=(ft.fileptr % fsd.blocksz); + if (inodeblk0){ +#if 0 + printf("ft.in.id=%d\n",ft.in.id); +#endif + if(in.blocks[inodeblk]==0){ + //alloc new block + dst_blk=get_next_free_block(); + memcpy(in.blocks+inodeblk,&dst_blk,sizeof(int)); +#if 0 + printf("in.blocks[inodeblk]=%d,expected:%d\n\r",in.blocks[inodeblk],dst_blk); + +#endif + //copy in back to ft.in: + memcpy(&((oft+fd)->in),&(in),sizeof(struct inode)); + ft.in=in; + //write in back to the inode on disk + fs_put_inode_by_num(0,in.id,&in); +#if 0 + struct inode temp; + fs_get_inode_by_num(0,in.id,&temp); + printf("write. updated inode %d, inode.block[0]=%d\n",temp.id,temp.blocks[0]); +#endif + //mark that block as visited... + fs_setmaskbit(dst_blk); + } + else if(in.blocks[inodeblk]>0){ + dst_blk=in.blocks[inodeblk]; + } + //if all data we want to write can be put in same block + if(nbytes<(fsd.blocksz-inodeoffset)){ + bs_bwrite(0,dst_blk,inodeoffset,buf,nbytes); + //incr fileptr: + ft.fileptr+=nbytes; + nbytes=0; + //write to oft: + memcpy(oft+fd,&ft,sizeof(struct filetable)); + return orig_nbytes; + } + else{ + if(inodeblk==INODEBLOCKS-1){ + fprintf(stderr, "fs::fs_write(): requested bytes exceeds limit, wrote valid values only.\n\r"); + return orig_nbytes-nbytes; + } + bs_bwrite(0,dst_blk,inodeoffset,buf,fsd.blocksz-inodeoffset); +#if 0 + printf("debug:fs_write:inodeoffset=%d,nbytes=%d,inodeblk=%d,dstblk=%d\n\r",inodeoffset,nbytes,inodeblk,dst_blk); + char tempbuf[512]; + memcpy(tempbuf,buf,512); + printf("debug:wrote:%s\n\r",tempbuf); +#endif + + buf+=(fsd.blocksz-inodeoffset); + nbytes-=(fsd.blocksz-inodeoffset); + ft.fileptr+=(fsd.blocksz-inodeoffset); + //write to oft: + memcpy(oft+fd,&ft,sizeof(struct filetable)); + //cross over to next block + //dst_blk=in.blocks[++inodeblk]; + inodeblk++; + inodeoffset=0; + } + } + } + return orig_nbytes-nbytes; +} + + +int fs_mkfs(int dev, int num_inodes) { + int i; + + if (dev == 0) { + fsd.nblocks = dev0_numblocks; + fsd.blocksz = dev0_blocksize; + } + else { + printf("Unsupported device\n"); + return SYSERR; + } + + if (num_inodes < 1) { + fsd.ninodes = DEFAULT_NUM_INODES; + } + else { + fsd.ninodes = num_inodes; + } + + i = fsd.nblocks; + while ( (i % 8) != 0) {i++;} + fsd.freemaskbytes = i / 8; + + if ((fsd.freemask = getmem(fsd.freemaskbytes)) == (void *)SYSERR) { + printf("fs_mkfs getmem failed.\n"); + return SYSERR; + } + + /* zero the free mask */ + for(i=0;i= INODEBLOCKS - 2) { + printf("No indirect block support\n"); + return SYSERR; + } + + diskblock = oft[fd].in.blocks[fileblock]; //get the logical block address + + return diskblock; +} + +/* read in an inode and fill in the pointer */ +int +fs_get_inode_by_num(int dev, int inode_number, struct inode *in) { + int bl, inn; + int inode_off; + + if (dev != 0) { + printf("Unsupported device\n"); + return SYSERR; + } + if (inode_number > fsd.ninodes) { + printf("fs_get_inode_by_num: inode %d out of range\n", inode_number); + return SYSERR; + } + + bl = inode_number / INODES_PER_BLOCK; + inn = inode_number % INODES_PER_BLOCK; + bl += FIRST_INODE_BLOCK; + + inode_off = inn * sizeof(struct inode); + + /* + printf("in_no: %d = %d/%d\n", inode_number, bl, inn); + printf("inn*sizeof(struct inode): %d\n", inode_off); + */ + + bs_bread(dev0, bl, 0, &block_cache[0], fsd.blocksz); + memcpy(in, &block_cache[inode_off], sizeof(struct inode)); + + return OK; + +} + +int +fs_put_inode_by_num(int dev, int inode_number, struct inode *in) { + int bl, inn; + + if (dev != 0) { + printf("Unsupported device\n"); + return SYSERR; + } + if (inode_number > fsd.ninodes) { + printf("fs_put_inode_by_num: inode %d out of range\n", inode_number); + return SYSERR; + } + + bl = inode_number / INODES_PER_BLOCK; + inn = inode_number % INODES_PER_BLOCK; + bl += FIRST_INODE_BLOCK; + + /* + printf("in_no: %d = %d/%d\n", inode_number, bl, inn); + */ + + bs_bread(dev0, bl, 0, block_cache, fsd.blocksz); + memcpy(&block_cache[(inn*sizeof(struct inode))], in, sizeof(struct inode)); + bs_bwrite(dev0, bl, 0, block_cache, fsd.blocksz); + + return OK; +} + +/* specify the block number to be set in the mask */ +int fs_setmaskbit(int b) { + int mbyte, mbit; + mbyte = b / 8; + mbit = b % 8; + + fsd.freemask[mbyte] |= (0x80 >> mbit); + return OK; +} + +/* specify the block number to be read in the mask */ +int fs_getmaskbit(int b) { + int mbyte, mbit; + mbyte = b / 8; + mbit = b % 8; + + return( ( (fsd.freemask[mbyte] << mbit) & 0x80 ) >> 7); + return OK; + +} + +/* specify the block number to be unset in the mask */ +int fs_clearmaskbit(int b) { + int mbyte, mbit, invb; + mbyte = b / 8; + mbit = b % 8; + + invb = ~(0x80 >> mbit); + invb &= 0xFF; + + fsd.freemask[mbyte] &= invb; + return OK; +} + +/* This is maybe a little overcomplicated since the lowest-numbered + block is indicated in the high-order bit. Shift the byte by j + positions to make the match in bit7 (the 8th bit) and then shift + that value 7 times to the low-order bit to print. Yes, it could be + the other way... */ +void fs_printfreemask(void) { + int i,j; + + for (i=0; i < fsd.freemaskbytes; i++) { + for (j=0; j < 8; j++) { + printf("%d", ((fsd.freemask[i] << j) & 0x80) >> 7); + } + if ( (i % 8) == 7) { + printf("\n"); + } + } + printf("\n"); +} + +#endif /* FS */