Rev 6857 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3245 | Albom | 1 | |
2 | { |
||
3 | char* argv[100]; |
||
7802 | rgimad | 4 | int argc; |
5 | char *filename_in = NULL; |
||
6 | char *filename_out = NULL; |
||
7 | char *buffer = NULL; |
||
8 | |||
3245 | Albom | 9 | |
7802 | rgimad | 10 | kol_struct70 k70_out; |
11 | |||
3245 | Albom | 12 | |
7802 | rgimad | 13 | |
3245 | Albom | 14 | |
7802 | rgimad | 15 | unsigned result, buf_size; |
16 | |||
3245 | Albom | 17 | |
7802 | rgimad | 18 | |
3245 | Albom | 19 | |
7802 | rgimad | 20 | { |
21 | #if LANG_ENG |
||
22 | printf(" cp |
||
23 | #elif LANG_RUS |
||
24 | printf(" cp <источник> <результат>\n\r"); |
||
25 | #endif |
||
26 | parameters_free(argc, argv); |
||
27 | return TRUE; |
||
28 | } |
||
29 | |||
3245 | Albom | 30 | |
7802 | rgimad | 31 | filename_out = (char*) malloc(FILENAME_MAX); |
32 | |||
3245 | Albom | 33 | |
7802 | rgimad | 34 | { |
35 | strcpy(filename_in, cur_dir); |
||
36 | if (filename_in[strlen(filename_in)-1] != '/') |
||
37 | { |
||
38 | strcat(filename_in, "/"); // add slash |
||
39 | } |
||
40 | strcat(filename_in, argv[0]); |
||
41 | } else |
||
42 | { |
||
43 | strcpy(filename_in, argv[0]); |
||
44 | } |
||
45 | // ----- |
||
46 | if (argv[1][0] != '/') |
||
47 | { |
||
48 | strcpy(filename_out, cur_dir); |
||
49 | if (filename_out[strlen(filename_out)-1] != '/') |
||
50 | { |
||
51 | strcat(filename_out, "/"); // add slash |
||
52 | } |
||
53 | strcat(filename_out, argv[1]); |
||
54 | } else |
||
55 | { |
||
56 | strcpy(filename_out, argv[1]); |
||
57 | } |
||
58 | |||
59 | |||
60 | if ( dir_check(filename_out) ) |
||
61 | { |
||
62 | char *fname = strrchr(filename_in, '/') + 1; // always exist, as we add curdir |
||
63 | if (filename_out[strlen(filename_out)-1] != '/') |
||
64 | { |
||
65 | strcat(filename_out, "/"); // add slash |
||
66 | } |
||
67 | strcat(filename_out, fname); |
||
68 | } |
||
69 | |||
3245 | Albom | 70 | |
71 | |||
7802 | rgimad | 72 | k70_in.p04 = 0LL; |
73 | k70_in.p12 = 0; |
||
74 | k70_in.p16 = (unsigned) &bdvk; |
||
75 | k70_in.p20 = 0; |
||
76 | k70_in.p21 = filename_in; |
||
77 | |||
3245 | Albom | 78 | |
7802 | rgimad | 79 | if ( 0 != result ) |
80 | goto lbl_exit; |
||
81 | |||
3245 | Albom | 82 | |
7802 | rgimad | 83 | buf_size = 1 << 20; // 1Mb |
84 | while( ((buf_size >> 10) > kol_system_memfree()) && (buf_size > 4096) ) |
||
85 | buf_size /= 2; |
||
86 | |||
3245 | Albom | 87 | |
7802 | rgimad | 88 | if (buf_size > filesize) |
89 | buf_size = (unsigned)filesize; // may be zero! |
||
90 | if (buf_size == 0) buf_size = 4096; // ... |
||
91 | |||
3245 | Albom | 92 | |
7802 | rgimad | 93 | if (!buffer) |
94 | { |
||
95 | result = E_NOMEM; |
||
96 | goto lbl_exit; |
||
97 | } |
||
98 | |||
3245 | Albom | 99 | |
7802 | rgimad | 100 | //k70_in.p08 = 0; |
101 | k70_in.p12 = buf_size; |
||
102 | k70_in.p16 = (unsigned) buffer; |
||
103 | k70_in.p20 = 0; |
||
104 | k70_in.p21 = filename_in; |
||
105 | |||
3245 | Albom | 106 | |
7802 | rgimad | 107 | //k70_out.p08 = 0; |
108 | k70_out.p12 = buf_size; |
||
109 | k70_out.p16 = (unsigned) buffer; |
||
110 | k70_out.p20 = 0; |
||
111 | k70_out.p21 = filename_out; |
||
112 | |||
3245 | Albom | 113 | |
7802 | rgimad | 114 | do |
115 | { |
||
116 | k70_in.p04 = offset; |
||
117 | if (offset + buf_size > filesize) // last chunk |
||
118 | { |
||
119 | k70_in.p12 = k70_out.p12 = (unsigned)(filesize - offset); // filesize % buf_size; |
||
120 | } |
||
121 | |||
122 | |||
123 | if (result != 0) |
||
124 | { |
||
125 | goto lbl_exit; |
||
126 | } |
||
127 | |||
3245 | Albom | 128 | |
7802 | rgimad | 129 | result = kol_file_70(&k70_out); // write |
130 | if (result != 0) |
||
131 | { |
||
132 | goto lbl_exit; |
||
133 | } |
||
134 | |||
6857 | siemargl | 135 | |
7802 | rgimad | 136 | { |
137 | k70_out.p00 = 3; // changing function from create (2) to append (3) |
||
138 | } |
||
139 | offset += buf_size; |
||
140 | } while (offset < filesize); |
||
141 | |||
3245 | Albom | 142 | |
7802 | rgimad | 143 | |
3245 | Albom | 144 | |
7802 | rgimad | 145 | free(filename_in); |
146 | free(filename_out); |
||
147 | free(buffer); |
||
148 | |||
3245 | Albom | 149 | |
7802 | rgimad | 150 | }>><>результат>источник> |
3245 | Albom | 151 |