From e39f1989cf168d6c946ebc809e337a04103db259 Mon Sep 17 00:00:00 2001 From: xamidev <121681048+xamidev@users.noreply.github.com> Date: Sun, 2 Jun 2024 13:32:25 +0200 Subject: [PATCH] Bug fixes, error checking; V1 complete --- .gitignore | 1 + README.md | 12 +++++++++++- hex.c | 33 +++++++++++++++------------------ minihex | Bin 20336 -> 20376 bytes test.txt | 4 ++-- 5 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fb52516 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +minihex diff --git a/README.md b/README.md index 8d62ae0..fcb2f20 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ # minihex -A minimalist, single-file hexadecimal editor written in C with no dependencies (except the standard library). The program tries to be as simple as possible. Many bugs exist. +A minimalist, single-file hexadecimal editor written in less than 100 lines of C with no dependencies (except the standard library). The program tries to be as simple as possible. +Other features might be added in the future. + +## Usage + +``` +make +./minihex +``` + +To get help with the commands, do not provide any filename. diff --git a/hex.c b/hex.c index 3a0866f..91f6f16 100644 --- a/hex.c +++ b/hex.c @@ -1,7 +1,6 @@ #include #include -// TODO: Stop appending garbage at file end // TODO: Skip repeating lines #define BYTES 1024 @@ -13,7 +12,6 @@ void print_hex(unsigned char* buf, int byteno, int pos) { if (i % BYTES_PER_LINE == 0) { - //printf("%03d: ", lineno); if (i != 0) { printf(" "); @@ -26,7 +24,7 @@ void print_hex(unsigned char* buf, int byteno, int pos) puts(""); // Here, we could print positions in hex but I prefer using integers. printf("%04X ", i); if (pos == 0) printf("\x1b[1;34m%06d:\x1b[0m ", i); - else printf("\x1b[34m%06d:\x1b[0m ", pos); + else printf("\x1b[1;34m%06d:\x1b[0m ", pos); } printf("%.2X ", buf[i]); } @@ -58,7 +56,12 @@ int main(int argc, char** argv) return -1; } - FILE* f = fopen(argv[1], "r"); + FILE* f = fopen(argv[1], "rb+"); + if (!f) + { + printf("Error opening file %s\n", argv[1]); + return -1; + } unsigned char buf[BYTES]; int byteno = fread(buf, 1, BYTES, f); print_hex(buf, byteno, 0); @@ -69,31 +72,25 @@ int main(int argc, char** argv) int loc; scanf(" %c", &cmd); - if (cmd == 'p' || cmd == 'P' || cmd == 'e' || cmd == 'E') scanf("%d", &loc); + if (cmd == 'p' || cmd == 'e') scanf("%d", &loc); switch(cmd) { - case 'p': - case 'P': + case 'p': print_hex(buf + loc, BYTES_PER_LINE, loc); break; case 'e': - case 'E': - scanf("%hhx", buf + loc); + int value; + scanf("%x", &value); + if (loc < byteno) buf[loc] = (unsigned char)value; break; case 's': - case 'S': - fclose(f); - f = fopen(argv[1], "w"); - if (!f) { - perror("Error opening file for writing"); - return -1; - } - fwrite(buf, 1, BYTES, f); + fseek(f, 0, SEEK_SET); + fwrite(buf, 1, byteno, f); fclose(f); + return 0; break; case 'q': - case 'Q': return 0; } } diff --git a/minihex b/minihex index 6982c7a3a0b56844086451c484a3e72b72647c29..9a3f1a08089e320272bffcc36ed4f087b630848c 100755 GIT binary patch delta 2826 zcmZWrdr(x@89(RVJ-c^b>=Tw1gk4?|sUU9G-y3c$O`UPoRn!Ttrm zv#Y3oAz&H&0jz&msW^OemY=EwP`%sNsLV>$!R zVK1@3J+rE`hwq$zgp^GSEpnDKJriPGZ2qUfoBA+3<~k(t)gA*Se66RaXji?Vi^54!`ywKovMrBgqL*7d&l% zzlT6{B!WH!&mF!mCD|4DS0oY;z40Z3WWC^6M*|@@;UWgTNI>-9fZ_(LSDlws=BiCSn%a@gi8$ znq0{SBkn5rW-kzIkegJr-g3I(2Kc1Vq=`bL* z&K!_!6z)5bl{x`>4iKMWcTrqbov{~W4}Ab~y&XIM5&b)G>Mh&AK0tG!p$4e{kbXML zZFw$t4cJYtdXS^^b&xN(H-j9bOL$eDOU?s(t05b5FVM?izog7HNgJTfHt9t`J|dD1 z9Hw)R1IwKS&1te?%o%`*=@1tYj^Sf@&RBC5`aTfmpP}^}h!{SVmzgyK7NN|9N??gl zgJ{@KKoW^%B4}kFqvv54d18J+UxEqBYtNc+Gao`+co|8$?|}TdV8M1hP(w&Zfu1V% zAW2*fpdQ1Cx<7zFB`8(aAr-3#_$CGAEiF95Pj?TvEmUdZv&S?$NsfgW&1X36 z%2*IEl*<5`zVVKR5Q`V;=f@yH4E-i(>3alLegcNX(0f5`D=E|Cg2d2tP`jv2(f?c)nL4lWM*#tFEr4s0?REg>XZ zutj|)mJ~uYjzH&LQlL7O#!^W0D%}gAHlrV!UIrd-D2z*Qglug)F)G_Bgf^SLj^6eC zI1dc%4r1r87A9ouSD9(b1`45J7gQ6Y0qByQG5kHbkvuTAJN*c>psc~1# zGPloB?#AS#Y!VH?R4PnJ@*+D5;?$M#`;`ojm-rkxuoN#pU7SEa<(G?hJN0mrq%BPB zV#Y=$30Zb#7~tzlw#4j`4lp|rG_;N_7vuQZl1{5u`X$R6W9$s1gqZatPb*E?m@Ns+FawN{=eEQtB7d9L)Mzkm<#qE+&cr52Fwg z#RNW9`j_ZGpsrQl3XiXf7uff|*U{|{Un&=9_~O%9RG9YiyQ^!38=i1p#SG3JelEQC|P0rEx;13Cm zp0H2W2?Ejbjdi{BV}89hncuIo8lL#KX;@dJw|Z5&HSAlrR-h+&XnnEXRHTA8_;v8+ yidAo(+vMWs`VSi6Z-D^nO#fpwdBsdwLZt`q3? zPo*8n-{bdv-|u|)Jg)D=VS4>}`b-fmpDOlK+X;z?aY9P8(^Bf5R1N>0=1)tXc^ih` zR6BlL`}F!97bf|;SN17mAC&UFayMPiZ^(ZBJ5vTd!&Q@?E=Qj}B+wZ^w+VljkTW79 zSHxCBtXZHvLS7TGGTy`*_#URQ%|k=|L;PL#3g2nY@1lf}QE1F%G)FvreNIBmcdWwQP%vhavjREA*K$K{>Wx5O4Z} zHa>nGr=ai0eskK3g|YW$&jNDgO>m54WY}+Ho!4UcRDXp@1!Ub>sN|#WBs&|U*R&6?LJ^WU@(h%u@hGtaeZsN1|KFO{n1;xe$^s2?JB!6 z^aW1#$jxr8#G79PorKvehm5mtk;D=IUPa1U$FqZ(ye1fNkzoENlHX18dwX|~2qAnb z=#BRD4+SGbec`?*9w+3(f9bmYEB=l_-uS4R8}xypV5_EL%ajz9k^DkH25;)&2yI5`$cMA^_V@lqlKP3hfLNSQkwdN*W~5&44Vi41grGi!ZM5JI?`JV?BVGw241d;irSVuOiR+IpB=~ z*XYmq!HT>`;()C5mVxZ0REE1Ecn0XJfV2raO!2AO?YltkpnnJXpc^~?0sRzmI#M@+ zy_;4-L!C+$AS3hwPpk9?TESlD?*KVL4}ttn;8BoAXclj(^lMANe#}-1wWsJiU~dp} zP1DuDvr+jjAZLi8fWs_-mmn)p0L__7QtX9*$@vhM5q9t+mELrFGx}{H>=S5x6NH1G ztt=|}7%W1W6P3jLz(Gt5U)n@r#R$6CIrM_;G|ygA6}4cGKbKOmF&kt{sVLAh#1PiV zUI48a&dR85HQ5q2Th-Q(nN?e7x=4FFhP#L5phO!u&T2#B*%|O%sphe6(2*6UyPVHZto#0 z(sqd0OeEzfq&66pA4F2`B>7`Nh{L>TTQ_O3;h~k|??ud8`!|tRtC4;l&bEw))X@nd z283!I7`jZla`D_yn|ba=y#y`}`rH<{eI9Hf2Q4YCIk5p-5mHL=7SBNclcdUU8dK_^ zEYEOyQ+lAKV!o?7Bfl6b&3(in7D|dgntC^Rai79DV3@ZMFMqu{t6-IpSs<21ifq(9whh61UPSF##4fuT;iXE2E8`Q97-3H!_2;xDN>1>*+zL!O;^e` zWjAvZ$wb@P1MsPpN5;$tlF zc3nV9d|FRwVs?2Em5%3fcf(3)QcbLF_=qlckxb%hOzuijeF0nUhL5)YKJ_w>H~DG0 zkVQf^3Au*