1 /* hexedit -- Hexadecimal Editor for Binary Files
2 Copyright (C) 1998 Pixel (Pascal Rigaux)
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/
20 int LSEEK_(int fd
, INT where
)
24 result
= lseek(fd
, where
, SEEK_SET
);
25 return (result
== where
) ? 1 : -1;
28 void LSEEK(int fd
, INT where
)
32 result
= lseek(fd
, where
, SEEK_SET
);
33 if (result
!= where
) {
35 fprintf(stderr
, "the long seek failed (%lld instead of %lld), leaving :(\n", (long long) result
, (long long) where
);
40 /*******************************************************************************/
41 /* Functions provided for OSs that don't have them */
42 /*******************************************************************************/
44 char *basename(char *file
) {
45 char *p
= strrchr(file
, '/');
46 return p
? p
+ 1 : file
;
51 char *strerror(int errnum
) {
52 extern char *sys_errlist
[];
55 if (errnum
> 0 && errnum
<= sys_nerr
)
56 return sys_errlist
[errnum
];
57 return _("Unknown system error");
62 char *strdup(const char *str
)
64 size_t len
= strlen(str
) + 1;
65 void *new = malloc(len
);
66 if (new == NULL
) return NULL
;
68 return (char *) bcopy(str
, new, len
);
72 /*******************************************************************************/
73 /* Small common functions */
74 /*******************************************************************************/
75 int streq(const char *s1
, const char *s2
) { return strcmp(s1
, s2
) == 0; }
76 INT
myfloor(INT a
, INT b
) { return a
- a
% b
; }
77 int setLowBits(int p
, int val
) { return (p
& 0xF0) + val
; }
78 int setHighBits(int p
, int val
) { return (p
& 0x0F) + val
* 0x10; }
80 int strbeginswith(const char *a
, const char *prefix
)
82 return strncmp(a
, prefix
, strlen(prefix
)) == 0;
85 char *strconcat3(char *a
, char *b
, char *c
)
87 size_t la
= a
? strlen(a
) : 0;
88 size_t lb
= b
? strlen(b
) : 0;
89 size_t lc
= c
? strlen(c
) : 0;
90 char *p
= malloc(la
+ lb
+ lc
+ 1);
91 if (a
) memcpy(p
, a
, la
);
92 if (b
) memcpy(p
+ la
, b
, lb
);
93 if (c
) memcpy(p
+ la
+ lb
, c
, lc
);
94 p
[la
+ lb
+ lc
] = '\0';
98 int hexCharToInt(int c
)
100 if (isdigit(c
)) return c
- '0';
101 return tolower(c
) - 'a' + 10;
104 int not(int b
) { return b
? FALSE
: TRUE
; }
107 void *memrchr(const void *s
, int c
, size_t n
)
111 for (i
= n
- 1; i
>= 0; i
--) if (cs
[i
] == c
) return (void *) &cs
[i
];
116 char *mymemmem(char *a
, int sizea
, char *b
, int sizeb
)
119 return memmem(a
, sizea
, b
, sizeb
);
122 int i
= sizea
- sizeb
+ 1;
124 for (; (p
= memchr(a
, b
[0], i
)); i
-= p
- a
+ 1, a
= p
+ 1)
126 if ((memcmp(p
+ 1, b
+ 1, sizeb
- 1)) == 0) {
134 char *mymemrmem(char *a
, int sizea
, char *b
, int sizeb
)
137 return memrmem(a
, sizea
, b
, sizeb
);
140 int i
= sizea
- sizeb
+ 1;
143 for (; (p
= memrchr(a
- i
+ 1, b
[sizeb
- 1], i
)); i
-= a
- p
+ 1, a
= p
- 1)
145 if ((memcmp(p
- sizeb
+ 1, b
, sizeb
- 1)) == 0) return p
;
152 int hexStringToBinString(char *p
, int *l
)
156 for (i
= 0; i
< *l
; i
++) {
157 if (!isxdigit(p
[i
])) {
158 displayMessageAndWaitForKey("Invalid hexa string");
161 p
[i
/ 2] = ((i
% 2) ? setLowBits
: setHighBits
)(p
[i
/ 2], hexCharToInt(p
[i
]));
165 displayMessageAndWaitForKey("Must be an even number of chars");