コミットを比較

...

2 コミット

2個のファイルの変更48行の追加3行の削除

ファイルの表示

@ -1,2 +1,5 @@
# 0.2.0
* ファイル名はパラメートルを付いたら、ファイル名は拡張子に
# 0.1.0
* 最初リリース

48
main.c
ファイルの表示

@ -1,13 +1,51 @@
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <string.h>
#include <curl/curl.h>
const char* sofname = "odl";
const char* version = "0.1.0";
const char* version = "0.2.0";
char* filename;
char* get_filename(const char* url) {
char* fn_start = strrchr(url, '/');
if (fn_start == NULL) {
return NULL;
}
fn_start++;
char* query = strchr(fn_start, '?');
char* anchor = strchr(fn_start, '#');
char* fn_end = NULL;
if (query != NULL && anchor != NULL) {
fn_end = (query < anchor) ? query : anchor;
} else if (query != NULL) {
fn_end = query;
} else if (anchor != NULL) {
fn_end = anchor;
}
// URLでパラメートルがなければ、そのままファイル名をコピーして
if (fn_end == NULL) {
fn_end = strchr(fn_start, '\0');
}
size_t length = fn_end - fn_start;
char* extfn = malloc(length + 1);
if (extfn == NULL) {
return NULL;
}
strncpy(extfn, fn_start, length);
extfn[length] = '\0';
return extfn;
}
int progress_callback(void *cp, double dt, double dn, double ut, double un) {
(void)cp;
(void)ut;
@ -35,7 +73,7 @@ int progress_callback(void *cp, double dt, double dn, double ut, double un) {
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("usage: %s [url ...]\n", sofname);
printf("usage: %s-%s [url ...]\n", sofname, version);
return 1;
}
@ -47,7 +85,11 @@ int main(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
const char* url = argv[i];
filename = basename((char*)url);
filename = get_filename(url);
if (filename == NULL) {
fprintf(stderr, "URLからファイル名を抽出出来ませんでした。\n");
continue;
}
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);