亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? relative-path.c

?? xen source 推出最新的VHD操作工具VHD-UTIL 實(shí)現(xiàn)源碼,超強(qiáng)
?? C
字號(hào):
/* Copyright (c) 2008, XenSource Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of XenSource Inc. nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

#include "relative-path.h"

#define sfree(ptr)         \
do {                       \
	free(ptr);         \
	ptr = NULL;        \
} while (0)

/*
 * count number of tokens between DELIMETER characters
 */
static int
count_nodes(char *path)
{
	int i;
	char *tmp;

	if (!path)
		return 0;

	for (i = 0, tmp = path; *tmp != '\0'; tmp++)
		if (*tmp == DELIMITER)
			i++;

	return i;
}

/*
 * return copy of next node in @path, or NULL
 * @path is moved to the end of the next node
 * @err is set to -errno on failure
 * copy should be freed
 */
static char *
next_node(char **path, int *err)
{
	int ret;
	char *tmp, *start;

	if (!path || !*path) {
		*err = -EINVAL;
		return NULL;
	}

	*err  = 0;
	start = *path;

	for (tmp = *path; *tmp != '\0'; tmp++)
		if (*tmp == DELIMITER) {
			int size;
			char *node;

			size = tmp - start + 1;
			node = malloc(size);
			if (!node) {
				*err = -ENOMEM;
				return NULL;
			}

			ret = snprintf(node, size, "%s", start);
			if (ret < 0) {
				free(node);
				*err = -EINVAL;
				return NULL;
			}

			*path = tmp;
			return node;
		}

	return NULL;
}

/*
 * count number of nodes in common betwee @to and @from
 * returns number of common nodes, or -errno on failure
 */
static int
count_common_nodes(char *to, char *from)
{
	int err, common;
	char *to_node, *from_node;

	if (!to || !from)
		return -EINVAL;

	err       = 0;
	common    = 0;
	to_node   = NULL;
	from_node = NULL;

	do {
		to_node = next_node(&to, &err);
		if (err || !to_node)
			break;

		from_node = next_node(&from, &err);
		if (err || !from_node)
			break;

		if (strncmp(to_node, from_node, MAX_NAME_LEN))
			break;

		++to;
		++from;
		++common;
		sfree(to_node);
		sfree(from_node);

	} while (1);

	sfree(to_node);
	sfree(from_node);

	if (err)
		return err;

	return common;
}

/*
 * construct path of @count '../', './' if @count is zero, or NULL on error
 * result should be freed
 */
static char *
up_nodes(int count)
{
	char *path, *tmp;
	int i, ret, len, size;

	if (!count)
		return strdup("./");

	len  = strlen("../");
	size = len * count;
	if (size >= MAX_NAME_LEN)
		return NULL;

	path = malloc(size + 1);
	if (!path)
		return NULL;

	tmp = path;
	for (i = 0; i < count; i++) {
		ret = sprintf(tmp, "../");
		if (ret < 0 || ret != len) {
			free(path);
			return NULL;
		}
		tmp += ret;
	}

	return path;
}

/*
 * return pointer to @offset'th node of path or NULL on error
 */
static char *
node_offset(char *from, int offset)
{
	char *path;

	if (!from || !offset)
		return NULL;

	for (path = from; *path != '\0'; path++) {
		if (*path == DELIMITER)
			if (--offset == 0)
				return path + 1;
	}

	return NULL;
}

/*
 * return a relative path from @from to @to
 * result should be freed
 */
