Skip to content

Instantly share code, notes, and snippets.

@sasairc
Created January 27, 2016 12:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sasairc/509fb68cec10b059c200 to your computer and use it in GitHub Desktop.
Save sasairc/509fb68cec10b059c200 to your computer and use it in GitHub Desktop.
標準Cライブラリのジャニーズに関する機能

標準Cライブラリのジャニーズに関する機能

この記事はおさむん家 Advent Calendar 2014の記事ですね?

C99(ISO/IEC 9899:1999)以降の標準Cには、ジャニーズ事務所に関するライブラリが含まれています。(嘘です)

#include <stdjohnnys.h>

#define IS_AVAIL    1

typedef struct JOHNNYS {
    char*           name;
    char*           group;
    int             status;
    struct JOHNNYS* start;
    struct JOHNNYS* next;
} johnnys_t;

extern int init_johnnys(johnnys_t** dest_members, char* group, int all, ...);
extern void dissolve_johnnys(johnnys_t* members);

/* GNU拡張 */
extern void mary_kitagawa(johnnys_t** members);

このライブラリに含まれる関数を利用すれば、ジャニーズ事務所に所属する様々なグループを管理する事ができ、非常に便利です。

Example

ここではサンプルとして、ジャニーズ以外の人物で利用してみましょう。 基本的な流れはinit_johnnys()でグループを結成し、dissolve_johnnys()で解散(開放)する手順で利用します。

#include <stdio.h>
#include <stdjohnnys.h>

int main(void)
{
    johnnys_t*  list    = NULL;

    if (init_johnnys(&list, "太陽礼拝\0", 6,
            "sasairc\0", "844196\0", "hyousikinuko\0", "keepoff07\0", "osamu\0", "土屋裕次郎\0") < 0)
        return 1;

    list = list->start;
    fprintf(stdout, "**** %s ***\n", list->group);
    list->status ^= IS_AVAIL;
    while (list->next != NULL) {
        fprintf(stdout, "name = %s, status = %d\n",
                list->name, list->status);
        list = list->next;
    }
    dissolve_johnnys(list);

    return 0;
}

これをビルドし実行すると、次のような結果が得られます。

**** 太陽礼拝 ***
name = sasairc, status = 0
name = 844196, status = 1
name = hyousikinuko, status = 1
name = keepoff07, status = 1
name = osamu, status = 1
name = 土屋裕次郎, status = 1

便利ですね。

GNU拡張

先日、GNU libcによる独自拡張でmary_kitagawa()が追加されました。これは、メリー喜多川氏の意向を反映したものです。 早速その機能を利用してみましょう。

#include <stdio.h>
#include <stdjohnnys.h>

int main(void)
{
    johnnys_t*  smap    = NULL;

    if (init_johnnys(&smap, "SMAP\0", 5,
            "中居\0", "稲垣\0", "草なぎ\0", "木村\0", "香取\0") < 0)
        return 1;

    smap = smap->start;
    while (smap->next != NULL) {
        fprintf(stdout, "name = %s,\tgroup = %s,\tstatus = %d\n",
                smap->name, smap->group, smap->status);
        smap = smap->next;
    }
    putchar('\n');

    mary_kitagawa(&smap);
    smap = smap->start;
    while (smap->next != NULL) {
        fprintf(stdout, "name = %s,\tgroup = %s,\tstatus = %d\n",
                smap->name, smap->group, smap->status);
        smap = smap->next;
    }

    dissolve_johnnys(smap);

    return 0;
}
name = 中居,    group = SMAP,   status = 1
name = 稲垣,    group = SMAP,   status = 1
name = 草なぎ,  group = SMAP,   status = 1
name = 木村,    group = SMAP,   status = 1
name = 香取,    group = SMAP,   status = 1

name = (null),  group = (null), status = 0
name = (null),  group = (null), status = 0
name = (null),  group = (null), status = 0
name = 木村,    group = SMAP,   status = 1
name = (null),  group = (null), status = 0

このように、木村拓哉さん以外抹消されます。執念というのは恐ろしい。

ref

Array#smap

ここから下は読む必要ありません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define IS_AVAIL 1
typedef struct JOHNNYS {
char* name;
char* group;
int status;
struct JOHNNYS* start;
struct JOHNNYS* next;
} johnnys_t;
int init_johnnys(johnnys_t** dest_members, char* group, int all, ...);
void dissolve_johnnys(johnnys_t* members);
void mary_kitagawa(johnnys_t** members);
int init_johnnys(johnnys_t** dest_members, char* group, int all, ...)
{
int i = 0;
size_t len = 0;
char** argmnt = NULL;
johnnys_t* members = NULL,
* start = NULL;
va_list list;
if ((argmnt = (char**)malloc(sizeof(char*) * all)) == NULL)
return -1;
va_start(list, all);
while (i < all) {
argmnt[i] = va_arg(list, char*);
i++;
}
va_end(list);
if ((members = (johnnys_t*)malloc(sizeof(johnnys_t))) == NULL)
goto ERR;
else
start = members;
i = 0;
while (i < all) {
len = strlen(argmnt[i]);
if ((members->name = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
goto ERR;
else
memcpy(members->name, argmnt[i], len);
len = strlen(group);
if ((members->group = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
goto ERR;
else
memcpy(members->group, group, len);
members->status = IS_AVAIL;
if ((members->next = (johnnys_t*)malloc(sizeof(johnnys_t))) == NULL)
goto ERR;
members = members->next;
members->start = start;
members->next = NULL;
i++;
}
free(argmnt);
*dest_members = members;
return i;
ERR:
if (argmnt != NULL)
free(argmnt);
dissolve_johnnys(members);
return -1;
}
void dissolve_johnnys(johnnys_t* members)
{
johnnys_t* tmp = NULL;
members = members->start;
while (members != NULL) {
tmp = members->next;
if (members->name != NULL)
free(members->name);
if (members->group != NULL)
free(members->group);
free(members);
members = tmp;
}
return;
}
void mary_kitagawa(johnnys_t** members)
{
(*members) = (*members)->start;
while ((*members)->next != NULL) {
if (strcmp((*members)->name, "木村") != 0) {
free((*members)->name);
(*members)->name = NULL;
free((*members)->group);
(*members)->group = NULL;
(*members)->status ^= IS_AVAIL;
}
(*members) = (*members)->next;
}
return;
}
int main(void)
{
johnnys_t* smap = NULL;
if (init_johnnys(&smap, "SMAP\0", 5,
"中居\0", "稲垣\0", "草なぎ\0", "木村\0", "香取\0") < 0)
return 1;
smap = smap->start;
while (smap->next != NULL) {
fprintf(stdout, "name = %s,\tgroup = %s,\tstatus = %d\n",
smap->name, smap->group, smap->status);
smap = smap->next;
}
putchar('\n');
mary_kitagawa(&smap);
smap = smap->start;
while (smap->next != NULL) {
fprintf(stdout, "name = %s,\tgroup = %s,\tstatus = %d\n",
smap->name, smap->group, smap->status);
smap = smap->next;
}
dissolve_johnnys(smap);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment