static struct dirent *get_dirent(char *filepath, struct fat_part_desc *desc, int current_cluster, int dircount) { struct dirent *dir, *ret; char cl[desc->bootrecord.spc * desc->bootrecord.bps]; char *ptr, *name; name = filepath + 1; ptr = kstrchr(name, '/'); while (ptr != NULL) { *ptr = 0; dir = search_dir(name, desc, current_cluster, dircount, cl); if (dir != NULL) { name = ptr + 1; *ptr = '/'; ptr = kstrchr(name, '/'); current_cluster = (dir->cluster_hi << 16) | dir->cluster_lo; } else { /* file does not exist! */ *ptr = '/'; return 0; } } /* check current directory for 'name' */ dir = search_dir(name, desc, current_cluster, dircount, cl); if (dir == NULL) return NULL; ret = kmalloc(sizeof(struct dirent)); kmemcpy(ret, dir, sizeof(struct dirent)); return ret; }
static char *get_filename(struct dirent *d, char buffer[255]) { int i, ret = 0; char *ptr; struct dirent_long *dl = (struct dirent_long *)d; /* make sure we actually have long entries */ if ((dl - 1)->attr != DENT_LONG) { kstrcpy(buffer, d->filename); if ((ptr = kstrchr(buffer, 0x20)) < &buffer[10]) *ptr = 0; return buffer; } do { --dl; for (i = 0; i < 5 && dl->filename_1[i] != 0; ++i) buffer[ret++] = (char)dl->filename_1[i]; if (i < 5 && dl->filename_1[i] == 0) break; for (i = 0; i < 6 && dl->filename_2[i] != 0; ++i) buffer[ret++] = (char)dl->filename_2[i]; if (i < 6 && dl->filename_2[i] == 0) break; for (i = 0; i < 2 && dl->filename_3[i] != 0; ++i) buffer[ret++] = (char)dl->filename_3[i]; if (i < 2 && dl->filename_2[i] == 0) break; } while (!(dl->order & 0x40)); buffer[ret] = 0; return buffer; }
int vt100_parse(const char* vt100_seq) { #ifdef VT100_SUPPORT char* s = (char *)vt100_seq; char *last, *q; int val, bright = 0, back, fore; /* is valid esc seq ? */ if (*(unsigned short*)s != 0x5b1b) return 0; s += 2; for(;;) { last = 0; q = 0; if ((q = kstrchr(s, ';')) || (last = kstrchr(s, 'm'))) { val = atoi(s); if (val == 0 && last) { /* reset */ console_unset_char_color(); return sz_reset_seq; } if (val < 10) { /* attr */ if (val == 1) bright = 1; } else if (val >=30 && val <= 39) { /* fore */ fore = val; } else { back = val; } if (last) { set_terminal_color(fore, back, bright); return ((last + 1) - vt100_seq); } else { s = q + 1; } } else { /* invalid seq */ return 0; } } #else return 0; #endif }
int countwords(char *s, char *sep) { int i; int words; words = 0; i = 0; while (s[i]) { if (i == 0 && !(kstrchr(sep, s[i]))) words++; else if (i > 0 && !(kstrchr(sep, s[i])) && kstrchr(sep, s[i - 1])) words++; i++; } return (words); }
/* supported formats: %%, %d, %u, %x, %p, %s, %c * TODO: * - return number of bytes copied into 'str' */ int kvsprintf(char *str, const char *fmt, va_list ap) { char *ptr, *stmp; unsigned utmp; int itmp; char ctmp; for (; *fmt; fmt = ptr + 2) { ptr = kstrchr(fmt, '%'); if (ptr == NULL) { kstrcpy(str, fmt); return 1; } str += kstrncpy(str, fmt, (int)ptr - (int)fmt); switch (*(ptr + 1)) { case 'd': /* signed int */ itmp = va_arg(ap, int); str = sitoa(str, itmp); break; case 'u': /* unsigned int */ utmp = va_arg(ap, unsigned); str = uitoa(str, utmp); break; case 'p': /* pointer */ *str++ = '0'; *str++ = 'x'; case 'x': /* hex */ utmp = va_arg(ap, unsigned); str = htoa(str, utmp); break; case 's': /* string */ stmp = va_arg(ap, char *); str += kstrcpy(str, stmp); break; case '%': *str++ = '%'; break; case 'c': ctmp = va_arg(ap, int); *str++ = ctmp; break; default: /* unsupported format */ break; } } return 1; }
int kstrcspn(char* str1, char* str2) { int i = 0; int len = 0; if (!str1 || !str2) return -1; len = kstrlen(str1); while (len--) { if (kstrchr(str2, str1[i])) return i; i++; } return -1; }
char* kstrpbrk(char* str1, char* str2) { int i = 0; int len = 0; if (!str1 || !str2) return 0; len = kstrlen(str1); while(len--) { if (kstrchr(str2, str1[i])) return &str1[i]; i++; } return 0; }
static int toggle_dbgmsg(char * cfg) { struct _kerror_dyndebug_msg * msg_opt = &__start_set_debug_msg_sect; struct _kerror_dyndebug_msg * stop = &__stop_set_debug_msg_sect; char strbuf[DD_MAX_LINE]; char * file = strbuf; char * line; if (msg_opt == stop) return -EINVAL; if (cfg[0] == '*') { /* Match all */ file = NULL; line = NULL; } else { /* Match specfic file */ strlcpy(strbuf, cfg, sizeof(strbuf)); file = strbuf; line = kstrchr(strbuf, ':'); if (line) { /* Match line number */ line[0] = '\0'; line++; } } while (msg_opt < stop) { if (file) { if (strcmp(file, msg_opt->file) != 0) goto next; if (line && *line != '\0') { char msgline[12]; uitoa32(msgline, msg_opt->line); if (strcmp(line, msgline) != 0) goto next; } } /* Toggle */ msg_opt->flags ^= 1; next: msg_opt++; } return 0; }