OSDN Git Service

Initial release for VER0.1.5
[lib1stclass/main.git] / rel2abs.c
1 /*\r
2 * See the file LICENSE for redistribution information.\r
3 *\r
4 * Copyright: 2010- 1stclass.co.jp.  All rights reserved.\r
5 *\r
6 * Created by Hajime Kurita\r
7 */\r
8 #include <limits.h>\r
9 #include <stdlib.h>\r
10 \r
11 #ifdef __cplusplus\r
12 #include "1stclass.hpp"\r
13 \r
14 string firstclass::rel2abs(const string in_rel_path){\r
15   char rel_path[2048]="";;\r
16   safe_strcat(rel_path, in_rel_path.c_str(), sizeof(rel_path));\r
17   char abs_path[2048]="";\r
18 #else\r
19 #include "1stclass.h"\r
20 int rel2abs(const char *rel_path, char *abs_path){\r
21 #endif\r
22   if(rel_path[0]=='/'){\r
23     safe_strcat(abs_path, rel_path, 2048);\r
24   }\r
25   else if(rel_path[0]=='.'){\r
26     char in_real[512]="";\r
27     char tail[2048]="";\r
28     int found=0;\r
29     int found_i=0;\r
30     int i=0;\r
31     int tail_i=0;\r
32     for(i=0;i<=2048;i++){\r
33       if(rel_path[i]=='\0'){\r
34         tail[tail_i]='\0';\r
35         break;\r
36       }\r
37       if(found){\r
38         tail[tail_i]=rel_path[i];\r
39         tail_i++;\r
40       }\r
41       else{\r
42         if(rel_path[i] == '.' || rel_path[i] == '/'){\r
43           in_real[i]=rel_path[i];\r
44         }\r
45         else{\r
46           tail[tail_i]=rel_path[i];\r
47           tail_i++;\r
48           found++;\r
49           found_i=i;\r
50         }\r
51       }\r
52     }\r
53     in_real[found_i]='\0';\r
54     if(in_real[found_i-1]=='/'){\r
55       in_real[found_i-1]='\0';\r
56     }\r
57     \r
58     char real_path[2048]="";\r
59     realpath(in_real, real_path);\r
60     safe_strcat(abs_path, real_path, 2048);\r
61     safe_strcat(abs_path, "/", 2048);\r
62     safe_strcat(abs_path, tail, 2048);\r
63   }\r
64   else{\r
65     char real_path[2048]="";\r
66     realpath(".", real_path);\r
67     safe_strcat(abs_path, real_path, 2048);\r
68     safe_strcat(abs_path, "/", 2048);\r
69     safe_strcat(abs_path, rel_path, 2048);\r
70   }\r
71   \r
72 #ifdef __cplusplus\r
73   string result(abs_path);\r
74   return result;\r
75 #endif\r
76 }\r