int32 open_file (char *file_name, int32 create_if_not_exist) { int32 len, i_parent_dir_no, i_file_name_start, i_dot_index; directory *_p_directory_node; char _tmp_filename[I_NAME_LEN + I_EXT_LEN + 1]; if ((len = _normalize_path (file_name)) <= 0) return E_INVALID_PARAM; DESTROY_SUPER_PAGE (); _p_directory_node = (directory *)g_buffer_directory; if ((i_parent_dir_no = _get_parent_directory_value_by_path_name (file_name, _p_directory_node)) < 0) return i_parent_dir_no; i_file_name_start = MAX (0, my_str_rpos ("/", file_name, 1, len)) + 1; if (len - i_file_name_start > I_NAME_LEN + I_EXT_LEN + 1) return E_INVALID_PARAM; my_strncpy (file_name + i_file_name_start, _tmp_filename, len - i_file_name_start); i_parent_dir_no = _get_child_directory_by_name (i_parent_dir_no, _tmp_filename, len - i_file_name_start, TYPE_FILE, _p_directory_node); if (PAGE_NULL == i_parent_dir_no) { if (!create_if_not_exist) return E_NO_FILE; if ((i_parent_dir_no = _find_fist_idle_directory (1)) < 0) return i_parent_dir_no; i_dot_index = my_str_rpos (".", file_name, 1, len - i_file_name_start); my_memset (_p_directory_node, NULL, sizeof (directory)); my_strncpy (_p_directory_node->name, file_name + i_file_name_start, MIN(I_NAME_LEN, i_dot_index - i_file_name_start)); my_strncpy (_p_directory_node->extension, file_name + i_dot_index, MIN(I_EXT_LEN, len - i_dot_index - 1)); NODE_MARK_TYPE_P (_p_directory_node, TYPE_FILE); NODE_MARK_USED_P (_p_directory_node); _p_directory_node->sibling = _p_directory_node->first_child_lastpage = _p_directory_node->first_data_page; _p_directory_node->create_datetime = _get_current_datetime (); if ((len = _write_directory_node_value (i_parent_dir_no, _p_directory_node)) < 0) return len; } return i_parent_dir_no; }
//char *iri_relative_to_absolute(IRI *iri, const char *tag, const char *val, size_t len, char *dst, size_t dst_size) const char *mget_iri_relative_to_abs(mget_iri_t *base, const char *val, size_t len, mget_buffer_t *buf) { debug_printf("*url = %.*s\n", (int)len, val); if (*val == '/') { if (base) { char path[len + 1]; strlcpy(path, val, len + 1); if (len >= 2 && val[1] == '/') { char *p; // absolute URI without scheme: //authority/path... if ((p = strchr(path + 2, '/'))) _normalize_path(p + 1); mget_buffer_strcpy(buf, base->scheme); mget_buffer_strcat(buf, ":"); mget_buffer_strcat(buf, path); debug_printf("*1 %s\n", buf->data); } else { // absolute path _normalize_path(path); mget_buffer_strcpy(buf, mget_iri_get_connection_part(base)); mget_buffer_strcat(buf, "/"); mget_buffer_strcat(buf, path); debug_printf("*2 %s\n", buf->data); } } else return NULL; } else { // see if URI begins with a scheme: if (memchr(val, ':', len)) { // absolute URI if (buf) { mget_buffer_memcpy(buf, val, len); debug_printf("*3 %s\n", buf->data); } else { debug_printf("*3 %s\n", val); return val; } } else if (base) { // relative path const char *lastsep = base->path ? strrchr(base->path, '/') : NULL; mget_buffer_strcpy(buf, mget_iri_get_connection_part(base)); mget_buffer_strcat(buf, "/"); size_t tmp_len = buf->length; if (lastsep) mget_buffer_memcat(buf, base->path, lastsep - base->path + 1); if (len) mget_buffer_memcat(buf, val, len); buf->length = _normalize_path(buf->data + tmp_len) + tmp_len; debug_printf("*4 %s %zu\n", buf->data, buf->length); } else if (val[len] == 0) { return val; } else return NULL; } return buf->data; }