char* android::log_strntok_r(char* s, ssize_t& len, char*& last, ssize_t& sublen) { sublen = 0; if (len <= 0) return nullptr; if (!s) { if (!(s = last)) return nullptr; // fixup for log signature split <, // LESS_THAN_SIG + <digit> if ((*s & SIGNATURE_MASK) == LESS_THAN_SIG) { *s = (*s & ~SIGNATURE_MASK) + '0'; *--s = '<'; ++len; } // fixup for log signature split [, // OPEN_BRACKET_SPACE is space, OPEN_BRACKET_SIG + <digit> if ((*s & SIGNATURE_MASK) == OPEN_BRACKET_SIG) { *s = (*s == OPEN_BRACKET_SPACE) ? ' ' : (*s & ~SIGNATURE_MASK) + '0'; *--s = '['; ++len; } } while ((len > 0) && ((*s == '\r') || (*s == '\n'))) { ++s; --len; } if (len <= 0) return last = nullptr; char *peek, *tok = s; for (;;) { if (len <= 0) { last = nullptr; return tok; } char c = *s++; --len; ssize_t adjust; switch (c) { case '\r': case '\n': s[-1] = '\0'; last = s; return tok; case '<': peek = is_prio(s, len); if (!peek) break; if (s != (tok + 1)) { // not first? s[-1] = '\0'; *s &= ~SIGNATURE_MASK; *s |= LESS_THAN_SIG; // signature for '<' last = s; return tok; } adjust = peek - s; if (adjust > len) { adjust = len; } sublen += adjust; len -= adjust; s = peek; if ((*s == '[') && ((peek = is_timestamp(s + 1, len - 1)))) { adjust = peek - s; if (adjust > len) { adjust = len; } sublen += adjust; len -= adjust; s = peek; } break; case '[': peek = is_timestamp(s, len); if (!peek) break; if (s != (tok + 1)) { // not first? s[-1] = '\0'; if (*s == ' ') { *s = OPEN_BRACKET_SPACE; } else { *s &= ~SIGNATURE_MASK; *s |= OPEN_BRACKET_SIG; // signature for '[' } last = s; return tok; } adjust = peek - s; if (adjust > len) { adjust = len; } sublen += adjust; len -= adjust; s = peek; break; } ++sublen; } // NOTREACHED }
char *log_strntok_r(char *s, size_t *len, char **last, size_t *sublen) { *sublen = 0; if (!*len) { return NULL; } if (!s) { if (!(s = *last)) { return NULL; } // fixup for log signature split <, // LESS_THAN_SIG + <digit> if ((*s & SIGNATURE_MASK) == LESS_THAN_SIG) { *s = (*s & ~SIGNATURE_MASK) + '0'; *--s = '<'; ++*len; } // fixup for log signature split [, // OPEN_BRACKET_SPACE is space, OPEN_BRACKET_SIG + <digit> if ((*s & SIGNATURE_MASK) == OPEN_BRACKET_SIG) { if (*s == OPEN_BRACKET_SPACE) { *s = ' '; } else { *s = (*s & ~SIGNATURE_MASK) + '0'; } *--s = '['; ++*len; } } while (*len && ((*s == '\r') || (*s == '\n'))) { ++s; --*len; } if (!*len) { *last = NULL; return NULL; } char *peek, *tok = s; for (;;) { if (*len == 0) { *last = NULL; return tok; } char c = *s++; --*len; size_t adjust; switch (c) { case '\r': case '\n': s[-1] = '\0'; *last = s; return tok; case '<': peek = is_prio(s, *len); if (!peek) { break; } if (s != (tok + 1)) { // not first? s[-1] = '\0'; *s &= ~SIGNATURE_MASK; *s |= LESS_THAN_SIG; // signature for '<' *last = s; return tok; } adjust = peek - s; if (adjust > *len) { adjust = *len; } *sublen += adjust; *len -= adjust; s = peek; if ((*s == '[') && ((peek = is_timestamp(s + 1, *len - 1)))) { adjust = peek - s; if (adjust > *len) { adjust = *len; } *sublen += adjust; *len -= adjust; s = peek; } break; case '[': peek = is_timestamp(s, *len); if (!peek) { break; } if (s != (tok + 1)) { // not first? s[-1] = '\0'; if (*s == ' ') { *s = OPEN_BRACKET_SPACE; } else { *s &= ~SIGNATURE_MASK; *s |= OPEN_BRACKET_SIG; // signature for '[' } *last = s; return tok; } adjust = peek - s; if (adjust > *len) { adjust = *len; } *sublen += adjust; *len -= adjust; s = peek; break; } ++*sublen; } // NOTREACHED }
char *log_strtok_r(char *s, char **last) { if (!s) { if (!(s = *last)) { return NULL; } // fixup for log signature split <, // LESS_THAN_SIG + <digit> if ((*s & SIGNATURE_MASK) == LESS_THAN_SIG) { *s = (*s & ~SIGNATURE_MASK) + '0'; *--s = '<'; } // fixup for log signature split [, // OPEN_BRACKET_SPACE is space, OPEN_BRACKET_SIG + <digit> if ((*s & SIGNATURE_MASK) == OPEN_BRACKET_SIG) { if (*s == OPEN_BRACKET_SPACE) { *s = ' '; } else { *s = (*s & ~SIGNATURE_MASK) + '0'; } *--s = '['; } } s += strspn(s, "\r\n"); if (!*s) { // no non-delimiter characters *last = NULL; return NULL; } char *peek, *tok = s; for (;;) { char c = *s++; switch (c) { case '\0': *last = NULL; return tok; case '\r': case '\n': s[-1] = '\0'; *last = s; return tok; case '<': peek = is_prio(s); if (!peek) { break; } if (s != (tok + 1)) { // not first? s[-1] = '\0'; *s &= ~SIGNATURE_MASK; *s |= LESS_THAN_SIG; // signature for '<' *last = s; return tok; } s = peek; if ((*s == '[') && ((peek = is_timestamp(s + 1)))) { s = peek; } break; case '[': peek = is_timestamp(s); if (!peek) { break; } if (s != (tok + 1)) { // not first? s[-1] = '\0'; if (*s == ' ') { *s = OPEN_BRACKET_SPACE; } else { *s &= ~SIGNATURE_MASK; *s |= OPEN_BRACKET_SIG; // signature for '[' } *last = s; return tok; } s = peek; break; } } // NOTREACHED }