示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
	}
}
示例#4
0
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);
}