void
puts(void* buf, const char* string)
{
+ if ((buf == stdout || buf == stderr) && kill_output)
+ return;
+
char* ref = (char*)string;
while (*ref != '\0') {
fflush(void* channel)
{
if (channel == TOP_SCREEN) {
+ if (kill_output)
+ return;
+
for (int y = 0; y < TEXT_TOP_HEIGHT; y++) {
for (int x = 0; x < TEXT_TOP_WIDTH; x++) {
char c = text_buffer_top[y * TEXT_TOP_WIDTH + x];
}
}
} else if (channel == BOTTOM_SCREEN) {
+ if (kill_output)
+ return;
+
for (int y = 0; y < TEXT_BOTTOM_HEIGHT; y++) {
for (int x = 0; x < TEXT_BOTTOM_WIDTH; x++) {
char c = text_buffer_bottom[y * TEXT_BOTTOM_WIDTH + x];
void
vfprintf(void* channel, const char* format, va_list ap)
{
+ if ((channel == stdout || channel == stderr) && kill_output)
+ return;
+
char* ref = (char*)format;
unsigned char* color;
void
fprintf(void* channel, const char* format, ...)
{
+ // The output suppression is in all the functions to minimize overhead.
+ // Function calls and format conversions take time and we don't just want
+ // to stop at putc
+ if ((channel == stdout || channel == stderr) && kill_output)
+ return;
+
va_list ap;
va_start(ap, format);
#define NOT_FOUND patlen
#define max(a, b) ((a < b) ? b : a)
-void
-make_delta1(int* delta1, uint8_t* pat, int32_t patlen)
+// Quick Search algorithm, adapted from
+// http://igm.univ-mlv.fr/~lecroq/string/node19.html#SECTION00190
+uint8_t*
+memfind(uint8_t* startPos, uint32_t size, const void* pattern, uint32_t patternSize)
{
- int i;
- for (i = 0; i < ALPHABET_LEN; i++) {
- delta1[i] = NOT_FOUND;
- }
- for (i = 0; i < patlen - 1; i++) {
- delta1[pat[i]] = patlen - 1 - i;
- }
-}
+ const uint8_t* patternc = (const uint8_t*)pattern;
-int
-is_prefix(uint8_t* word, int wordlen, int pos)
-{
- int i;
- int suffixlen = wordlen - pos;
- // could also use the strncmp() library function here
- for (i = 0; i < suffixlen; i++) {
- if (word[i] != word[pos + i]) {
- return 0;
- }
- }
- return 1;
-}
+ // Preprocessing
+ uint32_t table[ALPHABET_LEN];
-int
-suffix_length(uint8_t* word, int wordlen, int pos)
-{
- int i;
- // increment suffix length i to the first mismatch or beginning
- // of the word
- for (i = 0; (word[pos - i] == word[wordlen - 1 - i]) && (i < pos); i++)
- ;
- return i;
-}
+ for (uint32_t i = 0; i < ALPHABET_LEN; ++i)
+ table[i] = patternSize + 1;
+ for (uint32_t i = 0; i < patternSize; ++i)
+ table[patternc[i]] = patternSize - i;
-void
-make_delta2(int* delta2, uint8_t* pat, int32_t patlen)
-{
- int p;
- int last_prefix_index = patlen - 1;
+ // Searching
+ uint32_t j = 0;
- // first loop
- for (p = patlen - 1; p >= 0; p--) {
- if (is_prefix(pat, patlen, p + 1)) {
- last_prefix_index = p + 1;
- }
- delta2[p] = last_prefix_index + (patlen - 1 - p);
+ while (j <= size - patternSize) {
+ if (memcmp(patternc, startPos + j, patternSize) == 0)
+ return startPos + j;
+ j += table[startPos[j + patternSize]];
}
- // second loop
- for (p = 0; p < patlen - 1; p++) {
- int slen = suffix_length(pat, patlen, p);
- if (pat[p - slen] != pat[patlen - 1 - slen]) {
- delta2[patlen - 1 - slen] = patlen - 1 - p + slen;
- }
- }
-}
-
-uint8_t*
-memfind(uint8_t* string, uint32_t stringlen, uint8_t* pat, uint32_t patlen)
-{
- uint32_t i;
- int delta1[ALPHABET_LEN];
- int delta2[ALPHABET_LEN]; // Max search length is 256.
- make_delta1(delta1, pat, patlen);
- make_delta2(delta2, pat, patlen);
-
- // The empty pattern must be considered specially
- if (patlen == 0)
- return string;
-
- i = patlen - 1;
- while (i < stringlen) {
- int j = patlen - 1;
- while (j >= 0 && (string[i] == pat[j])) {
- --i;
- --j;
- }
- if (j < 0) {
- return (string + i + 1);
- }
-
- i += max(delta1[string[i]], delta2[j]);
- }
return NULL;
}
+