Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: iri.c Proyecto: BIllli/mget
//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;
}