From 7391c21087e4fb402931afa9d4a12b12410dae84 Mon Sep 17 00:00:00 2001 From: Travis Avey Date: Fri, 15 May 2026 13:26:54 -0400 Subject: [PATCH] moving from gitlab --- 001TempConverter/main.c | 24 + 002Factorial/factorial.c | 47 ++ 003Cat/cat.c | 39 ++ 003Cat/test.txt | 42 ++ 004AoC/input.txt | 1000 +++++++++++++++++++++++++++ 004AoC/main.c | 72 ++ 004AoC/test.txt | 4 + 005Timer/timer.c | 73 ++ 006FindReplace/FindReplace/main.c | 71 ++ 006FindReplace/FindReplace/test.txt | 3 + 006FindReplace/main.c | 9 + 007SQLiteIntro/a.out | Bin 0 -> 34888 bytes 007SQLiteIntro/input.sql | 9 + 007SQLiteIntro/main.c | 241 +++++++ 008LinkedList/arrays.c | 20 + 008LinkedList/linkedList.c | 130 ++++ 009TipsTricks/main.c | 44 ++ 010WeatherAPI/main.c | 78 +++ 011LineNumbers/window.c | 21 + 012ArrayDecay/array-decay.c | 26 + 013WordCount/main.c | 31 + 013WordCount/words.txt | 5 + 014Criterion/math.c | 31 + 014Criterion/math.h | 8 + 014Criterion/test.c | 57 ++ 015WebServer/main.c | 101 +++ 016RestAPI/Makefile | 8 + 016RestAPI/db.c | 72 ++ 016RestAPI/db.h | 12 + 016RestAPI/init.sql | 12 + 016RestAPI/server.c | 219 ++++++ LICENSE | 18 + README.md | 12 + 33 files changed, 2539 insertions(+) create mode 100644 001TempConverter/main.c create mode 100644 002Factorial/factorial.c create mode 100644 003Cat/cat.c create mode 100644 003Cat/test.txt create mode 100644 004AoC/input.txt create mode 100644 004AoC/main.c create mode 100644 004AoC/test.txt create mode 100644 005Timer/timer.c create mode 100644 006FindReplace/FindReplace/main.c create mode 100644 006FindReplace/FindReplace/test.txt create mode 100644 006FindReplace/main.c create mode 100755 007SQLiteIntro/a.out create mode 100644 007SQLiteIntro/input.sql create mode 100644 007SQLiteIntro/main.c create mode 100644 008LinkedList/arrays.c create mode 100644 008LinkedList/linkedList.c create mode 100644 009TipsTricks/main.c create mode 100644 010WeatherAPI/main.c create mode 100644 011LineNumbers/window.c create mode 100644 012ArrayDecay/array-decay.c create mode 100644 013WordCount/main.c create mode 100644 013WordCount/words.txt create mode 100644 014Criterion/math.c create mode 100644 014Criterion/math.h create mode 100644 014Criterion/test.c create mode 100644 015WebServer/main.c create mode 100644 016RestAPI/Makefile create mode 100644 016RestAPI/db.c create mode 100644 016RestAPI/db.h create mode 100644 016RestAPI/init.sql create mode 100644 016RestAPI/server.c create mode 100644 LICENSE create mode 100644 README.md diff --git a/001TempConverter/main.c b/001TempConverter/main.c new file mode 100644 index 0000000..fdbf3f5 --- /dev/null +++ b/001TempConverter/main.c @@ -0,0 +1,24 @@ +#include + +int main(int argc, char *argv[]) { + + float temp; + char unit; + + printf("Enter temp and unit (25.0 C) "); + + scanf("%f %c", &temp, &unit); + if (unit == 'C' || unit == 'c') { + printf("%.2fC is ", temp); + temp = temp * (9.0 / 5.0) + 32.0; + printf("%.2fF\n", temp); + } else if (unit == 'F' || unit == 'f') { + printf("%.2fF is ", temp); + temp = (temp - 32.0) * 5.0 / 9.0; + printf("%.2fC\n", temp); + } else { + printf("Unknown temperature unit. Use C or F\n"); + } + + return 0; +} diff --git a/002Factorial/factorial.c b/002Factorial/factorial.c new file mode 100644 index 0000000..f118ed3 --- /dev/null +++ b/002Factorial/factorial.c @@ -0,0 +1,47 @@ +#include // output to terminal +#include // has our atoi method + +long factorial(int n); + +int main(int argc, char **argv) { + + // get first to arguments passed + // very first is name of program + printf("argv[0]: %s\n", argv[0]); + // argv[0] = ./nameofexecutable + // argv[1] will be our value to caluclate factorial + + if (argc < 2) { + printf("error: value to calculate factorial is missing"); + printf("\tUsage: ./factorial 3\n\twhere 3 is the value to calculate\n"); + return -1; + } + // convert our char * to an int + int n = atoi(argv[1]); + + printf("Factorial of %d is %ld\n", n, factorial(n)); + + return 0; +} + +// use recursion first time through? +// then maybe show a simple for loop +long factorial(int n) { + + // factorial is annotated as N! + // example: 5! = 5 x 4 x 3 x 2 x 1 + // 0! = 1 + // so properties of math yada yada.. + // we can: 5! = 1 x 2 x 3 x 4 x 5 + // we can use a basic loop and go all the way up to n + long answer = 1; + for (int i = 1; i <= n; i++) { + // answer = answer * i; + answer *= i; + } + return answer; + + if (n == 1) + return 1; + return n * factorial(n - 1); +} diff --git a/003Cat/cat.c b/003Cat/cat.c new file mode 100644 index 0000000..538d658 --- /dev/null +++ b/003Cat/cat.c @@ -0,0 +1,39 @@ +#include + +FILE *openFile(const char *filename); +void catFile(FILE *file); + +int main(int argc, char *argv[]) { + + if (argc != 2) { + printf("error: missing file\nusage: cat \n"); + return -1; + } + + FILE *file = openFile(argv[1]); + if (!file) { + printf("error: file (%s) not found\n", argv[1]); + return -2; + } + + catFile(file); + + fclose(file); + + return 0; +} + +FILE *openFile(const char *filename) { + FILE *file; + + file = fopen(filename, "r"); + + return file; +} + +void catFile(FILE *file) { + char buf[512]; + while (fgets(buf, 512, file)) { + printf("%s", buf); + } +} diff --git a/003Cat/test.txt b/003Cat/test.txt new file mode 100644 index 0000000..deb3bc4 --- /dev/null +++ b/003Cat/test.txt @@ -0,0 +1,42 @@ +[Verse 1] +We're no strangers to love +You know the rules and so do I (Do I) +A full commitment's what I'm thinking of +You wouldn't get this from any other guy + +[Pre-Chorus] +I just wanna tell you how I'm feeling +Gotta make you understand + +[Chorus] +Never gonna give you up +Never gonna let you down +Never gonna run around and desert you +Never gonna make you cry +Never gonna say goodbye +Never gonna tell a lie and hurt you + +[Verse 2] +We've known each other for so long +Your heart's been aching, but you're too shy to say it (To say it) +Inside, we both know what's been going on (Going on) +We know the game, and we're gonna play it + +[Pre-Chorus] +And if you ask me how I'm feeling +Don't tell me you're too blind to see + +[Chorus] +Never gonna give you up +Never gonna let you down +Never gonna run around and desert you +Never gonna make you cry +Never gonna say goodbye +Never gonna tell a lie and hurt you +Never gonna give you up +Never gonna let you down +Never gonna run around and desert you +Never gonna make you cry +Never gonna say goodbye +Never gonna tell a lie and hurt you + diff --git a/004AoC/input.txt b/004AoC/input.txt new file mode 100644 index 0000000..25b1572 --- /dev/null +++ b/004AoC/input.txt @@ -0,0 +1,1000 @@ +zlmlk1 +vqjvxtc79mvdnktdsxcqc1sevenone +vsskdclbtmjmvrseven6 +8jkfncbeight7seven8 +six8dbfrsxp +2zpcbjdxcjfone68six +zqmzgfivethreefdnlhpeight8798 +fivenineone6 +6sixzvdsprdqlftwonine +lqztrmztwo8dg +four6onerv2pfhm +plvzrs5 +5282gdnc918 +pskjsrchjpxoneonenine96fivefour +fivefour2hhtprpjndm4 +6qbdcfdjsd1lmldklflteight +gctgdhpkkjninekj65rkqg8 +eight6gcjlsmzt5 +5chvmhmfgl7xkjfdpdbp +5tpzpnrgpftrnine +threeonehqbzktq1 +685fivetwofour4lvgxgdb +9jdxljkfqttstqxdzdsztsxrfjbkqmmsqzseven +twostcllbpndtwo15seven +8fivetwofivetjfvsxzs5kdkpxgxvsfhr7 +sevenlvrc2fivefivesixqkzdkrfour +45jjpmnscmmk +lhxgbfjtcknpvz6 +tndgnkcqtjbrzgbrfjr3fiveqxlktntzthree +vqb6threeeightbdt +1eighteight7fourone8 +bcmqn9onecnrzhsrsgzggzhtskjeightbz6khfhccktwonenrj +6qmgkbkmlxfourprhxrxrdseight +9three479 +9two6zhtjzfmjrteight +1fiverrxdmvfvxhs7jqzzqpcflzt75 +pnjmlpbbeightskgdf6one +6cpzqzfsjtpfq135 +484 +llfvhxglfivesixthreenseven36 +jhcpt9rq7fhzbnhk +tthree5lrgtbxxvonezfmdpseven2 +67jmrxfdmfbmzsixkzghng +sixthreefdbzhslqone2sevenfoursevennlnpjgsx +54zrkfbfq +six7rfpfbzbghxcnxlnfjkznine7 +8dfoursm338cz +sevenfiveeightone68 +dqmvcbdclx23653 +eight58qgjlcvflrggndskff +shmmk28 +93eightdtgcnhphv1 +gdtdjgggtj3dgrqsmvfh +one3pksbh32three +9kkpjrmhmmlzvqngnhftwoonexjqmnfive +rlsevenblrvrk7 +nine9hqmtshkjdhs +93fdbrbnnvxsktggqnjfjk7brsncmxkcfzhm34 +248twofbkfpxtheightwovng +28746threecbffiveseven +eight449 +4eightnine4ptmzvpfqxhrzvrpjhfsdsvlhbht +sevensevenfive6bjf +sqthreevhmvbgxvnk2one +ghpsix5seven31 +7llnsgdtzbxjbbqcmxfhgcdnptwothreeone +eight3fouroneplsrfvqf +4six6one +27twofvlssjbsk8j +njlllqnrvx8four +5onekcngbbmpnxseven9fourzcprjp +sevenfive2sevenknzpxtx +8eightljhtmnxpjhxhnqtwo1rjddcbj +mzsqh3sixfivethree +deightwoeighteight5 +nine42sevenscnjeight97 +2gcrkrfourfivenpzssevenseven4 +eightdtwosevenmj3two +9zkhqlcd3 +ctpncdkcmonehfive9 +sixrtwo7rqnine689 +sevenm16gshq4xqdxqbhcl +zxxnrpstkkmnhcc6 +three1sixninelsxrbkpneight +jzkfvrtmctjz5 +sdsfrh4nine +foureightfive7six +ninesixfivefive53seven +42threezpvxnrg5sfzctbtk +seven7pkfnqggvjthreextfksczdd +xsb6ntlfzxvlxrkx1sevenkmnqxhcdnqkdzt +6sbzfqfdm +lrfjxppqbdseven94ntnskpkdqeightsix5xskh +98czzcq +696cmcdpztwojk6tz +jbpfbqfdd64four2onezrfm +9jfklkpcffive5phpzqvhrtcqvmxvmgljn8 +329sixjglqzqzjnlsqbnqnzsb56 +59three +4863five +6txkcgtn7gtsxgtnine +lxdtnjvjbgxpnrft8eight2cjqfdtrk6dm +twothree53 +two1qf4 +6ltxhxcdfive +rlrdkzgnk6mnsbxfkhh +41z4nzcqzjqrnmsixtrrbgtwo +tbnsixsixtwomptdjtzkxfhlflpcdnbmrbctjscxq6qtmjmkpfk +1vqlkjtmjeightcjzxnzscczqmxcpvnprhtwo +lznhcphkdmrhpninesix344 +fggprsvtgmbbtlk14xkrnbcjrdbrsbdltfztmtwo +6rqlzs34cdlzmxone +two7zpbgsxl +lckblpljvv5two75fivegttgmvcpmlhltxz +bjfbxdpvnj581three +1seven4 +8ninezhzrgg6crlpggmtfour41lhjcqtblh +seveneight8sevenoneshvkcdhgfmxhn7dzccsdfkcx +7zljpgl2 +six1two +fourztcnpn8bsbzfhdhgkjjsthree +onepthfrh9vcs9sevenhljhmprhlsjrr +vlnpmqlpjfour5 +two3qfourlqsninethreefour +hshdseven7 +eightfive4five6four4flrzhrxzlreight +five187 +seven2xlbqkhtflqtsfhrf1vvnbt +onefiveninethree26 +2sck1n9eight6 +6sixsix7two9xznczchmx +27eight +7six3 +ztlbbncthreeseven54three +eight8r6mcrcgrz51 +eightnines6nine75 +nhx83fivetwofivefourrvxqhnpeightwoj +857sixzrnine6dlprzx +lteightwo2132seven7oneone +1516ldxxftfnineseven5 +6fourfivej3 +sjmjp99 +bprsznhxztpp51 +cmfivetwo1four +6mgcffzzspll15djsoneseven +9qjcvfourqdtmhlqzfxfg6 +six45fivetwo3zkpxmxsgxtmg4 +three12four72kvztxqdmfxhrxsp +threeninebnzthreedfqvm93kqmxpsnmb +8nzfbcmghfive92 +914six +sevenfive6 +3bxxccqzdjsfive78lhtpbl +5zdvjxsfvcptngh5 +vboneight4six17 +seven8eight9krfhll3lnine +stv4eightonesixcfveight +rnmjpszvx94fivefzsphkkftgxpsfhvthsbv +zmntmkcbgrtwonspdq7 +5ntxnjclc8six +8six58five +6ninesixeightqjnjfbbtlmcqvthree +hgjh9vhtdtcgkzpltnpxfqhsix7kq +64sevenc9 +96z62ninenine +sevenseven38 +ckk9zdnkjvskct +8flk7 +8eighthqntfrh +8cthrxbjlxbnqvqc496htsltqpqktqnz +31threetwo5 +twofour5 +rlggcjdthj3nine +18five4 +sevenhgncfjnseven1twoseven +kshqgsm3pcd518 +8qrpbpbbmzmbctsmvtddoneninefivetwofttd +fivetwoqvtscrs133two5seven +6ninedcsrftdtwofivexzmpxdccnine3 +threeseven73 +pppkjkgt3 +seven2six1ctmmjvdgj8h9 +xkpk3fivemgmrfph +pppgfivesixnineqxs6onebgsplgfhqp +cvjq15threesqqtpczr +three95 +twoldjbdxnqncntpphxshbthree767kfqbsqhlkg +9lfhbgmcqnhhlvvpvdtwo37 +v7gj +23fvgbbdjgst8 +six3frmpq +zrggqtwo6sqr8 +fiverdrxxtjlhzn97fxsqpxf +sevenlpb2sj3one312 +four6six9fourjbsix7fnr +lpbgnkhkkbninec8three +spvkzsthfour2 +ljbrlhtkxfkskvdbgxqmmjn3nineqmqtffkfive9 +h1jmxtlfivenine1djqrsnpqccvzmdhsmxnqrjlgdlnj +8threeseven +1onefive6one71five +qbjqnfsevenmls8gdnr66 +jgpzsix76pxldgpcvdcpzn +8nkdjhgrn +threeeighteight79 +9ninelzzrjqpkseven +75six +threebpfsn3three +4twonel +pjvmb14tzbz2tpfourfourseven +zslfour1pkklkrsixncvjtkn +honeight3 +six7stfffkjg +42fourktbdmzstcgmdtcgbhffthree +two27 +ghvrgzj6six1 +vxjqk3xhlr3 +threetgzkjslbdrdxgfzsd3lcheight8ninebxhzf +sixfive7one +f5 +qq6lkvlmrnseven9three +8fournine64rzdnnhgdsixseven +4vttbdfivesgdnjsvsxt6 +765 +6czbdlfcfkvplmcb +7one52 +eight6neightone +six5lttjtcbxmxnz +threetwo692eight +dhcztvmmlllg8four +btdjgnh9vjvlqfkznqr635hhcr +2jvbxcfournine +4sixonemp299sevenfour +1sixmdqkzqtgzeight7nine9 +4nnhfkrlmfpseven +blhvfourtwo5vrlqtqrlpxgd +kptg4eightvglvjdczfive +5599msgkplgqfnzseveneight6 +3tnfvgftsnbzksnrhtrtlbfxcfqfjgnndlmfvkqvhcmgdtwo +txvjfglxtbfive3zpx19 +six9four5 +5fourseven +fsevenmnfskhckvfszs73rnjqjhsseven +95knstccbfivepgpt +kmtjfxtztqnrngxxgcgh1kdxpdjzspz +two2rtcmvpbzsmfourchpqthree99 +fzteighteightlvnoneslhjmcrqrg8pzvszdxzbp +one49szrxcjvtt3eighteight +8nqbmcsthreeninexf7 +fvvzvpmsgrrnhjksf8l4 +7msxhtdk +jgtwonetwosixthreervlmxlnine869lbqzxpqqn +nvdn6bdg9ninesix +82rxtf +9tdqsdppseven7one +tlbbxvtwo8one671bhghlhdpfh +3onethhhlmgfhseven +n2six +53eight +one5five85 +three5375nine55 +fhvxvtjcnn3stcjhsdjtc1hhmk +six1jmgzrklbxrmzshpfgnv94hzfd +737six +25nine +fivevnpmlzvvp118lbv8xzplfttx8 +ninethreesevensevensix4three2 +xkgtqqlcdr51bgtx +sixpddqmbb5onehbmjfbpqx3threechgvdkghhjhnxl +7eight9sdcq1 +9ninejbcxzp +3two2sixone +seven8fiveonecrcqrglql141 +4nine3cllndctlninecrdxsevenbhbqsgtjnchkmknpdht +sevenzfbnvgfive3threesix +tvvjkskxgvfourxhccmmpxqx8mtxmfxmrcnine +ptnnhktxxn2qrjvmddszgcftlpdfvxcpkm +mboneight8lbjvvfzrl8qgqf +7twomjfhzl +sevendrdvmx2ninethree7seven2 +zoneight6eightnldnvhqpbd5 +29c +kzfkvqqs2ninesmlcrg573five +vxcgdz24ljhrhgsix6 +one3nine53xtr7seven +djdeightwoeightc2six6nine +eight2727seventhreeone +3gdtc7llsdlftdrx +581vjcbpmrzlp157jjcmlrzhr +7eightsix8fourgg69 +zsh38twocvklone +three6np +9tvxqtbpf77one7149 +7three3gqfpfqmhsfxqbqbnv +8rhflhmhtbm +217onethreelgfmpdscnine98 +three3stnst6xqqxvxzkfssevenbzktd7 +46ttbnzlfnsjbc +bsqxtvhgthree58four8seventhree +ccntwonedsjvftmftwoeightfourbxxt5eighteight3 +threeninembphrpfourone13hnjvn +bkm2onez6xxdjvnxvxjrtwoeight +jztoneight8gsmnjcfvk +six3fourninetwo62 +99dndgmkcctwoneftn +eight7pkzcxqhzfiveppvnineksjfhhqgm4 +2ngrttwozgdsrdsfq5ftgsq +fourdnmxjn5997eightkxkkpseven +rxnrnqvm98zjxxmkflone +three1dkmtwoone +6tttkrtnhgfzx8five4shlcvhr +nffggbxmhkpcppm8kjhktmdvlkkmrffdng254 +mbjm445 +6nfqxlhklrmfour7 +twosixsqtsfcleight8onefdsjxvbgt +9bkkrznine +fivedzpnp1 +cctxzzjbhgttmszdph1sixqseven2 +1qnfxpzfg2feight +5gdj3shgqvjdsix23gqp +xdgxsrshddmzmhkhznsdthree4one +gmtsixsixninexxsxone7three2 +1rttbtsccr +threeseven1fdzqvmbnsfive6 +nxqxvhsix41385none +sxgmkrzmbvn4sixfive5five6six +three6threepdjsseven3kgxtwo +8grzmhsmkthree +seven1htzbglcdfbcg +5nsjsnrscz1zhrvjmtg5onefive6 +two4one +dzl41four3threehbbqnkhn +onebsm86 +xh2 +eightqmdbfiveqv21sevenseven +5onefour3twolrtmmonetwo +32seven +vpcncrhjxgcs3sevenninenine5two +mponeight9glbvgrff +zgzzzpfffneighttdcplkbfr57 +7nineninemfneight +3ddrsxrmbzsmxkdfive8 +pnxtxmfrpmtwo3 +onerktgpv55 +79twosixhnnrqklz98 +5915vnrpsj +rfg7szlxneight +ninejhnzpnhkrlqceightfive5 +tzcgzzx6two3qfk5dffgnp +ceightwothreerqnfl5fourdfbrthreedntdchgnine +sixnfmdk3sixthreekgvmrzseven1 +mcdbsqnrzconetwo1dthreeeightjfjdblk +48threejtdnq +threerxnrgzd9 +vmzgfplpveightfnctwo4pptlb +ninesixqtbqgjvqv1three8 +cfnlshzvczgvm1onefive +gsskzxkgrbzx5pggzmsfhtwotrsvmttzdc8three1 +3sevenfrc7vzg +dcmxmg7d2jlbtfhkr8 +62nzzeight9txrzlm +9pjllhmfgkvssixsixthreeqmzthree +ctjksjbbdn28 +39fivefive5cnqjtr9vpvsix +jlbjfouronent7mlpqpcvqcmhfhvqjqcmtwo +2kpvxg6nine +seven4mlsbhzcmjfthree8 +1khfjhp3fourrh +ninesixpfrjvfm8kkjsrhttxsslhtwoeightwovvg +four2nine +fourlgcbfptfz45nineeight5eightkqtbt +5sixxqggppnl7 +51zvfive1v +fiveoneqqk5seven7four3five +kqlkrntrcfrhtwo9scczeight8dbqmfhstnzq +ghdjlnzmskmvjeightnzmpbjgone61 +three8jrhhmfnfive3four48eight +nine87ninekfzh8 +329nine +jgtwo3xvlkbvhrss27vltrghkljq1rkzkls +vrcfourtwoqlgcrxf274 +sxzkxpvnhsixsevensixtgptbrpnfthhnj15 +5rqqntzlq1one +1pnine762fhone +ttghtthree5eightbqm4two8 +2pmtldtwo6onedtsklbcbjhone +fourseventhtdcsmc5 +xqp75five99g4 +mrjpmm4crgk212seven3 +qjpdjb1 +two44sevenqtcdhxjp35xxx +sevenvtd7ttvmsninergrgdxbdqcthree +pgkqpltdzcthreemzrsrqjfourcrghhsfsjcqtmvxq4 +threeonexfrdvr1nblctsevendqmmzdr2 +8three2six8 +59twozjfour2 +qgtjgmrvfcffour29four5six2 +zzhnine3nineknzkvmbxvm54fivelrrgc +fonesix3three +seven6fivetlhhonetdzrkhjzqzseven +1ldxvjseven9eight5 +seven2bcbktzsjpp +2kxqxflk55two7cflfdfvsx5six +5lvhclqxtf +one768two +vfh8 +nineseven3xpc2jkvmgkqc6two +vvcvzfb947twortlnl96 +seven58nine4nine8tbtjqfpgp +7onefive4lbhslhdpsbtwo3vm +foursixsix3971fiveeight +nrqxrffqbp15 +mklsgg3oneseven6eight4bnbfxf +9five5klpzgrccnxvd96three +sgbqgrlqreight8 +jlvrfrskmlrdtdpr4foureight1xccgtcf +five5threek4hsmqjq +five6pxqlplmtvcvjgtbk +3sevenninefourone +nbrthreeone9gxeightlrkfvgtzhtwoqvnfb +teightwo972hrdrlgn5mpbjrxprpkjxgdkghgrgbthree +7nzgktdsvkjlqdlonergplcdqvv +kzxttx3fivesevenjdlqz9eight +9slfgkbdmq24nh595two +tkbnjhjrfivekqqxsjleight1 +seven23kh2tggrone +12four1xcvkxbcv1four5zs +j7ml +8eightone58dnxhddzstmfleight +mtd37fiveeight3fxcbcd7 +2fiveeight +zkmvsnsgnine321mtbzzg +4tgzhmf9 +threexjqtqzgzj4kvdtbpjv +twohmnpsqbdcrbl35three4seven +2twolpmdnxmcps8fourttfrhzzx +onegqsqrhx2twoeightcxmnxvzsfivethree +2eightseven92sixcjmkzjsl +9gncpkg +six51eightfourkmqbrrkkrjzmhgsevenfour +9bhxxzseventhreesglvvpjmc83eight9eightwomd +164cndtzcrdrxfzgnvqkvd1threefive +43sjlrhsrthqtwoqrxkqsixsix +twohfbqjxmc3four161three +4ngvsmdvm +xmhkgqdnfbdxcxm9 +lqgxmshjzgggj9jsqnv96one +vt2znbmqonesix1gjppfmsevenone +nvdjzzlspjthree8eight +qzvtwone1one3fivek +eightlfztsninepxfstsxtthreefourthree7 +k6 +zmeight2 +3cblxxxthreethree232 +two6sixcsgnzqbttjdzqs39oneightdr +bnjzfkmfh8ndfssix2pff8nctdvdqk +spxskgfmtgghlmklqzz6tdgxnbnnxfmgnfiveseven +cqrlmd62gsh +6rmrzkv4 +nineone6dbtzrtsp8sixzrhjhkrhvsxktbdkjcrone +5pvhbxqdvvqhlthreejqvs2 +lmeightwothreesjrsqgsv9 +seven8two92eight +five9sixeightonevzqtzq8tcgpbgthzvlcld +51ptkkdnzhgp +7jkrtwofourfour +xpzvfcdv1jvbd5mgvchdbnd9chlvqkc5 +27threectsxpfd12eight +prqbfh3foursevencgmhkmkd12 +one5seven8threegqcznrrxfheightfvkjkssbch6 +1vgsixeight3sztxzjkgldmqqbrm3 +jjcpponejtxkmnmggtfive3 +sixlsqgmqkjjzrpqj3dgsrpdzj3mjkdqhpq +slxstvfive7nfst +6fiventqxzhxkfivekcdbhrkx +sevenjqmfmbjfoursixcx7threexspc +kgqjjxfkmhqtf22htnvmpgxsztbb5 +nineqzgzsscrrfngnzksfour1 +9threerq4rhnbmhhsoneseven9 +6eighteightmjbthree5eight +threexhzqqs2kjdqvjr4 +z3ktworvbgbqzbpt +2onefive6 +c69492 +eightsixnine8tpjcxmpln +mxxfpjsplj3msxqdnnbcbbqxfzs5ninecmjpzq7 +cnineninesixfive3seventwo +six18eight3eightfourthreeone +6zdtsqkplv41jmrk7qkgjpkqgmmqsttvrhkzone +7threenvbjsvbshmd4sxffiveqvvctwo +two2two7lpmsjl4 +sixceighteight71psffhzjdjrm +seventhree2eight +qpmpfdlr7 +dxtzmkcrsix5 +65oneptbzdxcsqseven72five +7bdmgtzdmtwotwoseven8one +14sixckthree1n2 +twotwo5hpqhmnnjbsix35 +one5twothreeeightglqdbjlgkseven +one4twokzbdzv +8mcv71six58kkxdqx +bgbvdrfsixfqqvnlptzrqkhgmt8 +37oneightrmm +3onefbtvqchjthreebhxpvlqcdqh +gjcninercqpvvzdfkcdcfv2 +13fourbgntvtnxmr +8447zdxvzfkft +1foursix +threefivetwoseven4eighttsxflbcqtnfourthree +tseven1twolzjkfdttfklsdzrrflnfxfgvlq63 +four9fone9twobhppd +nzcvxgjqrsfqgkktggdlnine5 +57thz +3threeseven25 +zsbc6fivecqvlhtwolqone +nnsoneightdnine6rhckhj23fjj4 +cj1rbxlggxxgtxxbmtgfg6two +vhkgpz4 +nrmskeightone9six2clhcjkcl9jk +onejvdcrf96hbv +seven8three55 +1sixtwo79 +jcqknvjppbxsphlxrrcbzmkqnine29 +2fourvgzhnq +2six93rdrkfjkqlllx6nine +77onevkvqhvptbn +32szxlxdc5zlrtjdqpt5 +nine75hzkzvdseventhreelxt1six +vdbgshtjm8grgllht4qhpkhdfour +mrvdgqvseight3jtzfdspdtrkf +kcg2twoonelcpxlg +2xlcjcxzczt +1pszcvn12sxmcbdxznpeightxvdjjbgrjlpdv +fourbsbkvnineonesixthree8 +945five5one +nine71gzq79 +3threeeighteightldqcgtbd +two671four2r +bbfpvdsvffour5two +767l97hm +twofour5 +xxrs931ckbg34g +qhnht4 +nine723nine9 +93preight5f6seven +one8qncpgpl +fiveeightsix8jr2 +twocdv9lrtsbcdtvz62pkzm +dmhfljxqxeightxmbprh2 +rr5 +5twotwo +three8two5 +4rjqmbdtxv42twoeightseven5 +fourb349six +f31nineninetxtdtfivehc7 +1one3 +2eightxztclpbvkp +bkxvnhhn6nine211 +1twoseven3xmzg +lnzpnine54eightwoqpr +gnhdcgdmvthree9nine +vlxjmdc1fivesix +nineonefour69 +ktdkztzmmcgxslggh7dhptrkgfbqnine3two4 +qfczhgjnt6 +3fourrzmt +onethree2four3nztsmbqmtldgonenlc +29six9xlffbvfntz85 +five6trqbjkhjfmrlgpcxseven +threegz9chglg6 +9tq +1onefive8two84ngrh +hrqhreightfive1lp +onethree4 +two8psmqcbsixsix +sixseven3xxczmccll +fourmmlcgbkhktbmrp5three +27sztxgmqdvnfivelfcpzjsx7one +hdbhrqhhffbgjxvdpqk6sevenbn +93ninezmtrgjqbsp74 +gsljpvzxkq9 +zbjzzrnkbeightseven1four +fourfivetwothree2rh5 +155cqrh1 +1tjdeight +dvnlk78cbvdrccmmx3seven +8seveneightsix +ffjlhcgxp97plmttszkvj7jvtsgsevenznl +121four +threetkqnxtwobvbmzj4ppkdxqtblszmxqhqbv +5sevenxgcgqnlpkpnfmcnkbfbeighttwosevenhpht +gkgnfiveninelr5eight +six4nine73szmldmdd +9jfgcslbrcz +jrgrnmntmtwonptz8eightninesix6 +238eight1xtjdgb +2one66fourndjcxmmbhfcq1 +5bmfntsevensix +5832663v +7sixdzmhfrjonebdqlqh8threeonenine +92six +vqpg91hspvdgtwol +fivembzffnlcktwo18four7 +six99nbzrgd8 +onexqflrlvdmrsix9nbl1szkf +vqmlzjc1d3 +three7two4vbgzthree +twoninejbbxhdfnbqjddj26one2 +5nine296ninefourone +onevznthreedbtjtgxhh36sevenfour +zfkffkjsz7btqgtm1lqvsix74frjhrkbjj +sltlgnine6fiveninegglpc8ninenine +two7three +fourbrmdvfbtnnnhr1mnhbztwo98 +nine6slnine +cqkfp35hzrdlcpcsjhssdlnjv +six42seven32five +zkhjblqjlsfive9kbxzhjmnzrxbrrj6sevenjdvljbh +9ldrjmjpqeight4pnmcfvg3b +lone8 +two1sixfourgskrlfkxxdhbjspmhg +4hgceight2one52jmbmjkjb +six8zfbjxfckfivesixzrpn3 +vbrbvv6 +jfjkvxcrbjhztvtmjbp15two6one +3xvhtzgqpn4td +xthree44 +68973one7rmx5 +ptbndknk26two8cv7seven +57417four +ngeightwopgdtlxjgs3threefivefivesk92zgcmch +pmfjgxpg6ninefoursix +5hlgzgrxhxxqt8 +1nine3 +gvdhxthjxnxv7dtzninenine4 +jrtwonehzddmgcjsn6rzldcsfpqs8eight6six +5fourfive +jn6 +two2four +567ninefive5fivefourdrbh +36sevensixkbphcrstnine +76svmjhhkrt73 +thgzhsclsptfqfzpsnine4cxxpv +two1one8fninefdctxpmtk7 +seventpxmbxcl9 +cghxxdnnf7vmvqdfhhxznine6dgt +soneightsix7 +7ft3threeqdhxjmkgd6vgfmb +1threesix5lzjzrm +fiveonedknfvkphltcxnsvxpvxlxldxrqftcmqvvqx6 +sone1tnmqklzvbbctjvntddpm3 +nine9vb +eight52threeqnhhvn +87fhkjhseight485 +1onesixzczvlsmhbfour7 +3ztseven +7tjjbq2three +sevenv1eight9cpvmrn8oneightnxs +1threehlhxjj2eight +six87twofour3646 +eightzlmj2zreightbflxtmdbv +one2eightznone +seven2eightvlxkqnpjb7dlqrmnhtfive1seven +43eight3 +fivesixfiveeightsxrvgmpshvone7 +7dpmrqeightone1rdfdrx +dtmtpgjll136dbcjlrhzrdnm7svlrdrcngpnine +5dl9 +94ctwo4four +7ninegnssldmnmqc +nine1sevenzdvkpxxsfccmb +none5five1rsrsxpxnlt1lxtf +sixpl9nhgm +51brpphslhjtwo2stjrkphcgrfive +fivetdhlrcbtwozdsfgcdnhv67fivesdjlqnine +4fourfour7sevenfourfivenjdxvf +674one46 +6ninentdksjfkdvhkkxzrgftnbjmfsjgzd +4ninerpvfmfonetcnhk +1ksbmzccfreight5 +3vqr +ninegqbgveight7hggnxxgrq3 +sixfourfourseven1rfivekcflqd4 +mzvqrlp1sixnine +sevennine3gqjmqrq +6vhp8one251eight +5dnsxqrb3twokdzdbdcncm +srcmzlkrone9ninegbfnfmxjf +82lmhlhmtgfour6nbljxrgjb3ninesixtwoneqhc +6pctdhrmhrgsbm +sevenhgpfqvkh5three51jdkqz84 +hfzlmldpn9tjtlpb +phccmtthonesix6 +3fourbrzqzsbnthone +11pssjfqkfivebmprltbvm4 +gmtc2five +one2lj4fivetwo +ninexjrzfonehvntsmnzx2 +fourg746jpxvrbzdmseven +six76436 +89gddfltmdkkmleightqbzppmklxzgpnlg +sevenmtfmdrbcl9 +3cpgvjgzxsixnine5hvrxbdnclfgbvfsix5twonelv +eightklzkzxltzone5 +377bqrbsdk1eightthree6 +2sevenlfqhmfour +21oneonevg9rr +onenzjgjxlmtrgbt84onenlls +7rlgkgrsixfive +nmmpl6fc7ccg8lkvpvqplztwo +mzbxkmfcd89six +fbhzskjt4seven3jrvfjhqsbcone3 +five3sevensix +eightsix6 +n9 +threeninemzpjqpcpvnine424ninesix +8ninesfour7 +twopbsbvdpnine6fourfive7qbbckmhxgg2 +5ksvzfbdbgvnqonehsgtvgkbgjkzggsmpvkxpxtft +qeightwo2three68nine39lr +5gpz6283five +19fourjctnldrqlghx +gtwonetbqxnvxlz2three +jdvmph5fgztldhtwoxhzk +fourgmhflfpxmbqpt8jdxkntnchmtkgqhsgthree +527five +5sixfour +mdchltjjqmfive7 +kn6glgjlspeightfivej +3vsblvhkmt7 +17rmnoneqqgqmcvlseventwotwofive +eightjbmnzngtxsix3two +fourgdczfkvs3onekrcm +2prvszkhlnine +nine67mqtxbthtfxgtwof +lrcrninevgshzsrmj9threethree6 +bslrhlvpthree49fmlzb +3nzqmndm7hxzrlsxgmt +48jtjrmzvtct +pzpthxqxs9pjkhxc6gk5 +eightbdvrcsg2tgjkzzj +2oneeightonemlgpgtdg +8sevenrxksglxdfour3lhst +four88sevennine1 +fiveqszbfmdv8xfiveeight +sqqbhtk3nine5mqzkzbzlxlhdtwo +8eightone +63njcjnbhptone75fqhg +fourthreefivesix9pvfivehmbhmhtrplseven +5fourbfnzxfivenine8four +rzhqrxfhpf9seven69kcjhxv +nlh3fourfourlbppcjdx37 +hntmdckqhonejmcfphrrthreesix3two6 +eight7sevenonefourfour +nkhfgtknbjsixzrpppnqsone15threesixfive +nine5xlvfqmfourfive3 +sscctsdfourkppsrd6eight4 +eight92 +1oneightfs +2hmgrqgjznhh1xztfmthreev +jvpzlqbsrb3 +pszdpm3 +kccl2 +dzxmqpgfive6338seven +9nqfpv +prphfourninesix5six +57vbcbcvtbgtqmktjscjbzfkjgzzv7rspqlrdfsmbsvbmb +qxqlzmeightfourhzvctqsxczg4qggztsnrzz +79seven8rzgzhksz97tbrftfllmpone +twovdspsvmftgnfjdqgjpv92qdqzcgr2 +6ninesevenninecxzmvlczjf1eight +186 +fourtwo324five5eightv +six95five1tnpsqkr4twocgnbrtr +threesix2ksh +dpbbkpxvd457sixbncfnkbleight3 +bxrbglhfcz2five +8three3fivethreeqjg54nine +nineonepvhrzcdm9lbqqgrdmggzkqzvhnbczrhhvjz +3rgljppmcftqmqkqbl +9threeqjrjrgseven +4qtfn +five7fourfourhbspnlmgsmxnxt5 +fffctbhcpklfndj23twotwo39 +62sevenxnxthreefive6two +5772six9five +seven599rpztwo +onefiveonemsftxtqdcsix7jngtvr +12fttpqzzlk +zcndrqjsfourthreethree11seven +nineone8 +tdlbrszns4pdlptfvcnxqhx +5six2nine8hvktskx +5xvcnbsix9vnclxm +94ptv6mzgninesk96 +4lfvvczdgvh8rzgkmvnk +74nsvkm5nztmctpmngppzkphltpx +46two9four67nine +oneonefive5fchd3nksmgs +6vnstxdtlninezgdvpmjjcxlqvc +6five3 +7four76rklqgljhdzzhdcqrqzpxmfftbcfiveoneightjzg +43eight43955four +gsrrtkpqpseven1fourbfninereight +6rvdtwotwo4eighteight5 +foureight9 +468cgbctpkqninetsxskqbhmj +7twonine4 +8jnssjzcgpzrvbqzmv5three3jmhfjcbtwo +4qjrgrntbfzghfkzxvmj53pcrjrlls +twonnjv8 +97three9zgkhgmrcfour +9eight23 +qtsgznprvthreethree6 +63tworhdlrfstgxfmjjknfourqfvfjjz +sevenltdcgs8three +bjctzmmbhrqlfzqgxbcdgdgprv9twogjmrdclzt +63lslhrbmcznine6 +66gc8seventwo +zdrpnjjtwo62ph6 +ninerdxqgxtqrrgx3gz3three5lfc +lflcrscclg35oneeightpmhhm1bkftvxqbmx1 +74rgb +six8ninelvxdqphkd6 +5zsbfjsixseven1 +4rflxzvnn +mjbpr4qjjhvbgn +26four6drctrdmz +6mrzflsszvq +fcjbdqdnh1stglpmc6nmvggcvnrghcpcnz +one2four48fourcgkvvnlzlb +kc2461two +fivethree54dbvxmf +849psvj9six +hnxg5rbhbqzzeight4 +zzsix45glphncrrq5two4nqrdsk +seventhree5qpfour7nnbllpkgveight +bsh78mzxzhhseven8 +jllhfive7sevenninebcmninet +nineseven4pdkfpdzqpbzgt +sevenninetbthree5skjmeightfpjrq +nxkv6 +four59 +zrhcvb6qlctpeightbnphxmlk1cjzdbl +8mtgqjthreenine32 +6slj8zqbpqmr5 +rqkvxmqtkn8oneckdxtqvxcthreehngfdqqsseven +nine4nfqpgdpvx9fivethreefourfnhfjmfzqr +3gdxbh2gbm6 +72qmrrqbsflqpspdp9ff8two +xgbphtnjfrg5fourdfmsmqhfp597 +bkkpgrhj8hlbsqmjdjqxjtjkrgppjgszpmm +five71 +9rmmf1hqqsmdrrfour +7ninelflmvj6seventhree +172 +tfhqv1 +jfbtwoneninenine6dgxnqjgsteighttwo +4dnvfvx +37sj6three48nfjtclz +2two4fsbbmrtnlqljqdskqseven +1pnpzdr3sevenfive +fourrbktzvtslxjdz9 +47six +jgcrllvbsvnrnmqfppxjfournbmjgp36nineb3 +s6fgr4four4 +cmpvp8three7 +xjqmgdrvtlv5xmcpnkhvfhrbjzx +117eight +9snnxnrccnonepdbfhhqcnpsevendsffjsvknpvmkdxp +rgsix6rqzsix8nine +nine8two +2clfqtxkztwo4twobjscfzptgn +6s5dnfkpxts5five +five9cst +eight71dmbdqfgtpvj3 +vdf3fjfsczlvvnine3foureightfivennhqmcdbdb +two59eight9 +eightdkfmscfmzrk7ninespg9 +sixseven46seven +493djtvlhsixnhnts1sss +ninepczttwothreemtz3three +fivezlfjhqnknnhdfour8eightninetwo +4ngvsvfivemgthtlcczfbjq1ngxvsbmt9 +sixcgkmnd2 +12 +nkgbpqfvvb9threesixqgqvjgzdxm1rc +five7seven +2seven8151 +86eightfivethreebgbfvr4 +355 +hgldv8four2dzmtpdsmck4five +ninemb7gtqzrpbt31fourndtsjkhv +3fivefourghlmgfhninesbtcsqone32 +7krkptwo4qmzhvpsixthree +74ppbsmnpfthreefivefive +9four5zdkprcnbtl6 +four3seveneightbrmdbcxxrk +twothreerdvxmqsbtgtszmxr4eight9jzbxpfstc +73prc73six6three1 +9fivesix5fivepsg +two98two98 +oneseventhreethree4qvjtzksdsz +tnbsgjqdkl22 +rmlbp4seven45 +9dpzqbds2pffivefqrchvhpvjbtnl +79hdzstwofoureight5bjs +t2 +4pstpbdkxblnmv9nzfzsttfgfivefiverrtlmgj +zkkhkggtthree3eightseven +d11fourzfcnmzbxgbpf +66six53klhrdnbtp85 +onenineonelsfhzbkjgsfivedhzlfcvh8 +jdt4four +bgfzvxthreeonebhlqjbprf1 +sevenfourktsxkbbgt5 +mmqffp1 +vqghrsgxpsssix2jxzvdjdconeznlgpxbqdlsncrsix +5bnzrdptseven8nine +zqdklqmjjc2rl8jxtmsixxftvspzlhfive +vmn9 +7mhhcftwofour21sixvvhlmspeight +blvhpfour354sevendrllsfivexmt +six5fivetxrvnvftfvgcddshzktwo83 +3mdcpcj +zdtjmglv8rkgpfvninethreetfgmx6sksteight +48five8mnstwoone7nv +cbpvqbddlllczgfmninenine3zqvptoneightx +1two2 +jxfhzr35threesixlxghqbqtq +nftv7sevenninetwo2seventwonnkbvqnjjx +eightgjeight6f4 +2fivessrktznhjvxmghnlhbmfseven2two +onedhvdg82xdvgmhxzbqrpzlnfx4 +17nzhkkpchk9 +dzccfzphmz6sevensixeightmcvxsthree +onettfmvfhgsix1two +eightone37 +2onepdnbrbxk4foursevenzrmzmvqzgstppr +five536seventhj96 +nlhqljfzmb4khqtjh +j8l +2kpmrhmhonefour +2jblsixkbblgzbfprhbjnrtspcqs +6twothree +two19eight9 +fivexbrjpnhhlvdztthree9 +jzlmvxjn9oneoneone +2cnqphtdjgdnhbkseven2fiveninefive +threetwonine67tqpbdfhfbv +smgr56slfpdmfive6ninehmqrck +fqqnjqpccjqt6six75lpfczmnine +bq2mdxchhmbxfzzkqgsixrbcpklpqnxsvnbthree +eightthreefxxssg8cx +lhlc6 +nine6onexmvlbtbxznmrztnv +8fivedlxzgxxflbltteighttwochtxlfjx +seveneightfour1three4gbcnnk +8fivejtxbpvmpxoneninesixzdrjhtncbnkgpsxqs6 +1hxsxn84eight +sevenseven71phgltmtxq4 +8fivepcqthree3dn +f6bbrdqflknp +fiverpjbb9rjbrfrlrnine +zfqpjjktg5seveneightfiveltvvtxdfk +flhnczsbx6 +tsqlvphjmfourrcqsjj7four9six2rnz +fivedmznjqtwoqmone1 +eightfllck3spsfrgz92gmcgkgg +tcrrrztsevensixqthpdqgxv91vvhbsqgzkq +22pztfnhh554qdvzjxnnzzrj +tscrkt4 +fzmsgmzbz5 +rxzsnjhcnkthree8eight +9fourdhjpp2648 +4chvdrvtgqgbzhcxztwosixsixhnqknqmntzlltqncdxddnjlk +xbfk2cr +hrmbslbdgnine8nineeightseven8one3 +kmkdhbonesix79rbshvkkvjnzzq4 +9jrz26 +seven163nine +83sixgvhjttnhkq9frphcqrng +8five3seven +three16xqdzlkqjjtf +5fiveeightl8veight1pxfptklnhj +npllktfive45nhvqjcjgpxx +hbfr9mm +onerbfkf4threeone +7eightone +eight2kmjlsix8one61 +rvrnrdrninenine3zq6jqsr +lztlntnsevenpplkhkftq1 +tfrrjmcvtbmktnxtxkkrcctmc33four5gfqpcjreight +33rgcjxfsfqsvxxbxcnrjfndrrfmrtk +3627837xhhb8 +bmjhkkn4pgf +qkrsvjclp23 +5fourzllbmcgkxsevengkrzkpvcmvgtxlrv6 +fivetczxxvjrrqfive1sevennvj6one3 diff --git a/004AoC/main.c b/004AoC/main.c new file mode 100644 index 0000000..0ef6aa7 --- /dev/null +++ b/004AoC/main.c @@ -0,0 +1,72 @@ +#include +#include +#include + +unsigned int getSum(FILE *file); +char getFirstDigit(const char *line, size_t len); +char getLastDigit(const char *line, size_t len); + +int main(int argc, char *argv[]) { + + if (argc != 2) { + printf("error: missing file input\n"); + return 1; + } + + FILE *file = fopen(argv[1], "r"); + if (file == NULL) { + printf("could not open file: %s\n", argv[1]); + return 1; + } + + unsigned int sum = getSum(file); + printf("%d\n", sum); + + fclose(file); + + return 0; +} + +unsigned int getSum(FILE *file) { + + unsigned int sum = 0; + size_t len = 0; + size_t read; + char *line = NULL; + + while ((read = getline(&line, &len, file)) != -1) { + printf("%s", line); + char first = getFirstDigit(line, read); + char last = getLastDigit(line, read); + printf("%c%c\n", first, last); + char digits[3] = {first, last, '\0'}; + sum += atoi(digits); + } + + free(line); + return sum; +} + +char getFirstDigit(const char *line, size_t len) { + + char digit; + for (int i = 0; i < len; i++) { + if (isdigit(line[i])) { + digit = (char)line[i]; + break; + } + } + return digit; +} + +char getLastDigit(const char *line, size_t len) { + + char digit; + for (int i = len - 1; i >= 0; i--) { + if (isdigit(line[i])) { + digit = (char)line[i]; + break; + } + } + return digit; +} diff --git a/004AoC/test.txt b/004AoC/test.txt new file mode 100644 index 0000000..7bbc69a --- /dev/null +++ b/004AoC/test.txt @@ -0,0 +1,4 @@ +1abc2 +pqr3stu8vwx +a1b2c3d4e5f +treb7uchet diff --git a/005Timer/timer.c b/005Timer/timer.c new file mode 100644 index 0000000..1206e71 --- /dev/null +++ b/005Timer/timer.c @@ -0,0 +1,73 @@ +#include +#include +#include + +struct time { + unsigned int hours, minutes, seconds; +}; + +unsigned int timeToSeconds(struct time); +struct time secondsToTime(unsigned int); +void displayTime(unsigned int); + +int main(int argc, char *argv[]) { + + struct time t; + t.seconds = 0; + t.minutes = 0; + t.hours = 0; + char c; + + if (argc == 1) { + printf("No time passed--using default: 1 min\n"); + t.minutes = 1; + } else { + while ((c = getopt(argc, argv, "h:m:s:")) != -1) { + switch (c) { + case 'h': + t.hours = atoi(optarg); + break; + case 'm': + t.minutes = atoi(optarg); + break; + case 's': + t.seconds = atoi(optarg); + break; + } + } + } + + unsigned int seconds = timeToSeconds(t); + while (seconds > 0) { + + displayTime(seconds); + sleep(1); + seconds -= 1; + } + + return 0; +} + +unsigned int timeToSeconds(struct time t) { + unsigned int seconds = 0; + + seconds = t.seconds; + seconds += t.minutes * 60; + seconds += t.hours * 60 * 60; + return seconds; +} +struct time secondsToTime(unsigned int seconds) { + struct time t; + + t.hours = seconds / 3600; + t.minutes = (seconds - (3600 * t.hours)) / 60; + t.seconds = (seconds - (3600 * t.hours)) - (t.minutes * 60); + + return t; +} + +void displayTime(unsigned int seconds) { + system("clear"); + struct time t = secondsToTime(seconds); + printf("%02d:%02d:%02d\n", t.hours, t.minutes, t.seconds); +} diff --git a/006FindReplace/FindReplace/main.c b/006FindReplace/FindReplace/main.c new file mode 100644 index 0000000..12f02d0 --- /dev/null +++ b/006FindReplace/FindReplace/main.c @@ -0,0 +1,71 @@ +#include +#include + +void findreplace(char *str, const char *oldword, const char *newword); + +int main(int argc, char *argv[]) { + + // ./a.out filename oldWord newWord + if (argc != 4) { + printf("usage: %s filename oldword newword\n", argv[0]); + return 1; + } + + char *filename = argv[1]; + char *oldWord = argv[2]; + char *newWord = argv[3]; + + if (!strcmp(oldWord, newWord)) { + printf("error: words are the same\n"); + return 1; + } + + FILE *file = fopen(filename, "r"); + FILE *tmpf = fopen("tmp.txt", "w"); + if (!file || !tmpf) { + printf("could not open files\n"); + return 1; + } + + size_t size = 256; + char buf[size]; + // loop + while ((fgets(buf, size, file)) != NULL) { + //printf("%s", buf); + findreplace(buf, oldWord, newWord); + + fputs(buf, tmpf); + } + + fclose(file); + fclose(tmpf); + + remove(filename); + rename("tmp.txt", filename); + + + return 0; +} + + +void findreplace(char *str, const char *oldword, const char *newword) { + char *pos, tmp[256]; + int index = 0; + int oldLen = strlen(oldword); + while ((pos = strstr(str, oldword)) != NULL) { + strcpy(tmp, str); + index = pos - str; + str[index] = '\0'; + strcat(str, newword); + strcat(str, tmp + index + oldLen); + } +} + + + + + + + + + diff --git a/006FindReplace/FindReplace/test.txt b/006FindReplace/FindReplace/test.txt new file mode 100644 index 0000000..5825487 --- /dev/null +++ b/006FindReplace/FindReplace/test.txt @@ -0,0 +1,3 @@ +Hello Thing +This is a text file about the Thing +This is my world diff --git a/006FindReplace/main.c b/006FindReplace/main.c new file mode 100644 index 0000000..11b9926 --- /dev/null +++ b/006FindReplace/main.c @@ -0,0 +1,9 @@ +#include +#include + + +// + +int main(int argc, char *argv[]) { + return 0; +} diff --git a/007SQLiteIntro/a.out b/007SQLiteIntro/a.out new file mode 100755 index 0000000000000000000000000000000000000000..73ac3f31cd9e9acdcb8953b295fdb1b218340753 GIT binary patch literal 34888 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 NCx5%T_dx@#e*u`5)a?KO literal 0 HcmV?d00001 diff --git a/007SQLiteIntro/input.sql b/007SQLiteIntro/input.sql new file mode 100644 index 0000000..6246cb4 --- /dev/null +++ b/007SQLiteIntro/input.sql @@ -0,0 +1,9 @@ +create table Todos ( + Id integer PRIMARY KEY NOT NULL, + Title varchar(128) NOT NULL, + Completed integer NOT NULL +); + +insert into Todos values(NULL, 'code this app', 0); +insert into Todos values(NULL, 'finish this video', 0); + diff --git a/007SQLiteIntro/main.c b/007SQLiteIntro/main.c new file mode 100644 index 0000000..688eed4 --- /dev/null +++ b/007SQLiteIntro/main.c @@ -0,0 +1,241 @@ +#include +#include +#include +#include + +enum ERR { OK, ERROR }; + +sqlite3 *setupDB(); +enum ERR addTodo(sqlite3 *db); +enum ERR markComplete(sqlite3 *db); +enum ERR deleteTodo(sqlite3 *db); +enum ERR updateTodo(sqlite3 *db); +enum ERR listAll(sqlite3 *db); +int numberTodos(sqlite3 *db); +int completedTodos(sqlite3 *db); + +void menu(sqlite3 *db); + +int main(int argc, char **argv) { + + sqlite3 *db = setupDB(); + if (!db) { + return 1; + } + + menu(db); + + sqlite3_close(db); + + return 0; +} + +sqlite3 *setupDB() { + sqlite3 *db; + int rc = sqlite3_open("todo.db", &db); + + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database %s\n", sqlite3_errmsg(db)); + return NULL; + } + + return db; +} + +void menu(sqlite3 *db) { + + printf("------------------------\n"); + printf("T E R M I N A L T O D O\n\n"); + + char input; + int count, done; + while (1) { + if ((count = numberTodos(db)) == -1) + return; + if ((done = completedTodos(db)) == -1) + return; + printf("You currently have %d Todos.\n", count); + printf("You have completed %d Todos!\n\n", done); + + printf("What would you like todo?\n"); + printf("[A]dd, [L]ist, [C]omplete, [U]pdate, [R]emove, [Q]uit\n"); + printf("> "); + input = getchar(); + while (getchar() != '\n') + ; + printf("\n"); + + enum ERR err; + switch (input) { + case 'A': + case 'a': + if ((err = addTodo(db)) == ERROR) + return; + break; + case 'L': + case 'l': + if ((err = listAll(db)) == ERROR) + return; + break; + case 'C': + case 'c': + if ((err = markComplete(db)) == ERROR) + return; + break; + case 'R': + case 'r': + if ((err = deleteTodo(db)) == ERROR) + return; + break; + case 'U': + case 'u': + if ((err = updateTodo(db)) == ERROR) + return; + break; + case 'Q': + case 'q': + printf("Thanks for using the TERMINAL TODO\nGoodbye.\n"); + return; + } + } +} + +enum ERR addTodo(sqlite3 *db) { + char todo[128]; + char sql[256]; + printf("\tenter todo: "); + fgets(todo, sizeof(todo), stdin); + int loc = strcspn(todo, "\n"); + todo[loc] = '\0'; + + sprintf(sql, "insert into Todos(Id, Title, Completed) values(NULL, '%s', 0);", + todo); + char *errMsg = 0; + int rc = sqlite3_exec(db, sql, 0, 0, &errMsg); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not write to DB: %s\n", errMsg); + sqlite3_free(errMsg); + return ERROR; + } + return OK; +} + +enum ERR markComplete(sqlite3 *db) { + char sql[256], mark[4]; + char *errMsg = 0; + + printf("\tenter id to mark complete: "); + fgets(mark, sizeof(mark), stdin); + int id = atoi(mark); + sprintf(sql, "update Todos set Completed=1 where id=%d;", id); + + int rc = sqlite3_exec(db, sql, 0, 0, &errMsg); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not Complete TODO: %s\n", errMsg); + sqlite3_free(errMsg); + return ERROR; + } + return OK; +} + +enum ERR deleteTodo(sqlite3 *db) { + char sql[256], mark[4]; + char *errMsg; + + printf("\tenter id to delete: "); + fgets(mark, sizeof(mark), stdin); + int id = atoi(mark); + sprintf(sql, "delete from Todos where id=%d;", id); + + int rc = sqlite3_exec(db, sql, 0, 0, &errMsg); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not delete: %s\n", errMsg); + sqlite3_free(errMsg); + return ERROR; + } + + return OK; +} + +enum ERR updateTodo(sqlite3 *db) { + char sql[256], mark[4], todo[128]; + char *errMsg; + printf("\tenter id to edit: "); + fgets(mark, sizeof(mark), stdin); + int id = atoi(mark); + + printf("\tenter new title for Todo: "); + fgets(todo, sizeof(todo), stdin); + todo[strcspn(todo, "\n")] = '\0'; + + sprintf(sql, "update Todos set Title='%s' where Id=%d;", todo, id); + + int rc = sqlite3_exec(db, sql, 0, 0, &errMsg); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not update Todo: %s\n", errMsg); + sqlite3_free(errMsg); + return ERROR; + } + return OK; +} + +enum ERR listAll(sqlite3 *db) { + sqlite3_stmt *stmt; + const char *sql = "select * from Todos;"; + int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not read DB: %s\n", sqlite3_errmsg(db)); + return ERROR; + } + printf("%-5s%-25s%s\n", "Id", "Todo", "Completed"); + printf("------------------------------------------------\n"); + + while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + int id = sqlite3_column_int(stmt, 0); + char *todo = (char *)sqlite3_column_text(stmt, 1); + if (!todo) { + todo = "NULL"; + } + int completed = sqlite3_column_int(stmt, 2); + char *done = "done"; + if (!completed) { + done = "not"; + } + printf("%-5d%-25s%s\n", id, todo, done); + printf("------------------------------------------------\n"); + } + return OK; +} + +int numberTodos(sqlite3 *db) { + int count = 0; + sqlite3_stmt *stmt; + const char *sql = "select count(*) from Todos;"; + int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not get count from db: %s\n", sqlite3_errmsg(db)); + return -1; + } + while ((rc = sqlite3_step(stmt)) != SQLITE_DONE) { + count = sqlite3_column_int(stmt, 0); + } + return count; +} + +int completedTodos(sqlite3 *db) { + int count = 0; + sqlite3_stmt *stmt; + const char *sql = "select * from Todos where Completed=1;"; + int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + fprintf(stderr, "could not get number of complete todos: %s\n", + sqlite3_errmsg(db)); + return -1; + } + + while ((rc = sqlite3_step(stmt)) != SQLITE_DONE) { + count++; + } + + return count; +} diff --git a/008LinkedList/arrays.c b/008LinkedList/arrays.c new file mode 100644 index 0000000..80ca810 --- /dev/null +++ b/008LinkedList/arrays.c @@ -0,0 +1,20 @@ +#include + +void arrayInfo(int *array, int len); + +int main(int argc, char *argv[]) { + + int arr[] = {0, 1, 1, 2, 3, 5, 8, 13}; + + arrayInfo(arr, 8); + + return 0; +} + +void arrayInfo(int *array, int len) { + + for (int i = 0; i < len; i++) { + // printf("array[%d] is %d\n", i, *(array + i)); + printf("addr %p: %d\n", &(*(array + i)), array[i]); + } +} diff --git a/008LinkedList/linkedList.c b/008LinkedList/linkedList.c new file mode 100644 index 0000000..7ef49d5 --- /dev/null +++ b/008LinkedList/linkedList.c @@ -0,0 +1,130 @@ +#include +#include + +struct Node { + int data; + struct Node *next; +}; + +void append(struct Node *head, int data); +void printList(struct Node *head); +void insertAfter(struct Node *head, int key, int data); +void deleteLast(struct Node *head); +void deleteNode(struct Node *head, int key); + +int main(int argc, char *argv[]) { + + struct Node *head = (struct Node *)malloc(sizeof(struct Node)); + printList(head); + + append(head, 1); + append(head, 1); + append(head, 2); + append(head, 3); + append(head, 5); + append(head, 8); + insertAfter(head, 3, 6); + printList(head); + deleteLast(head); + printList(head); + deleteNode(head, 2); + printList(head); + deleteNode(head, 9); + + return 0; +} + +void append(struct Node *head, int data) { + + struct Node *newNode, *prev, *current = head; + newNode = (struct Node *)malloc(sizeof(struct Node)); + newNode->data = data; + + while (current) { + prev = current; + current = current->next; + } + + prev->next = newNode; + newNode->next = current; +} + +void printList(struct Node *head) { + struct Node *current = head->next; + + if (!current) { + printf("error: nothing to print, list is empty\n"); + return; + } + + printf("head->"); + while (current) { + printf("%i->", current->data); + current = current->next; + } + printf("END\n"); +} + +void insertAfter(struct Node *head, int key, int data) { + + struct Node *current = head; + + while (current) { + if (current->data == key) + break; + + current = current->next; + } + + if (!current) { + printf("error: could not insertAfter. current is NULL\n"); + return; + } + + struct Node *newNode = (struct Node *)malloc(sizeof(struct Node)); + newNode->data = data; + + newNode->next = current->next; + current->next = newNode; +} + +void deleteLast(struct Node *head) { + if (!head->next) { + printf("error: list is empty nothing to delete\n"); + return; + } + + struct Node *prev = NULL, *current = head; + + while (current->next) { + prev = current; + current = current->next; + } + + prev->next = NULL; + free(current); +} + +void deleteNode(struct Node *head, int key) { + + int found = 0; + + struct Node *prev = NULL, *current = head; + while (current->next) { + if (current->data == key) { + found = 1; + break; + } + prev = current; + current = current->next; + } + + // check + if (!found) { + printf("error: node %i not in list, nothing to delete\n", key); + return; + } + // + prev->next = current->next; + free(current); +} diff --git a/009TipsTricks/main.c b/009TipsTricks/main.c new file mode 100644 index 0000000..2455713 --- /dev/null +++ b/009TipsTricks/main.c @@ -0,0 +1,44 @@ +#include +#include + +#define size_of(arr) (sizeof(arr) / sizeof(*arr)) + +#define DEBUG(x, args...) \ + fprintf(stderr, "ERROR: %s:%u\n" x, __FILE__, __LINE__, ##args) + +void cleanup1() { printf("cleanup1\n"); } +void cleanup2() { printf("cleanup2\n"); } +void cleanup3() { printf("cleanup3\n"); } + +int main(int argc, char *argv[]) { + atexit(cleanup1); + int i = 10; + // while (i --> 0) { + // printf("%d\n", i); + // } + while ((i--) > 0) { + printf("%d\n", i); + } + + int array[200]; + printf("array[200] len: %ld\n", size_of(array)); + DEBUG("Our array should be 200! %ld\n", size_of(array)); + atexit(cleanup2); + + int num = 11; + //(num & 1) ? printf("odd\n") : printf("even\n"); + char *res = (num & 1) ? "odd" : "even"; + printf("%s\n", res); + // if (num & 1) { + // printf("odd\n"); + // } else { + // printf("even\n"); + // } + + atexit(cleanup3); + int x = 5; + printf("%d >> 1 = %d\n", x, x >> 1); + printf("%d << 1 = %d\n", x, x << 1); + + return 0; +} diff --git a/010WeatherAPI/main.c b/010WeatherAPI/main.c new file mode 100644 index 0000000..eafc07e --- /dev/null +++ b/010WeatherAPI/main.c @@ -0,0 +1,78 @@ +#include "APIKey.h" +#include "cJSON/cJSON.h" +#include "request.h" +#include +#include + +void parseWeather(const char *data); + +int main(int argc, char *argv[]) { + request req; + response res; + + simpleHttpInit(&req); + char url[256] = "https://api.openweathermap.org/data/2.5/" + "weather?lat=51.52&lon=-0.10&units=imperial&appid="; + strcat(url, API_KEY); + + // req.url = "https://catfact.ninja/fact"; + req.url = url; + error err = simpleHttpRequest(&req, &res, JSON, GET); + if (err != NO_ERROR) { + printf("error: %s\n", simpleHttpErrorString(err)); + return 1; + } + + if (res.code != 200) { + printf("response code %ld\n", res.code); + printf("response body:\n%s\n", res.body); + return 1; + } + parseWeather(res.body); + + simpleHttpClose(&req, &res); + return 0; +} + +void parseWeather(const char *data) { + cJSON *json = cJSON_Parse(data); + + if (!json) { + const char *err = cJSON_GetErrorPtr(); + if (err) { + printf("%s\n", err); + } else { + printf("error parsing JSON\n"); + } + return; + } + + const cJSON *weatherArray = NULL; + const cJSON *weather = NULL; + const cJSON *main = NULL; + const cJSON *temp = NULL; + + weatherArray = cJSON_GetObjectItemCaseSensitive(json, "weather"); + cJSON_ArrayForEach(weather, weatherArray) { + cJSON *description = + cJSON_GetObjectItemCaseSensitive(weather, "description"); + if (!cJSON_IsString(description)) { + printf("error parsing description\n"); + return; + } + printf("Weather description: %s\n", description->valuestring); + } + + main = cJSON_GetObjectItemCaseSensitive(json, "main"); + if (!main) { + printf("Error parsing main\n"); + return; + } + temp = cJSON_GetObjectItemCaseSensitive(main, "temp"); + if (!temp) { + printf("error parsing temp\n"); + return; + } + + printf("Temp: %.2f\n", temp->valuedouble); +} diff --git a/011LineNumbers/window.c b/011LineNumbers/window.c new file mode 100644 index 0000000..2ee1ccc --- /dev/null +++ b/011LineNumbers/window.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int main(int argc, char *argv[]) { + struct winsize win; + /* + * unsigned short ws_row + * unsinged short ws_col + * unsighed short ws_xpixel + * unsinged short ws_ypixel + */ + ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); + + printf("Lines: %d\n", win.ws_row); + printf("chars: %d\n", win.ws_col); + printf("xpixel: %d\n", win.ws_xpixel); + printf("ypixel: %d\n", win.ws_ypixel); + + return 0; +} diff --git a/012ArrayDecay/array-decay.c b/012ArrayDecay/array-decay.c new file mode 100644 index 0000000..6ad8dfc --- /dev/null +++ b/012ArrayDecay/array-decay.c @@ -0,0 +1,26 @@ +#include + + +int len(int *arr) { + printf("sizeof arr: %d\n", (sizeof arr)); + return sizeof arr / sizeof arr[0]; +} + +void printArray(int *arr, int len) { + for (int i=0; i + +int main(int argc, char **argv) { + + FILE *file = fopen("words.txt", "r"); + if (!file) { + fprintf(stderr, "Error opening file"); + return -1; + } + char buffer[256]; + int lineCount = 0, wordCount = 0; + + while (fgets(buffer, sizeof(buffer), file)) { + lineCount++; + if (buffer[0] == '\n') + continue; + + for (int i = 0; buffer[i] != '\0'; i++) { + if (buffer[i] == ' ' || buffer[i] == '\n') { + wordCount++; + } + } + } + + printf("Number of Lines: %d\n", lineCount); + printf("Number of Words: %d\n", wordCount); + + fclose(file); + + return 0; +} diff --git a/013WordCount/words.txt b/013WordCount/words.txt new file mode 100644 index 0000000..a823e02 --- /dev/null +++ b/013WordCount/words.txt @@ -0,0 +1,5 @@ +hey this is a file with words in it + +it has newlines and spaces + +lets a program to figure out the number of lines and words. diff --git a/014Criterion/math.c b/014Criterion/math.c new file mode 100644 index 0000000..e7cba57 --- /dev/null +++ b/014Criterion/math.c @@ -0,0 +1,31 @@ +#include "math.h" + +int add(int x, int y) { return x + y; } +int subtract(int x, int y) { return x - y; } +double divide(int x, int y) { + if (y == 0) + return 0.0; + return (double)x / y; +} +int mulitply(int x, int y) { return x * y; } +int doubleVal(int x) { return x * 2; } +int power(int x, int p) { + int val = 1; + for (int i = 1; i <= p; i++) { + val *= x; + } + return val; +} +double squareRoot(int x) { + double sqrt, val; + + sqrt = divide(x, 2); + val = 0; + + while (sqrt != val) { + val = sqrt; + + sqrt = (x / val + val) / 2; + } + return sqrt; +} diff --git a/014Criterion/math.h b/014Criterion/math.h new file mode 100644 index 0000000..1448d26 --- /dev/null +++ b/014Criterion/math.h @@ -0,0 +1,8 @@ + +int add(int x, int y); +int subtract(int x, int y); +double divide(int x, int y); +int mulitply(int x, int y); +int doubleVal(int x); +int power(int x, int p); +double squareRoot(int x); diff --git a/014Criterion/test.c b/014Criterion/test.c new file mode 100644 index 0000000..870b703 --- /dev/null +++ b/014Criterion/test.c @@ -0,0 +1,57 @@ +#include "math.h" +#include +#include +#include +#include +#include +#include +#include + +Test(basic, test1) { cr_assert(1 == 1); } + +Test(basic, test2) { cr_expect(2 == 2); } + +void setup() { printf("setup!\n"); } + +void teardown() { printf("teardown\n"); } + +Test(basic, setup_teardown, .init = setup, .fini = teardown) { + cr_assert(true); +} + +Test(basic, signal, .signal = SIGSEGV) { + + int arr[2] = {1, 2}; + arr[2] = 3; +} + +Test(basic, noSignal) { + + int arr[2] = {1, 2}; + arr[2] = 3; +} + +Test(basic, fail) { cr_fail("this test will always fail until.."); } + +Test(basic, pass) { cr_skip("feature is not implemented"); } + +struct thing { + int *param; +}; + +Test(basic, memory) { + struct thing thing1 = {.param = cr_malloc(sizeof(int))}; + + // run tests... + cr_free(thing1.param); +} + +Test(math, add) { cr_assert(add(1, 1) == 2); } +Test(math, sub) { cr_assert(subtract(5, 10) == -5); } +Test(math, mulitpy) { cr_assert(mulitply(2, 3) == 6); } +Test(math, sqrt25) { cr_assert(squareRoot(25) == 5.0); } +Test(math, sqrt2) { + double res = squareRoot(2); + printf("sqrt2 == %.5f\n", res); + cr_assert(epsilon_eq(flt, res, 1.4142135, 0.00001)); +} diff --git a/015WebServer/main.c b/015WebServer/main.c new file mode 100644 index 0000000..aa9d596 --- /dev/null +++ b/015WebServer/main.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 +#define PORT 9090 + +char *parseRoute(const char *route) { + + if (strcmp(route, "home") == 0) { + return "./static/index.html"; + } else if (strcmp(route, "about") == 0) { + return "./static/about.html"; + } else if (strcmp(route, "favicon.ico") == 0) { + return "./static/favicon.ico"; + } else { + return "./static/notFound.html"; + } +} + +void sendHtml(int *sock, const char *route) { + // open our html file + FILE *html = fopen(route, "r"); + if (!html) { + perror("Error opening html file"); + return; + } + + char buf[BUFFER_SIZE] = {0}; + size_t read = 0; + + char *header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; + send(*sock, header, strlen(header), 0); + + while ((read = fread(buf, sizeof(buf[0]), BUFFER_SIZE, html)) > 0) { + send(*sock, buf, read, 0); + } + fclose(html); +} + +int main() { + int serverSocket; + + if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + struct sockaddr_in serverAddr; + serverAddr.sin_family = AF_INET; + serverAddr.sin_addr.s_addr = INADDR_ANY; + serverAddr.sin_port = htons(PORT); + + if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof serverAddr) < + 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + + if (listen(serverSocket, 5) < 0) { + perror("listen failed"); + exit(EXIT_FAILURE); + } + + printf("Server listening on port %d\n", PORT); + + while (1) { + + struct sockaddr_in clientAddr; + socklen_t clientAddr_len = sizeof clientAddr; + int *clientSocket = malloc(sizeof(int)); + + if ((*clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, + &clientAddr_len)) < 0) { + perror("accept failed"); + continue; + } + + printf("Connected\n"); + + char recBuf[BUFFER_SIZE] = {0}; + recv(*clientSocket, recBuf, BUFFER_SIZE, 0); + // printf("%s\n", recBuf); + + char *token = recBuf + 5; + char *route = strtok(token, " "); + + const char *file = parseRoute(route); + sendHtml(clientSocket, file); + + close(*clientSocket); + printf("disconnected client.\n\n"); + } + + close(serverSocket); + return 0; +} diff --git a/016RestAPI/Makefile b/016RestAPI/Makefile new file mode 100644 index 0000000..cdeff63 --- /dev/null +++ b/016RestAPI/Makefile @@ -0,0 +1,8 @@ +all: + $(CC) -Wall server.c db.c -O2 -std=c23 -lpthread -lsqlite3 -o server + +debug: + $(CC) -Wall -g server.c db.c -O0 -std=c23 -lpthread -lsqlite3 -o serverDebug + +clean: + $(RM) -rf server serverDebug diff --git a/016RestAPI/db.c b/016RestAPI/db.c new file mode 100644 index 0000000..9996733 --- /dev/null +++ b/016RestAPI/db.c @@ -0,0 +1,72 @@ +#include "db.h" +#include +#include + + +sqlite3 *initDB() { + sqlite3 *db; + int rc = sqlite3_open("jokes.db", &db); + + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database %s\n", sqlite3_errmsg(db)); + return NULL; + } + return db; +} + +char *GetJoke(sqlite3 *db) { + sqlite3_stmt *stmt; + char *sql ="select joke from Jokes order by random() limit 1;"; + int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not read DB: %s\n", sqlite3_errmsg(db)); + return NULL; + } + + if (sqlite3_step(stmt) == SQLITE_ROW) { + char *data = (char *)sqlite3_column_text(stmt, 0); + char *joke = strdup(data); + sqlite3_finalize(stmt); + sqlite3_close(db); + return joke; + } + return NULL; +} + +bool DeleteJoke(sqlite3 *db, int id) { + char sql[64]; + char *errMsg; + + sprintf(sql, "delete from Jokes where id=%d;", id); + + int rc = sqlite3_exec(db, sql, 0, 0, &errMsg); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not delete: %s\n", errMsg); + sqlite3_free(errMsg); + return false; + } + return true; +} + +bool NewJoke(sqlite3 *db, char *data) { + + + return true; + +} + +int JokeCount(sqlite3 *db) { + int count = 0; + sqlite3_stmt *stmt; + const char *sql = "select count(*) from Jokes;"; + int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + fprintf(stderr, "Could not get count from db: %s\n", sqlite3_errmsg(db)); + return -1; + } + while ((rc = sqlite3_step(stmt)) != SQLITE_DONE) { + count = sqlite3_column_int(stmt, 0); + } + return count; +} + diff --git a/016RestAPI/db.h b/016RestAPI/db.h new file mode 100644 index 0000000..3322586 --- /dev/null +++ b/016RestAPI/db.h @@ -0,0 +1,12 @@ +#ifndef DB_H +#define DB_H +#include + +sqlite3 *initDB(); + +char *GetJoke(sqlite3 *db); +bool DeleteJoke(sqlite3 *db, int id); +bool NewJoke(sqlite3 *db, char *data); +int JokeCount(sqlite3 *db); + +#endif // !DB_H diff --git a/016RestAPI/init.sql b/016RestAPI/init.sql new file mode 100644 index 0000000..efc71a7 --- /dev/null +++ b/016RestAPI/init.sql @@ -0,0 +1,12 @@ +create table Jokes ( + Id integer PRIMARY KEY NOT NULL, + Joke text NOT NULL +); + +insert into Jokes values(NULL, '!false its funny because its true'); +insert into Jokes values(NULL, 'The best thing about a Boolean is that even if you are wrong, you are only off by a bit.'); +insert into Jokes values(NULL, 'javascript'); +insert into Jokes values(NULL, 'If you listen to a UNIX shell, can you hear the C?'); +insert into Jokes values(NULL, 'My code never has bugs — it just develops random undocumented features.'); +insert into Jokes values(NULL, 'I dont always test my code, but when I do, I do it in production.'); + diff --git a/016RestAPI/server.c b/016RestAPI/server.c new file mode 100644 index 0000000..634393d --- /dev/null +++ b/016RestAPI/server.c @@ -0,0 +1,219 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "db.h" + +#define BUF_SIZE 512 +#define MAX 10 +#define PORT 9000 + +sqlite3 *db; + +enum method_t { + GET, DELETE, POST +}; + +typedef struct client_t { + int sock; +} client_t; + +typedef struct request_t { + enum method_t method; + int sock; + char *endPoint; +} request_t; + +void *handleClient(void *client); +void parseRequest(int sock, char *req); +void getJoke(request_t request); +void deleteJoke(request_t request); +void newJoke(request_t request, char *data); + + + +int main(int argc, char *argv[]) { + db = initDB(); + if (!db) { + perror("error init db"); + return -1; + } + + int serverSock = 0, clientSock; + struct sockaddr_in serverAddr, clientAddr; + pthread_t threadID = 1; + + serverSock = socket(AF_INET, SOCK_STREAM, 0); + if (serverSock < 0) { + perror("listen socket failed"); + return -1; + } + + int on = 1; + if (setsockopt(serverSock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { + perror("listen setsockopt failed"); + return -1; + + } + + serverAddr.sin_family = AF_INET; + serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); + serverAddr.sin_port = htons(PORT); + + if (bind(serverSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) { + perror("failed to bind"); + } + + if (listen(serverSock, MAX) < 0) { + perror("failed to listen"); + } + + + while(true) { + socklen_t clientLen = sizeof(clientAddr); + + if ((clientSock = accept(serverSock, (struct sockaddr *)&clientAddr, &clientLen)) < 0) { + perror("could not accept client"); + continue; + } + + client_t *c = (client_t *)malloc(sizeof(client_t)); + + c->sock = clientSock; + + if ((pthread_create(&threadID, NULL, handleClient, (void *)c)) < 0) { + perror("Could not create pthread"); + close(clientSock); + continue; + } + + pthread_join(threadID, NULL); + free(c); + + } + + close(serverSock); + + + return 0; +} + +void *handleClient(void *c) { + client_t *client = (client_t*)c; + if (!client) { + perror("could not create our client_t"); + return NULL; + } + int read = 0; + char buf[BUF_SIZE]; + + if ((read = recv(client->sock, buf, BUF_SIZE, 0)) <= 0) { + perror("Client disconnected"); + close(client->sock); + return NULL; + } + + parseRequest(client->sock, buf); + close(client->sock); + return NULL; + +} + + +void parseRequest(int sock, char *req) { + request_t httpReq; + httpReq.sock = sock; + + char *lines[10]; + char *token = NULL; + + int i = 0; + token = strtok(req, "\n"); + lines[i++] = token; + while (token) { + token = strtok(NULL, "\n"); + lines[i++] = token; + } + + char topLine[BUF_SIZE]; + strcpy(topLine, lines[0]); + + // POST, GET, DELETE + char *request = strtok(lines[0], " "); + + if (strcmp(request, "POST") == 0) { + httpReq.method = POST; + } else if (strcmp(request, "GET") == 0) { + httpReq.method = GET; + } else if (strcmp(request, "DELETE") == 0) { + httpReq.method = DELETE; + } + + int len = strlen(request); + request = topLine + len; + char *endPoint = strtok(request, " "); + httpReq.endPoint = endPoint; + + if (httpReq.method == GET) { + getJoke(httpReq); + } else if (httpReq.method == DELETE) { + deleteJoke(httpReq); + } else if (httpReq.method == POST) { + newJoke(httpReq, lines[7]); + } +} + + +void getJoke(request_t request) { + + char *joke = GetJoke(db); + if (joke) { + send(request.sock, joke, strlen(joke), 0); + } else { + char *msg = "error getting the joke"; + send(request.sock, msg, strlen(msg), 0); + } + +} + + +void deleteJoke(request_t request) { + // /joke/{id} + char *val = request.endPoint + 6; + int id = atoi(val); + + if (DeleteJoke(db, id)) { + char msg[128]; + sprintf(msg, "deleted joke %d\n", id); + send(request.sock, msg, strlen(msg), 0); + } else { + char *msg = "error deleting the joke"; + send(request.sock, msg, strlen(msg), 0); + } + +} +void newJoke(request_t request, char *data) { + + char *joke = strtok(data, ":"); + joke = strtok(NULL, ":"); + int len = strlen(joke); + joke[len-1] = '\0'; + + if (NewJoke(db, joke)) { + char msg[256]; + sprintf(msg, "created new joke %s\n", joke); + send(request.sock, msg, strlen(msg), 0); + } else { + char *msg = "error creating new joke"; + send(request.sock, msg, strlen(msg), 0); + } + + + + +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4072164 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +MIT No Attribution + +Copyright 2024 Travis Avey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7a2e5d --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# C Tutorials + + +## Description +These are from my video tutorials on youtube, you can find [here](https://www.youtube.com/@aveydotdev) + + +## Contributing +If you find a mistake feel free to make a correction! + +## License +MIT