From 416f44ae748137c160afdc85643c0b4e22fdb10a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20Baumg=C3=A4rtner?= Date: Tue, 9 Dec 2025 08:00:32 +0100 Subject: [PATCH] Endlich fertig --- bintree.c | 87 ++++++++++++++-- bintree.o | Bin 0 -> 5840 bytes doble | Bin 0 -> 18384 bytes doble_initial | Bin 0 -> 14936 bytes highscore.o | Bin 0 -> 10088 bytes highscores.txt | 11 +- main.o | Bin 0 -> 5440 bytes makefile | 32 +++++- numbers.c | 95 +++++++++++++++++- numbers.o | Bin 0 -> 5240 bytes stack.c | 30 ++++-- stack.h | 7 +- stack.o | Bin 0 -> 3320 bytes test_bintree | Bin 0 -> 10768 bytes test_bintree.c | 48 +++++++++ test_bintree.dSYM/Contents/Info.plist | 20 ++++ .../Contents/Resources/DWARF/test_bintree | Bin 0 -> 13529 bytes .../Relocations/x86_64/test_bintree.yml | 20 ++++ test_numbers | Bin 0 -> 15552 bytes test_numbers.c | 41 ++++++++ test_numbers.dSYM/Contents/Info.plist | 20 ++++ .../Contents/Resources/DWARF/test_numbers | Bin 0 -> 14784 bytes .../Relocations/x86_64/test_numbers.yml | 24 +++++ test_stack | Bin 0 -> 9632 bytes test_stack.c | 44 ++++++++ test_stack.dSYM/Contents/Info.plist | 20 ++++ .../Contents/Resources/DWARF/test_stack | Bin 0 -> 10586 bytes .../Relocations/x86_64/test_stack.yml | 12 +++ timer.o | Bin 0 -> 3912 bytes 29 files changed, 486 insertions(+), 25 deletions(-) create mode 100644 bintree.o create mode 100755 doble create mode 100755 doble_initial create mode 100644 highscore.o create mode 100644 main.o create mode 100644 numbers.o create mode 100644 stack.o create mode 100755 test_bintree create mode 100644 test_bintree.c create mode 100644 test_bintree.dSYM/Contents/Info.plist create mode 100644 test_bintree.dSYM/Contents/Resources/DWARF/test_bintree create mode 100644 test_bintree.dSYM/Contents/Resources/Relocations/x86_64/test_bintree.yml create mode 100755 test_numbers create mode 100644 test_numbers.c create mode 100644 test_numbers.dSYM/Contents/Info.plist create mode 100644 test_numbers.dSYM/Contents/Resources/DWARF/test_numbers create mode 100644 test_numbers.dSYM/Contents/Resources/Relocations/x86_64/test_numbers.yml create mode 100755 test_stack create mode 100644 test_stack.c create mode 100644 test_stack.dSYM/Contents/Info.plist create mode 100644 test_stack.dSYM/Contents/Resources/DWARF/test_stack create mode 100644 test_stack.dSYM/Contents/Resources/Relocations/x86_64/test_stack.yml create mode 100644 timer.o diff --git a/bintree.c b/bintree.c index 5cf82a9..668c164 100644 --- a/bintree.c +++ b/bintree.c @@ -1,18 +1,65 @@ +#include #include #include "stack.h" #include "bintree.h" -//TODO: binären Suchbaum implementieren -/* * `addToTree`: fügt ein neues Element in den Baum ein (rekursiv), - * `clearTree`: gibt den gesamten Baum frei (rekursiv), - * `treeSize`: zählt die Knoten im Baum (rekursiv), - * `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. */ +// internal helper to push node and all its left descendants onto iterator stack +static void bintree_pushLefts(StackNode **iterStackPtr, TreeNode *n) +{ + while(n != NULL) + { + *iterStackPtr = push(*iterStackPtr, n); + n = n->left; + } +} // Adds a copy of data's pointer destination to the tree using compareFct for ordering. Accepts duplicates // if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added). TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) { + if(isDuplicate != NULL) + *isDuplicate = 0; + if(root == NULL) + { + TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); + if(node == NULL) + return NULL; + node->data = malloc(dataSize); + if(node->data == NULL) + { + free(node); + return NULL; + } + memcpy(node->data, data, dataSize); + node->left = node->right = NULL; + return node; + } + + int cmp = compareFct(data, root->data); + if(cmp < 0) + { + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } + else if(cmp > 0) + { + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + else // equal + { + if(isDuplicate != NULL) + { + *isDuplicate = 1; + // do not insert duplicate + } + else + { + // duplicates allowed -> insert into right subtree + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + } + + return root; } // Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction. @@ -20,17 +67,45 @@ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFc // push the top node and push all its left nodes. void *nextTreeData(TreeNode *root) { + static StackNode *iterStack = NULL; + // If a new tree root is provided -> reset iterator + if(root != NULL) + { + clearStack(iterStack); + iterStack = NULL; + bintree_pushLefts(&iterStack, root); + } + + if(iterStack == NULL) + return NULL; + + TreeNode *node = (TreeNode *)top(iterStack); + iterStack = pop(iterStack); + + if(node->right != NULL) + bintree_pushLefts(&iterStack, node->right); + + return node->data; } // Releases all memory resources (including data copies). void clearTree(TreeNode *root) { + if(root == NULL) + return; + clearTree(root->left); + clearTree(root->right); + + free(root->data); + free(root); } // Returns the number of entries in the tree given by root. unsigned int treeSize(const TreeNode *root) { - + if(root == NULL) + return 0; + return 1 + treeSize(root->left) + treeSize(root->right); } \ No newline at end of file diff --git a/bintree.o b/bintree.o new file mode 100644 index 0000000000000000000000000000000000000000..47986c50d8be86e71653c39810f7e35b91de78b1 GIT binary patch literal 5840 zcmbtYeQaCR6~E8UeX--jc0QUmgVHdSq>RQ+Q;0H1At`ZreQlv5X-Mh1SI2&d-TDiE zbSWaDOA4xGbpx?Km=J9HV*_b}AqEo+*jmx80f{Y|G(eN4Rns;lS|>U>SjH-{-?{I; z#BnoiY*)GW-1B+QJ@?-8j`Pcp|ME#SV~UeuK(9hSNkc0-S_`_1@PE@@_F0T)q|Emv z4x5a6t<*D&yg8AV2!LS>g+_*!aeMYKIf6#^$mB>9WB4QFI03sE#%L~QBY=i6&_C3_ zOn6@U;aVm!XdGux(^c)IM-NAcU1_f%_qS1+S?`sTWw5F};a?^kskHZv3VZ$k zrM>*I%&Pl+UE13r<7fUydy#Y!e&vlq>dWy|)G&4rEN=y8DC7SvNu>Ko_pfISW89)u z?AMGLV_BSr#jJcE&q#acEjHWhx9mxjfgQ8w1nv8mh^K_b%J`j>4|Ah@6rJ^!_96Hu zL$JcXF0j|3TRa5EVLdPsB6#jby0Pm8WY;dEwKxeOmF4+Vq7! ztvGp6D;DOo;=c1*anF0Zi=kOb0oFIp6 z|NZcP0r&5sb-hm9VA+FG5BY5ELmUgFaB4W6QlATEFV4S(4Im_b3Q6Bed()E(*c$md zA6zmx;hKAwR49@-gE^rukREH9(&U0Q5k}$cD*l$m`yqPq=R%h;viZ+h%h2h%=4P?X z^l7CSx?nks#a;)gc%~G(pv)9QmrJ3`@Ej3Q>Xqxfjoj&-dcgbsgI@pItGx9}1KzYF z09J$Ax6bLk*>j7hy=7no5w*G*z%qk0 z+Ne0a9uFB{%w4x+tp{ig-B^!DEQ~^<(gWn9N)ox`-3TMMdOR@TYl8v*8f9l=I~es` zEZ@*306TKhq;rEX%gMB z!|k*SlPbrfnV1kEaqf6D<|Ay7Fs4pns6K_^19ZjbBH&j%ZaO_OsnjvI0{I`%-0NaB zDhaEvV5mMzGw_^sE;6~!=~_~A)-ZPyXn%!>)8lft*z;OHQ%R4~v}mt@qYQ7r=x899 zmfW?m7`ftT;1njuqlc10(qmyGPY7(2h3zFX$HUpp#<#RD!ie65-T%>rpeCi>FhqTe<_CfzH-Vg4(gA zyAxQTt2@wrJsXXu@>$aiL|AZld^8)*9t#ebN6kb!V`hW5r<2KWD!Lor`=N9?kqZtE z?8*iAgd=wijs$YiBdly1+?T^@!DHc6Dt=@%Tu6?Gv-uQ^45TB4q?yX+f_t;^qv3pT zdpr>>q{f4T`9d^aNE+Kip`Af39f{>4u|mQO4w@(*^JaFdanE4aO*eOS2X}TEd$Zvq z!67r8yvZ0yk0wkOhs0n$967?ocxO6lvS>ITW-0njFoZn`Qi|vab1cuY@$p!mg`?4- zG;xI-O$JCwhQY`baKQhGun!nv1~e>7Yhnj4tyg| z6;e2h(#??gl13t(8fT)q%bGhPd4|Yl!eTmv;*pWTcy6GONyH=JyvZWT%<=~JqC8JA zZLptipD1>y;IV%M5lsw(qt}>2IID$+KqbhtGA@CLa0K@89U} zez7+O9%Y-8=#Qg6gZ?r)Ekbr)paG5Y3{7_tf<}*q@Z*wCDT$_3%u%E3PdGgyYV_P` z`jNn3U+zP)uh<9q{%K^W#-`pR?bH4#9!~7ON|cONJn%q7Z0xw$MI)_u%h$ehOZG>z z|L8n^(sRSQSI>NJ#}f~{{aEh{k9{zERloN0-@bId?ftJq|7r9eqrZ)Q9{mzJWkpJP zThVEbKSmFcsyj4#&_tp)zEMyZJzgTw>y;#W>qOcFl2oL;MWnOn_<~WR{6QqjEmDy( z2$3jBN<~WRz}OTzNR-2+KIIq^rqm;afh{-6sc6=?OlGGgMP$2G_~lu3HU07&x*ESc zf3C*2k5;+=Zl+B56@P8D>k;@wF}NDN=Wld~i;L2KM^aMxru z1VWFq%E8=pKSgskD7>l0^(=R(BfLf(=gq3l>(rRQ+W;HYr+B@(i`Rl*2mbmug@}8K zH|Zd5<7=T%tMdlP)~UL>pS$1U&8~0q&w_4A`PFIe2If;ARi|PS|PVa=Onl8fN<3dIaZWC0Ly+KP@A5j% z=N@#mVy#P9euQtpTGv3LqZgj>nkm{?9U|-p4Q_Gu4z73(a^{?6PeJKb;UIb8yBEtt zfI__Ap4O=M3Qeq61FE$@&wkEacdk%wc@+!m+^=)*2=5%@-8ygA`E`g$0FG``J-rSU z4}xyXT3jC&V;x=zpT;#p$=z`P5CR>;*0owsB@^2EEr9p|-?3TZl!Niv?6_LuiUpG& z(?bLOL$L~5|0fHc`W;|3=)aNl=V25%rGq}1-`+(DD#BO5}xAXA{ ziJz7-l%Gi6&d1jPFH;vev>ZQF!GE9vZ>hlPe>dg&l-J8~W?Wf@8ToXE85tT3BWWfh znPWyIc7z#J=Go<2V7VAHMBQc;hN7Bd#!~%;|AnFMvm``iXDnBPMlzg8q$4Zs!ar*N E0;d%&o&W#< literal 0 HcmV?d00001 diff --git a/doble b/doble new file mode 100755 index 0000000000000000000000000000000000000000..88b0bc98766794fa265b0d35f39704af7f396269 GIT binary patch literal 18384 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 literal 0 HcmV?d00001 diff --git a/doble_initial b/doble_initial new file mode 100755 index 0000000000000000000000000000000000000000..69c6a2e44bdba72f61f34951a011b70f349abb5a GIT binary patch literal 14936 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 Q!3r{?%e|Fw@4`O#UrlB=%m4rY literal 0 HcmV?d00001 diff --git a/highscore.o b/highscore.o new file mode 100644 index 0000000000000000000000000000000000000000..b268078d74882b61cda7faa83b4f2c89ce1d91d4 GIT binary patch literal 10088 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 P9I)tB$f|0=e8&D87%?DA literal 0 HcmV?d00001 diff --git a/highscores.txt b/highscores.txt index 4edd5a7..7f7e944 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1 +1,10 @@ -player1;3999 +Lena;19811 +Lena;19702 +player_name;9981 +Lena;9980 +Lena;9978 +Lena;9978 +Lena;9976 +Lena;9975 +Lena;9971 +Lena;9965 diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..f167660d920e04d926c8028138611c7eeaf113a9 GIT binary patch literal 5440 zcmb7IZEO_B8J@fItnYlb?~LmNNCHcW$p^6y9B?9I2*lp#3=X*11OrKy_1*ez@p^{ z&e_M=QQMJcpLsv#nRjM)-kI~C{`JY1m5liU3=h-_)MNCJQBfA521)*^QsWs;6@7#Z zPDZs_^ix$^-){>6psIaJf8VTJY>oQ87V#0~sXE4%k*b0{Lr^TLny~D=VWxzloUh0e zrAeVIrC>^m7-mMJs!4soNvYbvKwclA_&RrP+Wy##{drm-l(QbNSWq-(;TFmwpJ5JW z$)%jHO{~`f!TVRicV+=&_@go}A13V@%lW#+{N51ry%~1hN*`r>S}vE-RZ|<*EqIml zHH5sb#aH$l@m@;^=jF=|>`RbOIp2ifTP_Gz*OoAO&3XCU_;OmJobPlQ-;V#0&pwcw zcfM~6zDpvk1OJsTksU@{w(6LphM82=?#|K~y;S8%dxdgigfV*68|ytpvuwV4S{=;e zZFn8Zzvn5zcS7*}Nbm`f;dQ5rZNlRBmoZG2v3&iGiSJ{-_+C~;z25zZPpEE*uLb6X zsGbdr<3|7}asFP zPUB;fzR1x>(25tFsrd2r+Yrnd_5s--bwY|CcWw&Jgfi(`#;2+xM>$+>d@?;fedAYn z6qK9s@!v+Dx->Z099epl`m@sUCLGwurdZ_Y6R?2#W2}Op6|oeQ$#u%j$oM_vP*A4g ziN_}kYmUK}Hl*-{)A&Un0=e-fMuqK_S(^x;eEgov%D*Wb%sM{dOkP%KXv}=dA33_x z9gC)dAs@!5lkq|{ethlIv#i4Z#sg5rkMpMpCX{QQ@5Uh7SL2rzdSC3aa>ax51ZRBX zW9I|Ml(Uf|wDG?=cK!prxybh}LiK`j_LML3th2NZ%9Vn0VV!a%@@$OA3S(D4i$s-+MYaj$oRH5U zi1*-f#^(-ugW@VU7YaMBz!1Su#eoZB*IbXUkg;Is$qLHHcp*JcU23#gqrSmkFcIuf#+Vhf!vcto+oXqBOdd8MVvU%8hL6p`8&^3wH zP&S{}hiu_*m~vxtYi3aH)rTB2so!hfhXDquY07xYjgH*onB=eL4i?RV7H`4&jX z18Z1UeOq{4*pF-w@cFus4=R>H_Yg7xU(N!x8^U2UC2EGl8_=wz3=(VxQ#eWzN-<_er zm{8324Ke=@$hb5Vcy5jn^L>?!%R+&|9HXE4-zDP%p}_Gu#zoBkcQURH1%5Wi7-4?8 z0r}R20>7MNypQ>t$k-7I{AG?&X8z4&><$IKoMZe3^QXwTEfm;B869PIo)5Fipr>O@ zN5l8Tm-Gz&88jjP$^A>IXYd-ND*s9Qev+y_^rYMdlEUQ4!Z|@Q;&N1xWg+!{+--g8 zvDrIZiTYQ+Bs#PKL7m%0rX?;J3%W-J49}DDiQDM8q8QPhQYp9BmA>#I%IGBBOPEUN zLbMq2Iy0D-PbKIv!u0)y-H}b|vu8q&W~Z5VUTmd%Ued{BjD%+EY*^PUC$A@a^+eW8 zS}d7$XbKKi%pGNBOeKT4W2u;X$gp_trZ`?Hy=Au+e{7M?$B>m>WDE!L^y`bKckMg; z{XX~C;NZQCmYmuBg6Zrf~a(#P`G4Vjilxz!#5jE^X$w zNogJeE|%Wo3#FjUBhq@lNb2XIcGyqxY84P}=S<&ZAY=d5~=ARCg8rHecLMo_9(q zUL*aS-z~iZ;|XaG_l2)=_Bloh?&38g=(U;Gp;xQ)G7s5&0Y>8vZ`i}{KFu4XBm8!0 z3%_lAl*^-hxpaa*JQ#TF_dFD6Yv;1`245n*2HJIe*^|6pYUg$R=(7dd%@`YFH8@be z#_w<=w-Ll{z7n>Ec3$7ltEERU$#!1d&Q~CS78pAE`68FaK#zl%PYou4hLpe7a1&t4w~nOx{-}Gqv>0RTFs~2Vn6Cc5U&Q-%w0VWOOZGs<5;X zy;RO*wPdMm*|=5o8N)ixe#_40M6>kFS5vwzE(dVIub_O6sdUF->R=B4QM3n{T0|?M RnGn&VbLOyCwdCxO>_1piqk#Yb literal 0 HcmV?d00001 diff --git a/makefile b/makefile index 1f15f75..c707aae 100644 --- a/makefile +++ b/makefile @@ -29,14 +29,38 @@ program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o doble : main.o $(program_obj_files) $(CC) $(FLAGS) $^ -o doble -$(program_obj_filesobj_files): %.o: %.c - $(CC) -c $(FLAGS) $^ -o $@ +# pattern rule to build .o from .c +%.o: %.c + $(CC) -c $(FLAGS) $< -o $@ # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +unitTests: test_stack test_numbers test_bintree + @total=0; passed=0; failed=0; \ + for t in test_stack test_numbers test_bintree; do \ + total=$$((total+1)); \ + printf "Running %s...\n" "$$t"; \ + ./$$t; rc=$$?; \ + if [ $$rc -eq 0 ]; then \ + printf "%s: PASS\n\n" "$$t"; \ + passed=$$((passed+1)); \ + else \ + printf "%s: FAIL (exit %d)\n\n" "$$t" $$rc; \ + failed=$$((failed+1)); \ + fi; \ + done; \ + printf "Summary: %d tests run, %d passed, %d failed\n" $$total $$passed $$failed; \ + exit $$failed + +test_stack: test_stack.c stack.c + $(CC) $(FLAGS) test_stack.c stack.c -o test_stack + +test_numbers: test_numbers.c numbers.c bintree.c stack.c + $(CC) $(FLAGS) test_numbers.c numbers.c bintree.c stack.c -o test_numbers + +test_bintree: test_bintree.c bintree.c stack.c + $(CC) $(FLAGS) test_bintree.c bintree.c stack.c -o test_bintree # -------------------------- # Clean diff --git a/numbers.c b/numbers.c index f59d9a2..f45d131 100644 --- a/numbers.c +++ b/numbers.c @@ -5,22 +5,107 @@ #include "numbers.h" #include "bintree.h" -//TODO: getDuplicate und createNumbers implementieren -/* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. - * Sicherstellen, dass beim Befüllen keine Duplikate entstehen. - * Duplizieren eines zufälligen Eintrags im Array. - * in `getDuplicate()`: Sortieren des Arrays und Erkennen der doppelten Zahl durch Vergleich benachbarter Elemente. */ +// helper comparator for unsigned int for bintree +static int compareUInt(const void *a, const void *b) +{ + unsigned int va = *(const unsigned int *)a; + unsigned int vb = *(const unsigned int *)b; + if(va < vb) return -1; + if(va > vb) return 1; + return 0; +} + +// comparator for qsort (unsigned int) +static int qsort_uint_cmp(const void *a, const void *b) +{ + unsigned int va = *(const unsigned int *)a; + unsigned int vb = *(const unsigned int *)b; + if(va < vb) return -1; + if(va > vb) return 1; + return 0; +} // Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while // creating random numbers. unsigned int *createNumbers(unsigned int len) { + if(len < 2) + return NULL; + unsigned int *numbers = (unsigned int *)malloc(sizeof(unsigned int) * len); + if(numbers == NULL) + return NULL; + + // seed once + srand((unsigned int)time(NULL)); + + TreeNode *root = NULL; + unsigned int range = 2 * len; + // create len-1 unique numbers + for(unsigned int i = 0; i < len - 1; i++) + { + unsigned int val; + int isDup = 0; + // try until a unique number is inserted + do + { + val = (unsigned int)(rand() % range) + 1; // [1..2*len] + root = addToTree(root, &val, sizeof(val), compareUInt, &isDup); + // if addToTree returned NULL due to allocation failure, cleanup and return NULL + if(root == NULL && isDup == 0) + { + free(numbers); + clearTree(root); + return NULL; + } + } while(isDup); + numbers[i] = val; + } + + // duplicate one existing random entry + unsigned int idx = (unsigned int)(rand() % (len - 1)); + numbers[len - 1] = numbers[idx]; + + // shuffle array (Fisher-Yates) + for(unsigned int i = len - 1; i > 0; i--) + { + unsigned int j = (unsigned int)(rand() % (i + 1)); + unsigned int tmp = numbers[i]; + numbers[i] = numbers[j]; + numbers[j] = tmp; + } + + // free tree resources + clearTree(root); + return numbers; } // Returns only the only number in numbers which is present twice. Returns zero on errors. unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) { + if(numbers == NULL || len < 2) + return 0; + // make a copy so original array order is not modified by caller expectation + unsigned int *copy = (unsigned int *)malloc(sizeof(unsigned int) * len); + if(copy == NULL) + return 0; + + memcpy(copy, numbers, sizeof(unsigned int) * len); + + qsort(copy, len, sizeof(unsigned int), qsort_uint_cmp); + + unsigned int result = 0; + for(unsigned int i = 0; i + 1 < len; i++) + { + if(copy[i] == copy[i+1]) + { + result = copy[i]; + break; + } + } + + free(copy); + return result; } \ No newline at end of file diff --git a/numbers.o b/numbers.o new file mode 100644 index 0000000000000000000000000000000000000000..e87e9fed808d452a7702ef153005d1d6694eeb9e GIT binary patch literal 5240 zcmcIoeQZ zA0+(tr#A22mRGYp&QGM|uN2JuW-es&c%f)tjO4|5U2=b4lU`@7hWBfTugsV(h?h(y zgti#(Pm1Amnv#yTC7&pRrLhRlACHH1E$WZxNhpi)4$F8>OaH6oa&ng}h!^WU7$B2k zys}cmagFrvmCsqSL>9yo@x}dtVmxON-pNmhml}>QxZm9p@7pq<@Bc@>2|NwMLDS}+=OKA0&Plv05>K*p zF9z~+qWSX|4n+lGasC?R`FL4IG3qe9msc707Tmn}nju(@ZX7QxZZ;gqh~#zfqm<2p zj)D^WE_7;Slkc>5nHo}k;@0EIUiV~X+Oi`zG9x$4jtnj48B=c&!t_fBE2rMbj(INr z(L6;WPgb4sWJac#XoW;^1_iQm^FWm_!_th+{3(nUO1) z)skUuWXiCByD`b{W(?|SbZPy<+}vD_mQkm2J0`N#qd9dVbHS8VC#Ls8C47xQ5!7F@ zJ(ms3%em@NV@7+({#-cT$V|a;JTo%R94B{T3F$qaxo9%HFBv}LxsuVWdcj~W-GLe> zl%Bj;K#pfF%mH%xHN--xkefpKv+6DQ-|}QGwLSfIpJ+};?Frf$6VEd{GV95vr(iUj zV_Efmu^J|mIraTkb<&ZcqBEx62J+lAB~8jtN;w_IX)469!3gzjEaa$dm-v~PMi17= zrf2X7W|`vzU82m$433XPAg^h9syTIL{^`j-wL-)1!caWzTzZxq-tt`hgV{57k>Zov z9zpCg*>?)hg3yeq*J!P~M+;A|Rh@BU5GydTI54 z9L{N6FynOGJqE91{X418sn@dVZKMKuZ+!Y~N9{2<{2%jeT5P)CUd1i;<45ct9JN<2 zTWMcxT7uURDnti@wX9(l`x7=BDnbd>3|=q9iW81Yl(yv-`{TA&+XE{)sy5-{U=e3# zDI#a!0msAxQC==XPmgL#Fd6IQ2PNo41GaTIfd$kP#7f_ zs_s5gHA;+K2Z?KXl4>t2Rl!j6qr=oAP@WVhKB;OmRP8D9>yRjIgT#4>Lo2%?ZTEpO z?Xi%qlvcoAzHC_h*R7Gq^?@`KQbe-(LE&5OTkUi^Z)6aP{I zp|wT)H3HJI4j8<|+=W$b&tPZ+Z>}is09kIfR_p|Q0&eCqR?&rd4kl)swStl^=H->l zOn&BFRYva z=IRXfCj5zESGzu_hhuR);o2IDMEucUCq4qYW3h13)z!W|>Du8Be74KyOa>3Jf~l(~ z2^`n3KN<}k>h-51{r*HM3Xt|#ARW=8sibRHA~fhvxweGD!F06W)s;#IL+OaNMO8ao zo>*WY85l^1byt^;Z_1ROSg$?R)x6>H<`!2+v$iYYKjiAx{gDk?d#pFCvvf2W>W}Kd zx==L50twxp(svqrVdB#&q4#t^)32x6)A4X906qIcGM2y>7d*5;B+ke)tVi=XV2M~P z#kv!^zB3loS(JvLKjnu_Uy3C{{R0@0R-J{|pg+t)Ng%UOaEKjbDZu$zFXU{n7XieF zSwc^y!zt$J+U&uj5~YI51-%fck<29TKAkCg2~cC-xo5@x`q@>TKYAnn8}+`I=_}{} zdK~>2x;WsVUm^fBaRfncN?u$k@EasA$_e-mbZYr{r1~TAPz?W#4eg0~HG!kiUT9wy z#v!NgIAgDbiv!9UkB!=X`J(%c)-S)>dUo44kN6-vg#Il08Fac16dPTtHK1rzF-b)C zMT**_72TQ|h|%c6kQLnpddbaeR9exDu|QK;juz4v7MF$eh2>x&eLgFu!@HSjsM1tf zzQ{_yv1l8s&n45d%UkBi6yKNmL`+wANC3&1c`2Pviyxf)j;dTJ;J4N4jAbzg{#plwI*I(_ByvJ zUS6v7^X>2Q4#meCyu8ZCE0yg~_=IA`FSt!P&AF31lzsf(3}2Yj8KOaq@eVO;`<6 z5f1kvhylLd@M?tEi?}yp)mJcF z#*d(yGVEuSm#=p7W!R0Amt(&W zS5t}*8Q;g(S%zs_r+Hb?2Hn`;Mj70zN5}t{{h7@;h;+E>QD*Sv-f$j=4ZjB)ehdo5 z>Tij2%Nh=XS|L9RA?{McUQm3!H>{NO_rM_eZ$Sy?hoBtvEGXLQ7ch`LRVUQ2hR=bb zayL8#O1OUm4nhA;(osoUBrTKl1K4A#T$1#Al6obrm-K+7ZIaeW3L^YBN{Y3a9f0|| zMfHLBd>vW}p574owng&!I`%O50yXO|;`bNvdy4p@MLb~@;tdz^i6WlfW`*`l6YpfE z6~42z`LA=s #include "stack.h" -//TODO: grundlegende Stackfunktionen implementieren: -/* * `push`: legt ein Element oben auf den Stack, - * `pop`: entfernt das oberste Element, - * `top`: liefert das oberste Element zurück, - * `clearStack`: gibt den gesamten Speicher frei. */ - // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { + StackNode *node = (StackNode *)malloc(sizeof(StackNode)); + if(node == NULL) + return stack; // allocation failed -> return unchanged stack + node->data = data; + node->next = stack; + return node; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) StackNode *pop(StackNode *stack) { + if(stack == NULL) + return NULL; + StackNode *next = stack->next; + // Do NOT free stack->data here; caller owns the pointed data + free(stack); + return next; } // Returns the data of the top element. void *top(StackNode *stack) { - + if(stack == NULL) + return NULL; + return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { - + while(stack != NULL) + { + StackNode *next = stack->next; + // Do NOT free stack->data here; caller owns the pointed data + free(stack); + stack = next; + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..e2ca791 100644 --- a/stack.h +++ b/stack.h @@ -7,7 +7,12 @@ The latest element is taken from the stack. */ #include -//TODO: passenden Datentyp als struct anlegen +// Stack node for linked-list based stack. Data pointer is stored but not freed by stack operations. +typedef struct StackNode +{ + void *data; + struct StackNode *next; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/stack.o b/stack.o new file mode 100644 index 0000000000000000000000000000000000000000..014f77e69daaa29e348d64c7ee0925c8768b2be4 GIT binary patch literal 3320 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 literal 0 HcmV?d00001 diff --git a/test_bintree.c b/test_bintree.c new file mode 100644 index 0000000..fbcc0d6 --- /dev/null +++ b/test_bintree.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include "bintree.h" + +// comparator for unsigned int values stored by value in heap +static int cmp_uint_ptr(const void *a, const void *b) +{ + unsigned int va = *(const unsigned int *)a; + unsigned int vb = *(const unsigned int *)b; + if(va < vb) return -1; + if(va > vb) return 1; + return 0; +} + +int main(void) +{ + TreeNode *root = NULL; + unsigned int vals[] = {5, 2, 8, 1, 3, 7, 9}; + const size_t n = sizeof(vals)/sizeof(vals[0]); + + // insert values (copy made by addToTree) + for(size_t i = 0; i < n; i++) + { + int isDup = 0; + root = addToTree(root, &vals[i], sizeof(unsigned int), cmp_uint_ptr, &isDup); + if(root == NULL && isDup == 0) { fprintf(stderr, "addToTree allocation failed\n"); return 1; } + } + + unsigned int sz = treeSize(root); + if(sz != n) { fprintf(stderr, "treeSize expected %zu got %u\n", n, sz); clearTree(root); return 2; } + + // inorder traversal using nextTreeData + unsigned int last = 0; + int first = 1; + unsigned int *data = nextTreeData(root); + while(data != NULL) + { + unsigned int v = *data; + if(!first && v < last) { fprintf(stderr, "inorder traversal not sorted: %u after %u\n", v, last); clearTree(root); return 3; } + last = v; first = 0; + data = nextTreeData(NULL); + } + + clearTree(root); + printf("test_bintree: OK\n"); + return 0; +} diff --git a/test_bintree.dSYM/Contents/Info.plist b/test_bintree.dSYM/Contents/Info.plist new file mode 100644 index 0000000..fe95a38 --- /dev/null +++ b/test_bintree.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.test_bintree + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/test_bintree.dSYM/Contents/Resources/DWARF/test_bintree b/test_bintree.dSYM/Contents/Resources/DWARF/test_bintree new file mode 100644 index 0000000000000000000000000000000000000000..0d498e13b9c8a409d7ea8e4ea2b3cc03cae711f2 GIT binary patch literal 13529 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 literal 0 HcmV?d00001 diff --git a/test_bintree.dSYM/Contents/Resources/Relocations/x86_64/test_bintree.yml b/test_bintree.dSYM/Contents/Resources/Relocations/x86_64/test_bintree.yml new file mode 100644 index 0000000..4fab309 --- /dev/null +++ b/test_bintree.dSYM/Contents/Resources/Relocations/x86_64/test_bintree.yml @@ -0,0 +1,20 @@ +--- +triple: 'x86_64-apple-darwin' +binary-path: test_bintree +relocations: + - { offset: 0x26, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x1000007A0, symSize: 0x220 } + - { offset: 0x49, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x1000007A0, symSize: 0x220 } + - { offset: 0x121, size: 0x8, addend: 0x0, symName: _cmp_uint_ptr, symObjAddr: 0x220, symBinAddr: 0x1000009C0, symSize: 0x5A } + - { offset: 0x21B, size: 0x8, addend: 0x0, symName: _addToTree, symObjAddr: 0x0, symBinAddr: 0x100000A20, symSize: 0x1C0 } + - { offset: 0x228, size: 0x8, addend: 0x0, symName: _nextTreeData, symObjAddr: 0x1C0, symBinAddr: 0x100000BE0, symSize: 0xC0 } + - { offset: 0x24D, size: 0x8, addend: 0x0, symName: _nextTreeData.iterStack, symObjAddr: 0xFB0, symBinAddr: 0x100002000, symSize: 0x0 } + - { offset: 0x2EC, size: 0x8, addend: 0x0, symName: _addToTree, symObjAddr: 0x0, symBinAddr: 0x100000A20, symSize: 0x1C0 } + - { offset: 0x376, size: 0x8, addend: 0x0, symName: _bintree_pushLefts, symObjAddr: 0x280, symBinAddr: 0x100000CA0, symSize: 0x50 } + - { offset: 0x3A8, size: 0x8, addend: 0x0, symName: _clearTree, symObjAddr: 0x2D0, symBinAddr: 0x100000CF0, symSize: 0x60 } + - { offset: 0x3CC, size: 0x8, addend: 0x0, symName: _treeSize, symObjAddr: 0x330, symBinAddr: 0x100000D50, symSize: 0x56 } + - { offset: 0x47F, size: 0x8, addend: 0x0, symName: _push, symObjAddr: 0x0, symBinAddr: 0x100000DB0, symSize: 0x60 } + - { offset: 0x4C3, size: 0x8, addend: 0x0, symName: _push, symObjAddr: 0x0, symBinAddr: 0x100000DB0, symSize: 0x60 } + - { offset: 0x507, size: 0x8, addend: 0x0, symName: _pop, symObjAddr: 0x60, symBinAddr: 0x100000E10, symSize: 0x50 } + - { offset: 0x53D, size: 0x8, addend: 0x0, symName: _top, symObjAddr: 0xB0, symBinAddr: 0x100000E60, symSize: 0x40 } + - { offset: 0x565, size: 0x8, addend: 0x0, symName: _clearStack, symObjAddr: 0xF0, symBinAddr: 0x100000EA0, symSize: 0x3F } +... diff --git a/test_numbers b/test_numbers new file mode 100755 index 0000000000000000000000000000000000000000..f45378c723c03535314225cc102e0e72d95eb6a5 GIT binary patch literal 15552 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 +#include +#include +#include "numbers.h" + +int main(void) +{ + unsigned int len = 100; + unsigned int *nums = createNumbers(len); + if(nums == NULL) { fprintf(stderr, "createNumbers returned NULL\n"); return 1; } + + // count occurrences + unsigned int maxVal = 2 * len; + unsigned int *counts = calloc(maxVal + 1, sizeof(unsigned int)); + if(counts == NULL) { free(nums); return 2; } + + for(unsigned int i = 0; i < len; i++) + { + if(nums[i] > maxVal) { fprintf(stderr, "value out of expected range\n"); free(nums); free(counts); return 3; } + counts[nums[i]]++; + } + + int duplicatesFound = 0; + unsigned int duplicateValue = 0; + for(unsigned int v = 1; v <= maxVal; v++) + { + if(counts[v] == 2) { duplicatesFound++; duplicateValue = v; } + else if(counts[v] > 2) { fprintf(stderr, "value %u appears more than twice\n", v); free(nums); free(counts); return 4; } + } + + if(duplicatesFound != 1) { fprintf(stderr, "expected exactly one duplicated value, found %d\n", duplicatesFound); free(nums); free(counts); return 5; } + + unsigned int found = getDuplicate(nums, len); + if(found != duplicateValue) { fprintf(stderr, "getDuplicate returned %u expected %u\n", found, duplicateValue); free(nums); free(counts); return 6; } + + free(nums); + free(counts); + + printf("test_numbers: OK (duplicate = %u)\n", duplicateValue); + return 0; +} diff --git a/test_numbers.dSYM/Contents/Info.plist b/test_numbers.dSYM/Contents/Info.plist new file mode 100644 index 0000000..3520253 --- /dev/null +++ b/test_numbers.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.test_numbers + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/test_numbers.dSYM/Contents/Resources/DWARF/test_numbers b/test_numbers.dSYM/Contents/Resources/DWARF/test_numbers new file mode 100644 index 0000000000000000000000000000000000000000..1ea4795c12eb343a079f9709ddd12c285a361f31 GIT binary patch literal 14784 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 B3K0MR literal 0 HcmV?d00001 diff --git a/test_numbers.dSYM/Contents/Resources/Relocations/x86_64/test_numbers.yml b/test_numbers.dSYM/Contents/Resources/Relocations/x86_64/test_numbers.yml new file mode 100644 index 0000000..703cd2f --- /dev/null +++ b/test_numbers.dSYM/Contents/Resources/Relocations/x86_64/test_numbers.yml @@ -0,0 +1,24 @@ +--- +triple: 'x86_64-apple-darwin' +binary-path: test_numbers +relocations: + - { offset: 0x26, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x1000013A0, symSize: 0x287 } + - { offset: 0x41, size: 0x8, addend: 0x0, symName: _main, symObjAddr: 0x0, symBinAddr: 0x1000013A0, symSize: 0x287 } + - { offset: 0x12E, size: 0x8, addend: 0x0, symName: _createNumbers, symObjAddr: 0x0, symBinAddr: 0x100001630, symSize: 0x1D0 } + - { offset: 0x152, size: 0x8, addend: 0x0, symName: _createNumbers, symObjAddr: 0x0, symBinAddr: 0x100001630, symSize: 0x1D0 } + - { offset: 0x23E, size: 0x8, addend: 0x0, symName: _compareUInt, symObjAddr: 0x1D0, symBinAddr: 0x100001800, symSize: 0x60 } + - { offset: 0x290, size: 0x8, addend: 0x0, symName: _getDuplicate, symObjAddr: 0x230, symBinAddr: 0x100001860, symSize: 0x110 } + - { offset: 0x2FE, size: 0x8, addend: 0x0, symName: _qsort_uint_cmp, symObjAddr: 0x340, symBinAddr: 0x100001970, symSize: 0x5A } + - { offset: 0x3C5, size: 0x8, addend: 0x0, symName: _addToTree, symObjAddr: 0x0, symBinAddr: 0x1000019D0, symSize: 0x1C0 } + - { offset: 0x3D2, size: 0x8, addend: 0x0, symName: _nextTreeData, symObjAddr: 0x1C0, symBinAddr: 0x100001B90, symSize: 0xC0 } + - { offset: 0x3F7, size: 0x8, addend: 0x0, symName: _nextTreeData.iterStack, symObjAddr: 0xFB0, symBinAddr: 0x100003000, symSize: 0x0 } + - { offset: 0x496, size: 0x8, addend: 0x0, symName: _addToTree, symObjAddr: 0x0, symBinAddr: 0x1000019D0, symSize: 0x1C0 } + - { offset: 0x520, size: 0x8, addend: 0x0, symName: _bintree_pushLefts, symObjAddr: 0x280, symBinAddr: 0x100001C50, symSize: 0x50 } + - { offset: 0x552, size: 0x8, addend: 0x0, symName: _clearTree, symObjAddr: 0x2D0, symBinAddr: 0x100001CA0, symSize: 0x60 } + - { offset: 0x576, size: 0x8, addend: 0x0, symName: _treeSize, symObjAddr: 0x330, symBinAddr: 0x100001D00, symSize: 0x56 } + - { offset: 0x629, size: 0x8, addend: 0x0, symName: _push, symObjAddr: 0x0, symBinAddr: 0x100001D60, symSize: 0x60 } + - { offset: 0x66D, size: 0x8, addend: 0x0, symName: _push, symObjAddr: 0x0, symBinAddr: 0x100001D60, symSize: 0x60 } + - { offset: 0x6B1, size: 0x8, addend: 0x0, symName: _pop, symObjAddr: 0x60, symBinAddr: 0x100001DC0, symSize: 0x50 } + - { offset: 0x6E7, size: 0x8, addend: 0x0, symName: _top, symObjAddr: 0xB0, symBinAddr: 0x100001E10, symSize: 0x40 } + - { offset: 0x70F, size: 0x8, addend: 0x0, symName: _clearStack, symObjAddr: 0xF0, symBinAddr: 0x100001E50, symSize: 0x3F } +... diff --git a/test_stack b/test_stack new file mode 100755 index 0000000000000000000000000000000000000000..fe4df871e6402daa1243626a34c092632ac2d8c9 GIT binary patch literal 9632 zcmeHNU1$_n6uz4ujaIv%wEnb;<8Oa38I2~2&^BtePS9#Fky^!$`!kztvwz*4)ua%* z5G{sa5&GgoTl!GMr=pMcMbXk&C^g_q@M#MbCbWe-h9XVB@7|fsWKE&aQYg&9bMKsc z&iU>+=ibfE-s^+kfBR#p5TSY@L>;)9+#tk7q2Wo0wO|8mnmzjuMNUPIALHmk3M~{D zm56f*hNjsUIoY?+MEY}LKe=)v#>fasl4;u3knIZSYVpd?AQ_B*#DqYUJzqJ{Aj-0L z8`CV>rC6~#REsCV3U7^P;mV%aC-0A(ic~$_w*dM8q)Yv3o-EM?E9 zvI#SlP3EAejqkdPchYsDT#Mny<2qcGI9>bu_L~Qf9qm=CfqE}k2X8&xp5-LdhC`;= zpYtsPb_tC?Vu5NFSXf<&`CVk0G0b)EdZYc?|8%r)j z)>NLmT=^>G0obrMT+617LNK-)n}wJG0Je$f0h89d%ow4T`w!isbO{E_7STM5F%7%| zte1)fJ)Mf_iQ#ktGU+8Sr(ifWAz#Q`!zt&k zYsdk|Qt*?;=*Xl9Us%b|#v_xXd+Wm&wn(AzE}_Qv8kgHAVSGb4H_;&tz=&y!U;)!<2JfK160v{5xuuK2xeY#@Kfb zUvIfAs46Y)D~k`6#eG`vO;A}Nv=^wj{QA%6Q0aHkxf^CY^28YZw)4zASd-lSq#0w_ zC}Sn(HecqPO>`fNRIr>C5x(dyCnuhr-T(t*{B3TsiZRxNM+SvQ1JCRuv*>3ri+1MT zl?C{+P6}-zGRx_w`R)vJKy)_26{v{*b2aEJ#0qcda^q#Ji(v7UR$(!C8O51ZvvYaP8p>O7+e&D=mM=EirbUysRnYRe{G$4uPwT6QRwi!`&+GH}*{DU+>E*(< ziZ*_jB7}X~vBS#|J3qptE5A%`sZhX93hZ_GB9juX$)X2wc3j1QF3mfmY+aE@secA4+= zwzcnT>(IN~%$`DYQ17#%nRc@)7lW1Wu(LHTbo>zjwxyqo7W8B;jZbk=PiORj^!c4T zcE=NY-f!Pi>=;VK+LOr-hO+S;p#H4hr_Udmwpg)U?N+=sC;szP| K#M+U75Pt$v1IVNR literal 0 HcmV?d00001 diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..a89ddd6 --- /dev/null +++ b/test_stack.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include "stack.h" + +int main(void) +{ + StackNode *s = NULL; + + // push 3 integers + int *a = malloc(sizeof(int)); *a = 1; s = push(s, a); + int *b = malloc(sizeof(int)); *b = 2; s = push(s, b); + int *c = malloc(sizeof(int)); *c = 3; s = push(s, c); + + // top should be c (3) + int *topv = (int *)top(s); + if(topv == NULL || *topv != 3) { fprintf(stderr, "stack top expected 3\n"); return 1; } + + // pop -> now top should be 2 + s = pop(s); + topv = (int *)top(s); + if(topv == NULL || *topv != 2) { fprintf(stderr, "stack top expected 2 after pop\n"); return 2; } + + // pop -> now top should be 1 + s = pop(s); + topv = (int *)top(s); + if(topv == NULL || *topv != 1) { fprintf(stderr, "stack top expected 1 after pop\n"); return 3; } + + // pop last + s = pop(s); + if(s != NULL) { fprintf(stderr, "stack expected empty after popping all\n"); return 4; } + + // free stored data (stack does not free data) + free(a); free(b); free(c); + + // test clearStack on empty and small stacks + s = push(s, malloc(sizeof(int))); + s = push(s, malloc(sizeof(int))); + clearStack(s); // clearStack must free nodes but not payload; free payloads not necessary because we leaked intentionally for test of API + // Note: above payloads are not freed (stack API spec); this test ensures clearStack doesn't crash. + // Success + printf("test_stack: OK\n"); + return 0; +} diff --git a/test_stack.dSYM/Contents/Info.plist b/test_stack.dSYM/Contents/Info.plist new file mode 100644 index 0000000..eca9d8f --- /dev/null +++ b/test_stack.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.test_stack + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/test_stack.dSYM/Contents/Resources/DWARF/test_stack b/test_stack.dSYM/Contents/Resources/DWARF/test_stack new file mode 100644 index 0000000000000000000000000000000000000000..aa57c7c2cb3991693f165182bdd66275c603641f GIT binary patch literal 10586 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 literal 0 HcmV?d00001