Open4

lsを読みながらC言語入門するスクラップ

nabeyangnabeyang

attach

attachはdirnamenameを'/'で結合するだけ。

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) + 22って'/'と'\0'。
dirnamenameを変えれるようにしてみる。

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のみになる。

nabeyangnabeyang

出力

まず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;
}
nabeyangnabeyang

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_optionsquotearg.cで定義されているので、set_quoting_styleなどで変更してからclone_quoting_optionsで取得する使い方になる。