void btos_open_std_streams(){ if(std_streams_open) return; char buffer[BT_MAX_PATH]; size_t s=bt_getenv("STDIN", buffer, BT_MAX_PATH); if(s){ bt_handle input=bt_fopen(buffer, FS_Read); btos_set_specific_filenum(0, input, buffer); }else{ btos_set_specific_filenum_virt(0, &null_virt_handle); } memset(buffer, 0, BT_MAX_PATH); s=bt_getenv("STDOUT", buffer, BT_MAX_PATH); if(s){ bt_handle output=bt_fopen(buffer, FS_Write | FS_AtEnd); btos_set_specific_filenum(1, output, buffer); }else{ btos_set_specific_filenum_virt(1, &null_virt_handle); } memset(buffer, 0, BT_MAX_PATH); s=bt_getenv("STDERR", buffer, BT_MAX_PATH); if(s){ bt_handle output=bt_fopen(buffer, FS_Write | FS_AtEnd); btos_set_specific_filenum(2, output, buffer); }else{ btos_set_specific_filenum_virt(2, &null_virt_handle); } std_streams_open = true; }
bool btos_path_parse(const char *opath, char *buffer, size_t size){ char *path = calloc(BT_MAX_PATH, 1); if(!path) return false; if(btos_path_is_absolute(opath)){ strncpy(path, opath, BT_MAX_PATH); }else{ if(opath[0]=='/'){ char cwd[BT_MAX_PATH]; bt_getenv("CWD", cwd, BT_MAX_PATH); size_t drive_end=btos_get_drive_end(cwd); strncpy(path, cwd, drive_end); strncpy(&path[strlen(path)], ":", BT_MAX_PATH-strlen(path)); strncpy(&path[strlen(path)], opath, BT_MAX_PATH-strlen(path)); }else{ bt_getenv("CWD", path, BT_MAX_PATH); strncpy(&path[strlen(path)], "/", BT_MAX_PATH-strlen(path)); strncpy(&path[strlen(path)], opath, BT_MAX_PATH-strlen(path)); } } char *c; bool has_drive=false; memset(buffer, 0, size); size_t bpos=0, ipos=0, cstart=0; for(c=path; (ipos==0 || *(c - 1)) && bpos < size; ++c, ++ipos){ if(*c==':'){ if(!has_drive && ipos){ buffer[bpos++]=':'; buffer[bpos++]='/'; cstart=bpos; has_drive=true; }else{ free(path); return false; } }else if(*c=='/' || *c=='\n' || *c=='\0'){ char cstr[BT_MAX_SEGLEN]={0}; if((int)(bpos-cstart) > 0) strncpy(cstr, &buffer[cstart], bpos-cstart); if(strlen(cstr) && strcmp(cstr, "..")==0){ buffer[--bpos]='\0'; buffer[--bpos]='\0'; if(bpos-2 > 0 && buffer[bpos-2] != ':'){ buffer[--bpos]='\0'; while(bpos && buffer[bpos]!='/') buffer[bpos--]='\0'; buffer[bpos++]='/'; } cstart=bpos; }else if(strlen(cstr) && strcmp(cstr, ".")==0){ buffer[--bpos]='\0'; cstart=bpos; }else if(strlen(cstr) && *c!='\n' && *c!='\0'){ buffer[bpos++]='/'; cstart=bpos; } }else buffer[bpos++]=*c; } if(bpos > 1 && buffer[bpos-1]=='/' && buffer[bpos-2] != ':') buffer[bpos-1]='\0'; free(path); return true; }
void get_string(char *buffer, size_t bytes){ if(!bt_stdin){ if(!bt_getenv("INPUT_DEVICE", &bt_stdin_device[5], 250)) return; bt_stdin=bt_fopen(bt_stdin_device, FS_Read); } size_t pos=bt_fseek(bt_stdout, 0, true); size_t i=0; char x[2]={'a', '\0'}; uint32_t c; while(true){ bt_fread(bt_stdin, sizeof(c), (char*)&c); x[0]=KB_char(c); if(x[0]==0x08){ if(i>0) buffer[--i]=0; }else if(x[0]) buffer[i++]=x[0]; if(x[0]=='\n' || i==bytes){ print_string("\n"); return; } bt_fseek(bt_stdout, pos, false); print_string(buffer); size_t newpos=bt_fseek(bt_stdout, 0, true); print_string(" "); bt_fseek(bt_stdout, newpos, false); } }
void print_string(const char *s){ if(!bt_stdout){ if(!bt_getenv("DISPLAY_DEVICE", &bt_stdout_device[5], 250)) return; bt_stdout=bt_fopen(bt_stdout_device, FS_Write); } bt_fwrite(bt_stdout, strlen(s), s); }