7gogo にあやかって久しぶりに C のプログラムを書いた

ファイルのパーミッションの八進数が苦手である。
7が全部許可な事はわかる。
rwx の順番なのもわかる。
が、そこから 1 bit でもずれると『そもそも read は下の桁だっけ一番上の桁だっけ?』となる。


変換スクリプトを書こうと思った。
パーミッションといえば 755 とかよく出てくるから 7gogo.jp にあやかって会いにいけるプログラムにしよう(謎)

そして何故か C で書いた。
これでも元ゲームプログラマーC++ をメインに使っていたのだが、最近はお仕事が Java やら Ruby やらが多くて
C を書く機会はほんとになくなっている。

まあ、たまにはリハビリだ。
make も何も要らない C のソース一個で完結だ。

// nanagogo.c - octal permission number to string expression converter
// 
// Copyright (c) 2016 Takel Hinomoto
// This file is provided under the MIT license.
// 
// To compile: $ cc nanagogo.c -o nngg
// To execute: $ ./nngg 755
//         or: $ mv nngg ~/bin; nngg 755
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

static const char* stringExpressionTable[] =
{
	"---",
	"--x",
	"-w-",
	"-wx",
	"r--",
	"r-x",
	"rw-",
	"rwx",
};

int main(int argc, const char** argv)
{
	if (argc < 2)
	{
		fprintf(stderr, "missing argument.\n");
		return -1;
	}
	
	const char* permissionNumber = argv[1];
	errno = 0;
	char* pEndCh = NULL;
	
	unsigned long value = strtoul(permissionNumber, &pEndCh, 8);
	if ((errno != 0) || (*pEndCh != '\0'))
	{
		fprintf(stderr, "permission value must be an octal number.\n");
		return -1;
	}
	
	if (value > 0777)
	{
		fprintf(stderr, "specified octal permission value too big.\n");
		return -1;
	}
	
	int others = (int)(value & 7);
	int group = (int)((value >> 3) & 7);
	int owner = (int)((value >> 6) & 7);
	
	fprintf(stdout, "%s%s%s\n", stringExpressionTable[owner], stringExpressionTable[group], stringExpressionTable[others]);
	
	return 0;
}

ていうかものすごい車輪の再発明な可能性があるが調べてない。