#include <stdio.h>
#include <string.h>
 
//#define DEBUG
 
void main(int argc, char *argv[]) {
	char* src;
#ifdef DEBUG
	printf("argc = %d\n",argc);
	printf("length of int = %d\n",sizeof(int));
#endif
	if (argc == 2) {
		src = argv[1];
	} else {
		printf("error: wrong number of arguments\n\n");
		printf("the input format:\n");
		printf("./oid-encoder <oid>\n\n");
		printf("example:\n");
		printf("./oid-encoder 1.3.6.1.2.2.4\n\n");
 
		return;
	}
#ifdef DEBUG
	printf("src= %c\n",*src);
	printf("int('0')=%d\n",'0');
#endif
	int num[1000];
	int len = 0;
	int val = 0;
	int i;
	//Routine um einzelne Char Zahlen zu INT zu konvertieren + Trennzeichen Erkenner
	for (i = 0; i < strlen(src) + 1; i++) {
		if (i < strlen(src) && src[i] >= '0' && src[i] <= '9') {
		//solange Zahl erkennen bis Trennzeichen kommt, also entweder kleiner '0' (ASCII 48) oder größer '9' (ASCII 58)
			val = val * 10 + src[i] - '0';
			//Char to Int Conversion + Dez. Erkennung
#ifdef DEBUG
			printf("Value=%d\n",val);
#endif
		} else {
		//Wenn Trennzeichen erkannt wurde, dann...
#ifdef DEBUG
			printf("Trennzeichen erkannt");
#endif
			num[len] = val;
#ifdef DEBUG
			printf(" Zahl = %d\n",num[len]);
#endif
			len++;			
			val = 0;
		}
	}
 
	unsigned char str[] = {0x13, 0x14};
 
	printf("{");
    val = num[0] * 40 + num[1];
	//printf erste Hex Ziffer (erste Zahl*40 + 2.Zahl)(also meist 1*40+3=43)
	printf("0x%02x", val);
 
	for (i = 2; i < len; i++) {
	//Erkennung wieviele Byte genutzt werden müssen
	//Pro Byte stehen immer 2^7 zur Verfügung, da MSB als Erkennung ob weitere Byte zur Zahlen gehören
	//genutzt wird. (Bei MSB=1, weitere folgen... MSB=0 letztes Byte zur Zahl)
		int value = num[i];
		int length = 0;
		if (value >= (268435456)) { // 2 ^ 28
			length = 5;
		} else if (value >= (2097152)) { // 2 ^ 21
			length = 4;
		} else if (value >= 16384) { // 2 ^ 14
			length = 3;
		} else if (value >= 128) { // 2 ^ 7
			length = 2;
		} else {
			length = 1;
		}
#ifdef DEBUG
		printf("\n %d Bytes werden benoetigt.\n",length);
		printf("fuer die Zahl %d\n",num[i]);
		//nur für Debug
		int x=1;
		printf("\n Binaer=");
		for(x=(sizeof(num[i]) * 8) - 1; x >= 0;x--)
		{
			printf("%d",(num[i] & (0x01 << x)) > 0);
		}
		printf("\n");
		//ende debug
#endif
 
		int j = 0;
		for (j = length - 1; j >= 0; j--) {
		    if (j) {
#ifdef DEBUG
				printf("\n j>0 j=%d \n",j);
#endif
				int p = ((value >> (7 * j)) & 0x7F) | 0x80;
		        printf(", 0x%02x", p);
				//nur für Debug
#ifdef DEBUG
				int x=1;
				printf("\n Binaer=");
				for(x=(sizeof(p) * 8) - 1; x >= 0;x--)
				{
					printf("%d",(p & (0x01 << x)) > 0);
				}
				printf("\n");
				//debug
#endif
		    } else {
#ifdef DEBUG
				printf("\n j<0 j=%d \n",j);
#endif
		        int p = ((value >> (7 * j)) & 0x7F);
		        printf(", 0x%02x", p);
#ifdef DEBUG
								//nur für Debug
				int x=1;
				printf("\n Binaer=");
				for(x=(sizeof(p) * 8) - 1; x >= 0;x--)
				{
					printf("%d",(p & (0x01 << x)) > 0);
				}
				printf("\n");
				//ende debug
#endif
		    }
		}
	}
	printf("};\n");
}