diff --git a/day_7/Makefile b/day_7/Makefile new file mode 100644 index 0000000..3187ecf --- /dev/null +++ b/day_7/Makefile @@ -0,0 +1,3 @@ +TARGET := day_7 + +include ../Makefile.common.mk diff --git a/day_7/filetree.c b/day_7/filetree.c new file mode 100644 index 0000000..21adce0 --- /dev/null +++ b/day_7/filetree.c @@ -0,0 +1,30 @@ +#include "filetree.h" +#include + +void add_directory(struct dirnode *cur, struct dirnode *item) { + // NOTE(feliix42): I'm aware that this is super inefficient, but who cares + struct dirnode **items = realloc(cur->directories, (cur->num_dirs + 1) * sizeof(struct dirnode *)); + + if (!items) { + fprintf(stderr, "\033[93m[error] Failed to allocate memory\033[0m\n"); + return; + } + + cur->directories = items; + cur->directories[cur->num_dirs] = item; + cur->num_dirs++; +} + +void add_file(struct dirnode *cur, struct filenode *item) { + // NOTE(feliix42): I'm aware that this is super inefficient, but who cares + struct filenode **items = realloc(cur->files, (cur->num_files + 1) * sizeof(struct filenode *)); + + if (!items) { + fprintf(stderr, "\033[93m[error] Failed to allocate memory\033[0m\n"); + return; + } + + cur->files = items; + cur->files[cur->num_files] = item; + cur->num_files++; +} diff --git a/day_7/filetree.h b/day_7/filetree.h new file mode 100644 index 0000000..7571d96 --- /dev/null +++ b/day_7/filetree.h @@ -0,0 +1,30 @@ +#ifndef FILETREE_H +#define FILETREE_H + +#include +#include + +struct filenode { + char *name; + + unsigned long size; +}; + +struct dirnode { + char *name; + + struct filenode **files; + size_t num_files; + + struct dirnode **directories; + size_t num_dirs; + + unsigned long size; +}; + +void add_directory(struct dirnode *cur, struct dirnode *item); +void add_file(struct dirnode *cur, struct filenode *item); + + + +#endif // FILETREE_H diff --git a/day_7/input.txt b/day_7/input.txt new file mode 100644 index 0000000..374d23b --- /dev/null +++ b/day_7/input.txt @@ -0,0 +1,984 @@ +$ cd / +$ ls +dir gqcclj +dir lmtpm +dir nhqwt +dir qcq +dir vwqwlqrt +$ cd gqcclj +$ ls +62425 dqp.gjm +174181 hrtw.qsd +273712 pflp.mdw +169404 zlthnlhf.mtn +180878 zprprf +$ cd .. +$ cd lmtpm +$ ls +dir clffsvcw +163587 cvcl.jqh +dir dcqnblb +dir dtpwln +dir fvt +dir hrcrw +dir jdqzmqn +236754 nrdmlj +205959 pflp.mdw +dir qcq +dir rsn +129926 vdgcqdn.sqd +dir zprprf +$ cd clffsvcw +$ ls +6997 dcqnblb.wbh +145711 dqp +159225 pflp.mdw +$ cd .. +$ cd dcqnblb +$ ls +dir dcqnblb +dir gfn +dir lpswsp +dir lvt +dir zprprf +$ cd dcqnblb +$ ls +2020 grpdmd.ggz +dir zpswzfvg +$ cd zpswzfvg +$ ls +206998 zprprf.gnw +$ cd .. +$ cd .. +$ cd gfn +$ ls +277530 rhbvtblc.mvw +$ cd .. +$ cd lpswsp +$ ls +173180 dcqnblb +$ cd .. +$ cd lvt +$ ls +dir hjllwsvl +dir ptbt +$ cd hjllwsvl +$ ls +dir wqnc +$ cd wqnc +$ ls +64695 grpdmd.ggz +$ cd .. +$ cd .. +$ cd ptbt +$ ls +150880 vvbt.gtp +$ cd .. +$ cd .. +$ cd zprprf +$ ls +dir ldzslndn +dir qftt +$ cd ldzslndn +$ ls +dir bwqqsbhg +129454 vbn +$ cd bwqqsbhg +$ ls +108701 zprprf.gss +$ cd .. +$ cd .. +$ cd qftt +$ ls +64268 cvcl.jqh +$ cd .. +$ cd .. +$ cd .. +$ cd dtpwln +$ ls +196215 cvcl.jqh +dir dpwg +dir ldzslndn +dir znnsqqh +$ cd dpwg +$ ls +192388 gmh +47754 grgzh.qdl +99449 hqsh +dir pbmf +50061 pflp.mdw +192902 qcq.pgg +dir rmpvj +dir scgc +$ cd pbmf +$ ls +210083 wpfnwbl.mgf +$ cd .. +$ cd rmpvj +$ ls +125738 nmlnbvrd +226214 zprprf.jnp +114257 zprprf.srs +$ cd .. +$ cd scgc +$ ls +182115 rrc.rcc +$ cd .. +$ cd .. +$ cd ldzslndn +$ ls +201992 qcrm.cpd +$ cd .. +$ cd znnsqqh +$ ls +85635 cvcl.jqh +$ cd .. +$ cd .. +$ cd fvt +$ ls +dir dcqnblb +dir gnc +75864 vfn +$ cd dcqnblb +$ ls +dir dcqnblb +dir lbnflwsh +$ cd dcqnblb +$ ls +269901 cvcl.jqh +$ cd .. +$ cd lbnflwsh +$ ls +33336 grpdmd.ggz +42861 phg.wmc +$ cd .. +$ cd .. +$ cd gnc +$ ls +dir jhjbjsp +dir jjppr +$ cd jhjbjsp +$ ls +96177 ldzslndn +$ cd .. +$ cd jjppr +$ ls +181016 dqp +$ cd .. +$ cd .. +$ cd .. +$ cd hrcrw +$ ls +261376 dtjfpppr.dww +54658 vsrgvw.pfn +$ cd .. +$ cd jdqzmqn +$ ls +52342 dcpndc.vlg +171946 gggpchh.tbb +dir ldzslndn +11156 nbfrfvv.gzw +$ cd ldzslndn +$ ls +107873 cvcl.jqh +216034 gfdjrbz +68844 pqllfrrh.jcf +$ cd .. +$ cd .. +$ cd qcq +$ ls +152886 ldzslndn.ltn +105125 vwplh.vbf +$ cd .. +$ cd rsn +$ ls +15385 hqcmjdgv.jjv +105735 qcq.bzg +58805 snczcsp +26668 vbn +$ cd .. +$ cd zprprf +$ ls +dir chbmq +dir dcqnblb +dir dqp +dir nfspb +89506 zprprf.hnt +$ cd chbmq +$ ls +dir cnjvw +dir dqp +151434 frsvrdnt +dir msztjvcb +240689 qcq.jlh +dir sjzrcg +97312 vnr.zfr +dir zprprf +$ cd cnjvw +$ ls +dir bpbs +252403 cqhtshc +dir djmjhn +10935 fhqmswr +6582 pdwml.ldd +dir qcq +219282 rfmd +$ cd bpbs +$ ls +147582 bnhwsnsj.gdm +61362 cvcl.jqh +152857 vdgcqdn.sqd +$ cd .. +$ cd djmjhn +$ ls +dir bjdbcjbb +dir dcqnblb +dir dqp +dir lgdwtt +$ cd bjdbcjbb +$ ls +110710 cvcl.jqh +252792 hmshctr.lgz +dir mjhtmbj +189745 shsswcgr +dir tfnhp +194940 vbn +dir zprprf +$ cd mjhtmbj +$ ls +dir dqp +dir hbthpcmb +$ cd dqp +$ ls +200832 sbcrz.qgw +$ cd .. +$ cd hbthpcmb +$ ls +55191 ffcntg +$ cd .. +$ cd .. +$ cd tfnhp +$ ls +276825 dqp +161538 gqmr.wgb +$ cd .. +$ cd zprprf +$ ls +287638 dcqnblb.ssp +41274 hgmrvj.mwf +249118 sbb.gsf +105141 wwrg.gqz +$ cd .. +$ cd .. +$ cd dcqnblb +$ ls +1957 btmmc +32386 dtzbzg.dhm +dir mmrbj +98283 ntmhfgtl.pmf +dir zprprf +$ cd mmrbj +$ ls +273194 wnsq +251527 zprprf +$ cd .. +$ cd zprprf +$ ls +27678 ldzslndn.rrl +62866 ljf.fdj +148502 qcq.dlg +dir rvgqvm +179231 tllnmhn.pjp +64033 vbn +dir zcdrj +$ cd rvgqvm +$ ls +dir ntbv +262324 prhgj.szz +dir qbvdh +$ cd ntbv +$ ls +116608 cgv.fvj +175200 swpswq.twt +$ cd .. +$ cd qbvdh +$ ls +160353 sdhfrb.wjn +$ cd .. +$ cd .. +$ cd zcdrj +$ ls +283262 ctl +$ cd .. +$ cd .. +$ cd .. +$ cd dqp +$ ls +dir jfzm +111438 rdrgb.mjf +64194 wgtmqrq +dir zprprf +$ cd jfzm +$ ls +158774 pflp.mdw +$ cd .. +$ cd zprprf +$ ls +215264 sgsstcp +$ cd .. +$ cd .. +$ cd lgdwtt +$ ls +dir qcq +$ cd qcq +$ ls +165461 ldzslndn.vvb +$ cd .. +$ cd .. +$ cd .. +$ cd qcq +$ ls +dir dpd +165044 grpdmd.ggz +82343 ldzslndn +dir mwg +176689 psjcwp.wct +44404 qcq.zwd +$ cd dpd +$ ls +84087 dqp +227386 zprprf.gfs +$ cd .. +$ cd mwg +$ ls +214086 pflp.mdw +dir sjjsdn +225859 wcdt +158892 zprprf.frs +$ cd sjjsdn +$ ls +260121 gplgp.dfn +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dqp +$ ls +dir hcrwclpg +dir zphd +$ cd hcrwclpg +$ ls +dir cmqntjj +16393 ldzslndn.qbm +91152 qqdtc.zdq +$ cd cmqntjj +$ ls +272266 ldzslndn.pll +$ cd .. +$ cd .. +$ cd zphd +$ ls +165711 chftwcsw.fqw +256871 cvcl.jqh +251168 zprprf.gfv +$ cd .. +$ cd .. +$ cd msztjvcb +$ ls +206231 brzn.lmn +dir dcqnblb +21571 dqp +dir fmn +45779 mlfctz.cjr +288827 pflp.mdw +220578 qcq.fqf +$ cd dcqnblb +$ ls +198121 ghbwgs +93681 nmqhl.vpq +$ cd .. +$ cd fmn +$ ls +29407 mdfws.qvs +$ cd .. +$ cd .. +$ cd sjzrcg +$ ls +155120 ddclvsjr.rpq +136029 ldzslndn.dcm +dir vhzh +$ cd vhzh +$ ls +212446 vbn +$ cd .. +$ cd .. +$ cd zprprf +$ ls +240335 crt.gqh +185363 gnmm.qgh +dir ldzslndn +dir nwl +dir qll +277043 vbn +217796 vtvgpdl.vtm +$ cd ldzslndn +$ ls +273570 cvcl.jqh +68510 fgdmz.hrc +dir npq +dir swjrzzrm +$ cd npq +$ ls +97923 dzcjsqwt +$ cd .. +$ cd swjrzzrm +$ ls +180599 tmpgn.bjf +$ cd .. +$ cd .. +$ cd nwl +$ ls +171833 dlwrfhh.qgn +$ cd .. +$ cd qll +$ ls +219926 dcqnblb.bvn +$ cd .. +$ cd .. +$ cd .. +$ cd dcqnblb +$ ls +dir lvpb +276198 tbgcm.qct +$ cd lvpb +$ ls +142590 bvhjlld +268259 gnjfg.sgb +dir qcq +206220 qcq.zsg +258137 rrsw.dnb +dir tmr +215549 vbn +$ cd qcq +$ ls +dir mmpgd +dir tdsz +dir tmfvsjwc +$ cd mmpgd +$ ls +70793 jwbnpwnn +$ cd .. +$ cd tdsz +$ ls +246310 tdvrhhg.bzq +$ cd .. +$ cd tmfvsjwc +$ ls +103899 grpdmd.ggz +287850 ldzslndn +125930 llhr +$ cd .. +$ cd .. +$ cd tmr +$ ls +83344 fbtfcg.hqp +$ cd .. +$ cd .. +$ cd .. +$ cd dqp +$ ls +dir lbgmcbv +dir nbg +$ cd lbgmcbv +$ ls +81776 wzdzzdp +$ cd .. +$ cd nbg +$ ls +dir mfsgjp +155574 pflp.mdw +$ cd mfsgjp +$ ls +199400 vdgcqdn.sqd +$ cd .. +$ cd .. +$ cd .. +$ cd nfspb +$ ls +262412 csrdtbs +73867 vbn +136389 zqps.hjt +$ cd .. +$ cd .. +$ cd .. +$ cd nhqwt +$ ls +123766 cvcl.jqh +dir dhrtvctp +222086 grpdmd.ggz +dir gzg +26005 lhpmz.tgz +dir mcnjwwfr +117122 msn.gst +$ cd dhrtvctp +$ ls +224079 vdgcqdn.sqd +$ cd .. +$ cd gzg +$ ls +124395 dqp +dir wqdbtqm +$ cd wqdbtqm +$ ls +237354 pflp.mdw +212019 vdgcqdn.sqd +$ cd .. +$ cd .. +$ cd mcnjwwfr +$ ls +92504 cshdztf +dir dctl +dir dqp +dir flcrmhlj +161879 grpdmd.ggz +dir gtt +dir hlbnhchz +220093 mdtdsgvm.zgg +dir twntr +287192 vbn +$ cd dctl +$ ls +dir bbhch +155396 hrrj.jzm +164971 pblqmwj.vdb +dir wnlgfpvf +$ cd bbhch +$ ls +dir dpqtp +dir jvdrcw +$ cd dpqtp +$ ls +174135 gwb.qrb +$ cd .. +$ cd jvdrcw +$ ls +215993 dcqnblb.cqp +200800 stjttf.ngc +$ cd .. +$ cd .. +$ cd wnlgfpvf +$ ls +135978 cvcl.jqh +dir dqp +54018 lbrfmt +$ cd dqp +$ ls +270516 dcqnblb.jqw +dir dqp +144626 grpdmd.ggz +157731 hvcv.rhp +133773 lnnt +76250 vdgcqdn.sqd +$ cd dqp +$ ls +41504 zprprf.cmc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dqp +$ ls +dir dqp +dir ldzslndn +236737 mqzcvm.fjh +239746 nhcdz.ncj +dir rpchqq +248824 vdgcqdn.sqd +250937 zrchht.mwg +$ cd dqp +$ ls +203381 qcq.djm +$ cd .. +$ cd ldzslndn +$ ls +dir dqp +dir fptnzlv +dir gmbnpm +dir vhvblt +$ cd dqp +$ ls +19579 qcq.lhg +$ cd .. +$ cd fptnzlv +$ ls +209930 dcqnblb +$ cd .. +$ cd gmbnpm +$ ls +dir ldzslndn +dir qcq +$ cd ldzslndn +$ ls +11075 pflp.mdw +$ cd .. +$ cd qcq +$ ls +dir tdp +$ cd tdp +$ ls +40741 vdgcqdn.sqd +$ cd .. +$ cd .. +$ cd .. +$ cd vhvblt +$ ls +dir lzr +$ cd lzr +$ ls +62245 gbnj.llg +$ cd .. +$ cd .. +$ cd .. +$ cd rpchqq +$ ls +dir bcs +dir dcqnblb +dir fvjzn +dir lrphzrv +$ cd bcs +$ ls +179794 bbn.dzb +242069 cmjdmzjf.zgf +1703 cvcl.jqh +dir gnmhwj +dir ldzslndn +152520 qltpsz.jsj +dir sqqjfps +$ cd gnmhwj +$ ls +dir gvs +201600 hptn.ftf +dir hzrnb +dir qcq +dir sqhl +$ cd gvs +$ ls +152358 zprprf.mlh +$ cd .. +$ cd hzrnb +$ ls +94290 gplsfd +$ cd .. +$ cd qcq +$ ls +91909 vmqd.bmg +$ cd .. +$ cd sqhl +$ ls +238673 vdgcqdn.sqd +262885 zmdvr.nfg +$ cd .. +$ cd .. +$ cd ldzslndn +$ ls +240461 mdz +84303 qtj +$ cd .. +$ cd sqqjfps +$ ls +88753 fwn.tff +$ cd .. +$ cd .. +$ cd dcqnblb +$ ls +dir dqp +189996 dqp.pvp +$ cd dqp +$ ls +dir qvfjz +196506 vbn +$ cd qvfjz +$ ls +209316 pflp.mdw +107459 rwpbh.vpt +$ cd .. +$ cd .. +$ cd .. +$ cd fvjzn +$ ls +241464 cvcl.jqh +dir dqp +dir ldzslndn +dir msp +125 pflp.mdw +131895 vbn +$ cd dqp +$ ls +34019 pflp.mdw +202957 vbn +$ cd .. +$ cd ldzslndn +$ ls +147492 cvcl.jqh +248719 spc.rfv +$ cd .. +$ cd msp +$ ls +184407 cvcl.jqh +$ cd .. +$ cd .. +$ cd lrphzrv +$ ls +dir bbwqmbg +81858 cvcl.jqh +dir dqp +248670 gqqsww.tsn +199141 grpdmd.ggz +dir ldzslndn +34514 ldzslndn.ctw +dir tln +214615 zprprf.fwm +$ cd bbwqmbg +$ ls +129750 flf +dir pvlw +dir qcq +126 sqcqphz.tbm +$ cd pvlw +$ ls +198005 jfvj.hdv +$ cd .. +$ cd qcq +$ ls +dir wgdzws +$ cd wgdzws +$ ls +253522 ldzslndn.qwt +$ cd .. +$ cd .. +$ cd .. +$ cd dqp +$ ls +281993 cvcl.jqh +dir hwqjlwcb +50532 msccz.qgm +102187 trv.tnq +111 wplnmj.bfl +$ cd hwqjlwcb +$ ls +267580 dhjqb.dsb +153195 ldzslndn.jqv +41526 mvwcwc.zsc +$ cd .. +$ cd .. +$ cd ldzslndn +$ ls +58666 cvcl.jqh +79950 dqp.tmc +242217 hns.lrb +dir njswzh +240692 vdgcqdn.sqd +dir zvmjvcdm +52909 zzh +$ cd njswzh +$ ls +149732 cvcl.jqh +dir rnmfd +$ cd rnmfd +$ ls +75368 dqp.hmv +14350 vbn +$ cd .. +$ cd .. +$ cd zvmjvcdm +$ ls +dir jgczt +$ cd jgczt +$ ls +dir qcq +95941 qzvvwshv.jwc +$ cd qcq +$ ls +273942 pflp.mdw +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd tln +$ ls +dir bmcng +1518 lrg +dir vnjfrhp +$ cd bmcng +$ ls +38917 fqcrt +$ cd .. +$ cd vnjfrhp +$ ls +dir dcqnblb +dir dqp +247186 grpdmd.ggz +dir ldzslndn +169216 pflp.mdw +206487 vdgcqdn.sqd +16976 vlsrzjmb.mmc +257938 wjl +$ cd dcqnblb +$ ls +dir dqp +$ cd dqp +$ ls +184133 qcq +$ cd .. +$ cd .. +$ cd dqp +$ ls +dir dcqnblb +31612 dqp.pnt +212283 ldzslndn +61600 vdbfc.ddj +197189 wpv.wff +$ cd dcqnblb +$ ls +62412 tfzllmrj +dir zprprf +$ cd zprprf +$ ls +dir bqnpsl +dir dszrvpzc +$ cd bqnpsl +$ ls +261548 spbsbbsw.cmn +$ cd .. +$ cd dszrvpzc +$ ls +188232 sggpqslr.smn +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd ldzslndn +$ ls +dir bgnhd +dir pgvcdzwz +dir qgzhm +$ cd bgnhd +$ ls +56989 cvcl.jqh +$ cd .. +$ cd pgvcdzwz +$ ls +110034 qhgnndv +$ cd .. +$ cd qgzhm +$ ls +247232 grpdmd.ggz +269292 ldzslndn +153843 tpz +dir vnschqwr +162392 wnq.btb +$ cd vnschqwr +$ ls +43005 fvtvzfqm.jvc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd flcrmhlj +$ ls +245668 dcqnblb.sdj +dir lffj +229909 pflp.mdw +280176 vbn +$ cd lffj +$ ls +116451 jmzz.jdd +dir pjlwb +162815 pmhlqq.snr +226183 zffth +$ cd pjlwb +$ ls +67518 qcq.hjq +$ cd .. +$ cd .. +$ cd .. +$ cd gtt +$ ls +52105 grpdmd.ggz +126869 zprprf.fgj +$ cd .. +$ cd hlbnhchz +$ ls +3064 dqp.lrw +278756 grpdmd.ggz +177208 ldzslndn.wlv +141685 vbn +$ cd .. +$ cd twntr +$ ls +63747 cvcl.jqh +$ cd .. +$ cd .. +$ cd .. +$ cd qcq +$ ls +226858 cwblp.zgp +dir jjqsmfhr +dir rjbqtrq +dir vwmpnbts +141715 wdbhdch +286381 zprprf +$ cd jjqsmfhr +$ ls +dir btmm +dir fqndtlgq +$ cd btmm +$ ls +4031 dqp.lrr +dir fzdd +$ cd fzdd +$ ls +dir vnwpn +$ cd vnwpn +$ ls +dir bzlgsl +dir ztvzrrbv +$ cd bzlgsl +$ ls +9294 ldzslndn.sqr +$ cd .. +$ cd ztvzrrbv +$ ls +256017 cvcl.jqh +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd fqndtlgq +$ ls +271528 ccbmgp.bwd +$ cd .. +$ cd .. +$ cd rjbqtrq +$ ls +122150 ldzslndn +46467 tpdvp.pjf +$ cd .. +$ cd vwmpnbts +$ ls +47518 fcrwfzvm +263343 gmc.lrt +212764 qcq +$ cd .. +$ cd .. +$ cd vwqwlqrt +$ ls +dir psrs +$ cd psrs +$ ls +281998 zprprf.hml + diff --git a/day_7/lexer.l b/day_7/lexer.l new file mode 100644 index 0000000..d0c3dbf --- /dev/null +++ b/day_7/lexer.l @@ -0,0 +1,79 @@ +%{ +#include +#include +#include +#include "parser.h" + +#ifdef DOESNT_HAVE_STRDUP +#warning DOESNT_HAVE_STRDUP +char *strdup(const char *s); +#endif + +%} + +%option warn nodefault + +/* makes the scanner terminate after reaching <> instead of assuming a new input was provided */ +%option noyywrap +/* disable some unused functionality, add scanner tracking */ +%option nounput noinput batch debug + +/* gimme a reentrant parser (overkill but more pure) */ +%option reentrant + +%option bison-bridge + + +NL [\n] +SPACE [ ] + +/*general definitions*/ +CHAR [a-zA-Z] +NUM [0-9] + +/*operands*/ +SHELL [$] +ROOT [/] +PARENT ".." +CHDIR "cd" +LIST "ls" +DIR "dir" + + +%% + +{NL} { return NEWLINE; } +{SPACE} { return SPACE; } + + +{SHELL}{SPACE} { return PROMPT; } +{CHDIR} { return CHDIR; } +{LIST} { return LIST; } +{ROOT} { return ROOT; } +{PARENT} { return PARENT; } +{DIR} { return DIRECTORY; } + + + +{NUM}+ { + unsigned long num = strtoul(yytext, NULL, 10); + yylval->num = num; + return SIZE; + } +{CHAR}+ | +{CHAR}+"."{CHAR}+ { + yylval->path = strdup(yytext); + // yylval->path = calloc(strlen(yytext) + 1, sizeof(char)); + // strcpy(yylval->path, yytext); + return PATHSPEC; + } + +<> { + return END_OF_FILE; + } +. { + printf("[error] Encountered unexpected token %s\n", yytext); + return 0; + } + +%% diff --git a/day_7/parser.y b/day_7/parser.y new file mode 100644 index 0000000..aa52c0a --- /dev/null +++ b/day_7/parser.y @@ -0,0 +1,223 @@ +/* Require bison minimal version */ +%require "3.2" + +/* write out a header file containing the token defines */ +%header + +// Code for the header file generated by bison +%code requires { + #include "filetree.h" + + typedef void* yyscan_t; + + struct dirstack { + struct dirstack *next; + struct dirnode *item; + }; + + struct parser_state { + struct dirnode *root; + struct dirnode *cur; + + /// models the current directory stack we're in for simplicity + struct dirstack *stackptr; + }; + + struct dirstack* dirstack_push(struct dirstack *stack, struct dirnode *item); + struct dirstack* dirstack_pop(struct dirstack *stack); +} + +// Code for the c file +%{ + #include + #include + #include + #include "parser.h" + #include "lexer.h" + + struct dirstack* dirstack_push(struct dirstack *stack, struct dirnode *item) { + struct dirstack *head = calloc(1, sizeof(struct dirstack)); + if (!head) { + fprintf(stderr, "\033[91m[error] Ran out of memory\033[0m\n"); + return NULL; + } + + head->item = item; + head->next = stack; + + return head; + } + + struct dirstack* dirstack_pop(struct dirstack *stack) { + if (!stack) { + fprintf(stderr, "\033[91m[error] Called `dirstack_pop on an empty stack\033[0m\n"); + return NULL; + } + + struct dirstack *next_item = stack->next; + free(stack); + + return next_item; + } + + void yyerror(struct parser_state* state, yyscan_t scanner, const char* msg) { + (void)state; + (void)scanner; + fprintf(stderr, "\033[93mSyntax Error: %s\033[0m\n", msg); + } +%} + +// define a reentrant parser +%define api.pure + +// enable parser tracing and detailed error messages (plus Lookahead Correction) +%define parse.trace +%define parse.error detailed +%define parse.lac full + +%lex-param { yyscan_t scanner } +%parse-param { struct parser_state* state } +%parse-param { yyscan_t scanner } + +%union { + char *path; + unsigned long num; +} + +%start input +%token NEWLINE SPACE +%token PROMPT CHDIR LIST +%token ROOT PARENT DIRECTORY +%token PATHSPEC +%token SIZE +%term END_OF_FILE + +%% + +input + : command input + | END_OF_FILE { return 0; } + ; + +command + : PROMPT CHDIR SPACE ROOT NEWLINE { + while (state->stackptr->next) { + state->stackptr = dirstack_pop(state->stackptr); + } + state->cur = state->stackptr->item; + } + | PROMPT CHDIR SPACE PARENT NEWLINE { + state->stackptr = dirstack_pop(state->stackptr); + state->cur = state->stackptr->item; + } + | PROMPT CHDIR SPACE PATHSPEC NEWLINE { + // TODO: CLEANUP + if (!state) { + fprintf(stderr, "\033[91m[error] the fuck\033[0m\n"); + } else { + printf("searching in %s now for path %s\n", state->cur->name, $4); + } + + // move into the new directory (creating it if it doesn't exist is not necessary, LIST does that) + struct dirnode *cur_node = state->cur; + // search for the directory name + size_t found = 0; + int c = -1; + size_t i; + for (i = 0; i < cur_node->num_dirs; i++) { + if (strcmp($4, cur_node->directories[i]->name) == 0) { + found = i; + c = 0; + printf("equal: [%s] and [%s]\n", $4, cur_node->directories[i]->name); + } else { + printf("not equal: [%s] and [%s]\n", $4, cur_node->directories[i]->name); + } + } + if (c == -1) { + fprintf(stderr, "\033[91m[error] got no such directory lol\033[0m\n"); + // TODO: error, directory not found + } else { + printf("found it\n"); + } + + struct dirnode *next = cur_node->directories[found]; + + // actually move into the new directory + state->stackptr = dirstack_push(state->stackptr, next); + state->cur = next; + } + | PROMPT LIST NEWLINE output + | NEWLINE + ; + +output + : listing NEWLINE output + | + ; + +listing + : DIRECTORY SPACE PATHSPEC { + struct dirnode *item = calloc(1, sizeof(struct dirnode)); + if (!item) { + // TODO: error handling + } + + item->name = $3; + + add_directory(state->cur, item); + printf("know about %zu dirs now!\n", state->cur->num_dirs); + } + | SIZE SPACE PATHSPEC { + struct filenode *item = calloc(1, sizeof(struct filenode)); + if (!item) { + // TODO: error handling + } + + item->name = $3; + item->size = $1; + + add_file(state->cur, item); + } + ; + +%% + + +int main(void) { + struct dirnode *root = calloc(1, sizeof(struct dirnode)); + if (!root) { + fprintf(stderr, "\033[91m[error] Ran out of memory\033[0m\n"); + return EXIT_FAILURE; + } + root->name = "\0"; + + struct dirstack *stack_ptr = dirstack_push(NULL, root); + + struct parser_state *state = calloc(1, sizeof(struct parser_state)); + if (!state) { + fprintf(stderr, "\033[91m[error] Ran out of memory\033[0m\n"); + return EXIT_FAILURE; + } + state->root = root; + state->cur = root; + state->stackptr = stack_ptr; + + + yyscan_t scanner; + if (yylex_init(&scanner)) { + fprintf(stderr, "\033[91m[error] Could not initialize lexer\033[0m\n"); + return EXIT_FAILURE; + } + + if (yyparse(state, scanner)) { + // TODO: Error handling https://www.gnu.org/software/bison/manual/html_node/Parser-Function.html + // error during parse occured + return EXIT_FAILURE; + } + + yylex_destroy(scanner); + + // TODO: evaluation (bottom-up computation of sizes using a dirstack) + + return 0; +}