Open4
lsを読みながらC言語入門するスクラップ
これ読みながらメモする。
ビルドに使ってる環境
attach
attachはdirname
とname
を'/'で結合するだけ。
main.c
#include <stdio.h>
#include <alloca.h>
#include <string.h>
int main(void);
static void attach(char *dest, const char *dirname, const char *name);
int main(void)
{
const char *dirname = "./path/to";
const char *name = "file";
char *absolute_name;
absolute_name = alloca(strlen(dirname) + strlen(name) + 2);
attach(absolute_name, dirname, name);
printf("%s\n", absolute_name); // => "./path/to/file"
return 0;
}
strlen(dirname) + strlen(name) + 2
の2
って'/'と'\0'。
dirname
とname
を変えれるようにしてみる。
main.c
#include <stdio.h>
#include <alloca.h>
#include <string.h>
#include <assert.h>
int main(int argc, const char **argv);
static void attach(char *dest, const char *dirname, const char *name);
int main(int argc, const char **argv)
{
assert(argc == 3);
const char *dirname = argv[1];
const char *name = argv[2];
char *absolute_name;
absolute_name = alloca(strlen(dirname) + strlen(name) + 2);
attach(absolute_name, dirname, name);
printf("%s\n", absolute_name);
return 0;
}
実行例
$ ./a.out "./abc/def" "hello.c"
./abc/def/hello.c
$ ./a.out "" "hello.c"
hello.c
$ ./a.out "." "hello.c"
hello.c
dirname
が空文字列だったり、.
だったりしたときはname
のみになる。
出力
まずfwrite
main.c
#include <stdio.h>
#include <string.h>
int main(void);
int main(void)
{
const char *name = "hello\n";
int len = strlen(name);
fwrite(name, 1, len, stdout);
return 0;
}
lsのmainをmain2にして、新しくmainを埋め込んでみた。
ls.c
int main(int argc, char** argv)
{
struct quoting_options *options;
assert(argc == 2);
set_quoting_style(NULL, shell_escape_quoting_style);
options = clone_quoting_options (NULL);
char smallbuf[BUFSIZ];
const char* name = argv[1];
size_t len = quotearg_buffer(smallbuf, sizeof smallbuf, name, -1, options);
printf("len = %lu\n", len);
fwrite(smallbuf, 1, len, stdout);
printf("\n");
return 0;
}
エスケープするのが確認できる。
$ ./bin/ls "hello\tworld"
len = 14
'hello\tworld'
struct quoting_options options
みたいにすると、不完全な型は使用できません
と言われる。struct quoting_options
はquotearg.c
で定義されているので、set_quoting_style
などで変更してからclone_quoting_options
で取得する使い方になる。