From 15f9249a2c932fc72d6f4284ada49964dfdc091d Mon Sep 17 00:00:00 2001 From: Frederikke Levinsen Date: Wed, 8 Sep 2021 17:08:15 +0200 Subject: [PATCH] Niko + Fie + mig --- A0/.gitignore | 2 + A0/Makefile | 14 ++++++ A0/file | Bin 0 -> 50600 bytes A0/file.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ A0/test.sh | 42 ++++++++++++++++ 5 files changed, 190 insertions(+) create mode 100644 A0/.gitignore create mode 100644 A0/Makefile create mode 100755 A0/file create mode 100755 A0/test.sh diff --git a/A0/.gitignore b/A0/.gitignore new file mode 100644 index 0000000..ede6568 --- /dev/null +++ b/A0/.gitignore @@ -0,0 +1,2 @@ +file.dsym/ +test_files/ \ No newline at end of file diff --git a/A0/Makefile b/A0/Makefile new file mode 100644 index 0000000..32024df --- /dev/null +++ b/A0/Makefile @@ -0,0 +1,14 @@ +CC=gcc +CFLAGS=-std=c11 -Wall -Werror -Wextra -pedantic -g3 + +file: file.c Makefile + $(CC) $(CFLAGS) -o file file.c + +../src.zip: file.c Makefile test.sh + cd .. && zip src.zip src/file.c src/Makefile src/test.sh + +clean: + rm -f *.o + rm -f file + +.PHONY: clean diff --git a/A0/file b/A0/file new file mode 100755 index 0000000000000000000000000000000000000000..553c19c1d31c61b33c3a0e3900a74e71bc0440da GIT binary patch literal 50600 zcmeI5U2Igx6~|{WF6JYw(~l@kpxh*wKw7+ugTYQ9*a0`!Dgmbkg+wC5diSoquzT0s zyGt;NC8x_uESr_wO8rn;DX33T)Q766sz?oy9V3X;Mj`D(d5BuSq}{EkL?u+wl;Zx+ z%)RT~>qM&h5>+}Q&7Jd~nRD*U@9f;Su|N3aZ+BJ*5o!@aEJJNaJ<=*fQ5dj<_$sQ2 zD&pSUBe7|zh^1aG3icZMzU!+o^w7kp3jSZ zT@=GFI9uW_U!avT5zECEJA&&or}X;TyeXs`<1Kn>i}p$HmU92#fo~1$8}!fCOkkhT zR9^Sa1#ze9mj{KIijtTSg5KSRw!SCmA?Rte^JtHuB|i6}nzKSYjJEv}eg_D+8ukz> zm9Kb}UU?sCBL~Q)^46RX_cZlru@;Six&}3pcb!N&H4;foq!Z9o?nk9{{C)J1u^T6M zz4BV}J0JhcY59E@`V3So2?eWaS*>iva^?ADkD!-+cYfK7{Zkxcx8I{%dT$RZjnST4 z6Kk-Y(BfLKp5X~MXJtB{?8LfKBbbD;36NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCh)%zIBb?aHebFzgnL3}x%H2@R%VukSsJ)ymM&hsy|7@GRZ~5O zTR>NezeNwdr*M(172(R)A|a!bQ4Xr5!^xy2_?rTUH?ov>uvVdlT#Vhl(EZ zJ^qA#Q6ul#vlzWxq>j*e)tKeGHepp}d8JuCe9P?p@LciN7!4P{jOpi=VMv|5faj@=x2W=YQyq%0D&Lb8xv*+z%5$u~o9_`6r?CPZsij z3{6?hR=c8JFaIyW)cH4I=~!gd^G`zMUm3G)I&C_j9s?#aRQ~<6sijsfK860qv|Yv( zwk2u%CMIDoeblJEkd>^bjbb2e)QPmwi~S^!V^i8_j@lp@UfR?o-$SCmDQ(n&v{8e! zW!0%$OxqrG`)MQFPa9uau59$ z%1_@!N44~USvovl{f)};WYw&6M~O@M@Vr@?{kf>VN&|&U#?iUtwE8_1u1Bv7+@@C` zoLS1>C`{g37CuXN8qLb?wQz>lIJ__mPf^>ULJ!<9%ct8Az6~>~Pf%ZJplTK-t2j67 z$hoYhv|~}%s%tP_j+$kdJMoh?%THrvlYePU-wFz$PF;ucZatvZjlEHvA$rwon1aRp zfmU%rO`5D$AO82k!s|FY>a2RMUs~dt)viAw*JHlx^-q?%UZZ6Y(fV8WY1bIJ8p^fx z%_Wn%^rT%h2~|I^-)eO|ln1yxa2x2ON9U#&I*#=VvCuK1o(c6#s^^$`9#_w_dfMta zj_3Z$`jcq-hZj0}L%6a!rrz{t038d{J3k_eF09smM^-mk^d%m9lB{>gdWNiDlJx>v zZ;+KH>jGJ4$oc`S4)-x59<%Li&PZ4}%gLl{%h=rEZdoOsb+Y!TVdpa=mSbd-M$8$_ zXDmDCKCntSf*h^Pcy3~qGW&=34h|Z0t6l5C;e%Uydb)cXy6DRADt(ugel}DZTVzt* zbKj1ZD&0}1LN?9-?#_mA7Zo&gsT+O=w@iQuFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%n84>tVBY(G^ndl*n_hdzYuondzdP_nuU+T0o4hva zwV&@U`0Y%92`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO z1pdDX-2ISvj&^W&pOn(g#o{MqeC&iA&BvUCc*YUax<6q#&Ujs9^EncUiF5)!`4Ksi zvN1zU3*qWWn4Tr=wgmzwW2rRtx1&E9PiI|=)V-v#|B!MW|EE-OOS{{ zEDrTRIo6AKIgRx}xjDywwU?KW6s=;p%#2Cvv=z_iEIEc)SnQ)ISBjk~nAASQnOMpe zN0yQ2vXqFMqjgE2RrN{It4V%iaSoWkSk1RfX8(7b79YWYmdka!>V+BPA~DgE~n zK7vl5`ek#dSx2CgEg|vG_j_VA2U2w6(cY_V8}`NqP2(GBqFSAvbAUP*1!_)rzx;*W#AAhET;?&<@2K4g*oeAjE0bK~_ zazKACpnn|DKMm+N0{RyL{dPd#2Yo;422=y}0n`UkA3~+yNeAjW)b*%eL*0b>-}o3p ze#%*qI4k-bkmVl@sm_Z&kKPf&M?{~crmu-Q^i4hb`=Yw^r$w9U!{UDzye~riTi|^K z{PXXh{KYfBcSa670X#7a@e&THxje$SlT+3vR%uL?6cexx$Jo4IV7uc*vBLBiTL*9 z&eL{xGO@F_=T!Gt;>1X1$4E~UWz>!wijd#dZI5o-wmsIF6-_i388?2EG-UA~WtyPh literal 0 HcmV?d00001 diff --git a/A0/file.c b/A0/file.c index e69de29..9d9d7cc 100644 --- a/A0/file.c +++ b/A0/file.c @@ -0,0 +1,132 @@ +#include // fprintf, stdout, stderr. +#include // exit, EXIT_FAILURE, EXIT_SUCCESS. +#include // strerror. +#include // errno. +#include + +enum FileType{ASCII, ISO, UTF, data}; + +bool is_utf8(FILE* f) { + rewind(f); + char byte; + bool utf8_byte; + int char_length; + for (;;) { + if (fread(&byte, 1, 1, f) == 0) { + break; + } + utf8_byte = true; + for (int j = 0 ; 1 ; j++) { + if (byte >> 7 == 0) { + char_length = max(j, 1); + break; + } + byte = byte << 1; + } + for (int i = 1 ; i < char_length ; i++) { + printf("esnathusrcaho"); + } + } + return true; +} + +bool is_iso8859(FILE* f) { + rewind(f); + int iso8859_CHARACTERS[197]; + + for (int i = 0 ; i < 7 ; i++) { + iso8859_CHARACTERS[i] = i+7; + } + iso8859_CHARACTERS[7] = 27; + for (int i = 0 ; i < 94 ; i++) { + iso8859_CHARACTERS[i+8] = i+32; + } + + for (int i = 0 ; i < 95 ; i++) { + iso8859_CHARACTERS[i+102] = i+160; + } + char byte; + bool is_iso8859; + for (;;) { + if (fread(&byte, 1, 1, f) == 0) { + break; + } + is_iso8859 = false; + for (int i = 0 ; i < 95 ; i++) { + if (byte == iso8859_CHARACTERS[i]) { + is_iso8859 = true; + break; + } + } + if (! is_iso8859) { + return false; + } + + } + return true; +} + +bool is_ascii(FILE* f) { + rewind(f); + int ASCII_CHARACTERS[102]; + + for (int i = 0 ; i < 7 ; i++) { + ASCII_CHARACTERS[i] = i+7; + } + ASCII_CHARACTERS[7] = 27; + for (int i = 0 ; i < 94 ; i++) { + ASCII_CHARACTERS[i+8] = i+32; + } + + char byte; + bool ascii_byte; + for (;;) { + if (fread(&byte, 1, 1, f) == 0) { + break; + } + ascii_byte = false; + for (int i = 0 ; i < 102 ; i++) { + if (byte == ASCII_CHARACTERS[i]) { + ascii_byte = true; + break; + } + } + if (! ascii_byte) { + return false; + } + + } + return true; + +} + +int print_error(char* path, int errnum) { + return fprintf(stderr, "%s: cannot determine (%s)\n", path, strerror(errnum)); +} + +int main(int argc, char* argv[]) { + + if (argc != 2) { + printf("Wrong number of arguments!\n"); + return EXIT_FAILURE; + } + + FILE* f = fopen(argv[1], "r"); + + if (f == NULL) { + print_error(argv[2], errno); + } + char byte; + if (fread(&byte, sizeof(char), 1, f) == 0) { + fprintf(stdout, "%s: empty\n", argv[1]); + } else if (is_ascii(f)) { + fprintf(stdout, "%s: ASCII text\n", argv[1]); + } else if (is_iso8859(f)) { + fprintf(stdout, "%s: ISO-8859 text\n", argv[1]); + } else { + fprintf(stdout, "%s: data\n", argv[1]); + } + + fclose(f); + return EXIT_SUCCESS; +} diff --git a/A0/test.sh b/A0/test.sh new file mode 100755 index 0000000..af8bd1f --- /dev/null +++ b/A0/test.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# Exit immediately if any command below fails. +set -e + +make + + +echo "Generating a test_files directory.." +mkdir -p test_files +rm -f test_files/* + + +echo "Generating test files.." +printf "Hello, World!\n" > test_files/ascii.input +printf "Hello, World!" > test_files/ascii2.input +printf "Hello,\x00World!\n" > test_files/data.input +printf "Hællo,\x00World!\n" > test_files/iso1.input +printf "Hello,\x00Wørld!\n" > test_files/iso2.input +printf "Hello,\x00World!\n" > test_files/utf81.input +printf "Hello,\x00World!\n" > test_files/utf82.input +printf "" > test_files/empty.input +### TODO: Generate more test files ### + + +echo "Running the tests.." +exitcode=0 +for f in test_files/*.input +do + echo ">>> Testing ${f}.." + file "${f}" | sed 's/ASCII text.*/ASCII text/' > "${f}.expected" + ./file "${f}" > "${f}.actual" + + if ! diff -u "${f}.expected" "${f}.actual" + then + echo ">>> Failed :-(" + exitcode=1 + else + echo ">>> Success :-)" + fi +done +exit $exitcodeASCII