char *
relative_path_to(char *from, char *to, int *err)
{
	int from_nodes, common;
	char *to_absolute, *from_absolute;
	char *up, *common_target_path, *relative_path;

	*err          = 0;
	up            = NULL;
	to_absolute   = NULL;
	from_absolute = NULL;
	relative_path = NULL;

	if (strnlen(to, MAX_NAME_LEN)   == MAX_NAME_LEN ||
	    strnlen(from, MAX_NAME_LEN) == MAX_NAME_LEN) {
		EPRINTF("invalid input; max path length is %d\n",
			MAX_NAME_LEN);
		*err = -ENAMETOOLONG;
		return NULL;
	}

	to_absolute = realpath(to, NULL);
	if (!to_absolute) {
		EPRINTF("failed to get absolute path of %s\n", to);
		*err = -errno;
		goto out;
	}

	from_absolute = realpath(from, NULL);
	if (!from_absolute) {
		EPRINTF("failed to get absolute path of %s\n", from);
		*err = -errno;
		goto out;
	}

	if (strnlen(to_absolute, MAX_NAME_LEN)   == MAX_NAME_LEN ||
	    strnlen(from_absolute, MAX_NAME_LEN) == MAX_NAME_LEN) {
		EPRINTF("invalid input; max path length is %d\n",
			MAX_NAME_LEN);
		*err = -ENAMETOOLONG;
		goto out;
	}

	/* count nodes in source path */
	from_nodes = count_nodes(from_absolute);

	/* count nodes in common */
	common = count_common_nodes(to_absolute + 1, from_absolute + 1);
	if (common < 0) {
		EPRINTF("failed to count common nodes of %s and %s: %d\n",
			to_absolute, from_absolute, common);
		*err = common;
		goto out;
	}

	/* move up to common node */
	up = up_nodes(from_nodes - common - 1);
	if (!up) {
		EPRINTF("failed to allocate relative path for %s: %d\n",
			from_absolute, -ENOMEM);
		*err = -ENOMEM;
		goto out;
	}

	/* get path from common node to target */
	common_target_path = node_offset(to_absolute, common + 1);
	if (!common_target_path) {
		EPRINTF("failed to find common target path to %s: %d\n",
			to_absolute, -EINVAL);
		*err = -EINVAL;
		goto out;
	}

	/* get relative path */
	if (asprintf(&relative_path, "%s%s", up, common_target_path) == -1) {
		EPRINTF("failed to construct final path %s%s: %d\n",
			up, common_target_path, -ENOMEM);
		relative_path = NULL;
		*err = -ENOMEM;
		goto out;
	}

out:
	sfree(up);
	sfree(to_absolute);
	sfree(from_absolute);

	return relative_path;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品中文在线观看| 国产偷v国产偷v亚洲高清 | 欧美国产综合一区二区| 韩国女主播一区二区三区| 久久精品亚洲精品国产欧美kt∨ | 日韩一级高清毛片| 国产一区二区网址| 国产精品久久久久久久久图文区 | 亚洲高清视频中文字幕| 日韩一区二区免费电影| 国产风韵犹存在线视精品| 综合久久久久久| 欧美日韩国产一区二区三区地区| 日韩不卡手机在线v区| 精品国产免费人成在线观看| 成人性视频网站| 亚洲成人自拍一区| 久久色.com| 在线观看欧美黄色| 精品亚洲成a人| 一区视频在线播放| 欧美一区二区在线免费播放| 高清不卡一区二区| 亚洲午夜视频在线观看| 国产亚洲一区二区在线观看| 色婷婷久久久亚洲一区二区三区 | 韩国欧美国产一区| 亚洲视频网在线直播| 日韩欧美在线不卡| 91麻豆精品在线观看| 美女视频黄a大片欧美| 亚洲欧洲另类国产综合| 日韩三区在线观看| 91亚洲精品久久久蜜桃网站| 麻豆精品在线视频| 亚洲女女做受ⅹxx高潮| 久久人人超碰精品| 欧美高清视频一二三区 | 精品无码三级在线观看视频| 亚洲一区二区三区影院| 中文字幕乱码亚洲精品一区| 日韩一卡二卡三卡四卡| 日本精品裸体写真集在线观看| 韩国av一区二区| 日韩一区欧美二区| 一区二区三区四区激情| 国产欧美精品区一区二区三区 | 久久久久9999亚洲精品| 欧美精品一卡二卡| 色综合久久久网| 国产在线视频一区二区| 午夜免费久久看| 一区二区三区四区在线免费观看| 中文字幕欧美激情| 久久久久国产一区二区三区四区| 欧美日韩三级视频| 91成人国产精品| 不卡av免费在线观看| 国产麻豆成人传媒免费观看| 久久精品国产一区二区三区免费看| 亚洲成人av资源| 一区二区在线免费| 亚洲最新在线观看| 亚洲美女电影在线| 亚洲精品免费在线| 亚洲精品成a人| 亚洲免费在线视频一区 二区| 国产精品污污网站在线观看| 国产日韩亚洲欧美综合| 久久久久国产精品麻豆ai换脸| 精品99一区二区三区| 欧美videossexotv100| 日韩精品一区二区三区老鸭窝| 日韩欧美一区中文| 欧美精品一区二区三区蜜桃视频| 日韩精品一区二| 久久精品夜夜夜夜久久| 国产精品久久久久四虎| 中文字幕一区免费在线观看| 亚洲日本成人在线观看| 一级精品视频在线观看宜春院| 亚洲一区二区三区三| 午夜精品久久一牛影视| 亚洲a一区二区| 免费人成在线不卡| 狠狠色丁香久久婷婷综| 成人免费三级在线| 色婷婷av一区| 91精品免费在线观看| 久久先锋影音av鲁色资源网| 中文字幕的久久| 亚洲已满18点击进入久久| 亚洲6080在线| 国产在线一区观看| 99久久精品免费观看| 欧美性猛交xxxxxx富婆| 91精品国产全国免费观看| 精品国产百合女同互慰| 中文字幕在线免费不卡| 丝袜诱惑亚洲看片| 国产裸体歌舞团一区二区| 99国产精品国产精品毛片| 欧美另类久久久品| 久久色在线视频| 亚洲精品国产无天堂网2021| 美女脱光内衣内裤视频久久网站 | 久久不见久久见中文字幕免费| 国产乱人伦偷精品视频不卡 | 97精品久久久久中文字幕| 色一情一伦一子一伦一区| 91麻豆swag| 欧美在线不卡视频| 精品人在线二区三区| 国产精品视频麻豆| 国产精品乱子久久久久| 亚洲欧美激情小说另类| 麻豆中文一区二区| 亚洲激情综合网| 成人18精品视频| 国产精品三级av在线播放| 国产乱码精品1区2区3区| 精品久久久久香蕉网| 日本vs亚洲vs韩国一区三区| 欧美日韩国产中文| 午夜欧美2019年伦理| 欧美日韩亚洲综合| 亚洲h动漫在线| 欧美另类久久久品| 日韩avvvv在线播放| 欧美精品自拍偷拍动漫精品| 丝袜国产日韩另类美女| 在线观看91av| 日本欧美在线看| 日韩欧美二区三区| 国产一区二区三区综合| 2023国产精品| 成人免费视频国产在线观看| 国产精品毛片久久久久久| 99这里都是精品| 亚洲色图在线看| 欧美午夜片在线看| 香蕉成人伊视频在线观看| 91精品国产乱| 国产主播一区二区| 久久精品网站免费观看| 97久久超碰精品国产| 亚洲综合免费观看高清完整版 | 久久久91精品国产一区二区精品 | 秋霞影院一区二区| 精品国产一区二区三区四区四| 国产一区二区三区香蕉| 国产欧美综合在线| 色婷婷亚洲综合| 日韩精品欧美精品| 久久久国产精品麻豆| 97久久人人超碰| 午夜精品123| 久久蜜桃香蕉精品一区二区三区| 成人一道本在线| 婷婷国产v国产偷v亚洲高清| 精品美女被调教视频大全网站| 高清av一区二区| 亚洲第一主播视频| 国产亚洲一区二区三区在线观看| 91免费看视频| 日本不卡中文字幕| 中文字幕精品三区| 欧美日韩精品电影| 国产91精品入口| 性感美女久久精品| 欧美国产成人在线| 91精品国产免费| www.亚洲人| 七七婷婷婷婷精品国产| 国产精品久久久一本精品 | 免费视频一区二区| 国产精品久久久久久久岛一牛影视 | 久久久久久久久久久久久久久99| 91在线一区二区| 毛片av中文字幕一区二区| 亚洲摸摸操操av| 欧美精品一区二区三区蜜臀| 色欧美乱欧美15图片| 麻豆成人av在线| 一区二区欧美在线观看| 久久毛片高清国产| 欧美美女bb生活片| 国产成人综合亚洲网站| 午夜精品福利一区二区三区蜜桃| 久久久久久免费毛片精品| 欧美日韩精品综合在线| aaa欧美日韩| 国产在线播精品第三| 天堂久久久久va久久久久| 中文字幕日韩精品一区| 久久免费午夜影院| 91精品国产91久久久久久最新毛片| 91在线观看下载| 国产91高潮流白浆在线麻豆| 另类综合日韩欧美亚洲|