MetaC

MetaC is a family of esoteric programming languages. Every single language in the family is a version of C.
== Overview ==
The family consists of infinite amount of languages, named metaC-X, where X is a valid base64 string of any length. If a compiler for metaC-X is called with an empty file it will base64 decode X and compile the decoded string, else it will just compile the file.
== Implementations ==
=== C ===
/**
 * metagcc-n compiler
 * Copyright (c) 2024 Jannes Althoff
 *
 * This software may be distributed under the terms of the BSD license.
 */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*
 * Base64 encoding/decoding (RFC1341)
 * Copyright (c) 2005-2011, Jouni Malinen <j@w1.fi>
 *
 * This software may be distributed under the terms of the BSD license.
 */
static const unsigned char base64_table[65] =
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
 * base64_decode - Base64 decode
 * @src: Data to be decoded
 * @len: Length of the data to be decoded
 * @out_len: Pointer to output length variable
 * Returns: Allocated buffer of out_len bytes of decoded data,
 * or %NULL on failure
 *
 * Caller is responsible for freeing the returned buffer.
 */
unsigned char * base64_decode(const unsigned char *src, size_t len,
			 size_t *out_len)
{
	unsigned char dtable[256], *out, *pos, block[4], tmp;
	size_t i, count, olen;
	int pad = 0;
	memset(dtable, 0x80, 256);
	for (i = 0; i < sizeof(base64_table) - 1; i++)
		dtable[base64_table[i]] = (unsigned char) i;
	dtable['='] = 0;
	count = 0;
	for (i = 0; i < len; i++) {
		if (dtable[src[i]] != 0x80)
			count++;
	}
	if (count == 0 || count % 4)
		return NULL;
	olen = count / 4 * 3;
	pos = out = malloc(olen);
	if (out == NULL)
		return NULL;
	count = 0;
	for (i = 0; i < len; i++) {
		tmp = dtable[src[i]];
		if (tmp == 0x80)
			continue;
		if (src[i] == '=')
			pad++;
		block[count] = tmp;
		count++;
		if (count == 4) {
			*pos++ = (block[0] << 2) | (block[1] >> 4);
			*pos++ = (block[1] << 4) | (block[2] >> 2);
			*pos++ = (block[2] << 6) | block[3];
			count = 0;
			if (pad) {
				if (pad == 1)
					pos--;
				else if (pad == 2)
					pos -= 2;
				else {
					/* Invalid padding */
					free(out);
					return NULL;
				}
				break;
			}
		}
	}
	*out_len = pos - out;
	return out;
}
int
main(int argc, char ** argv)
{
 if(argc > 2)
 {
 fprintf(stderr, "%s [file]\n", argv[0]);
 return -1;
 }
 if(strlen(argv[0])>8)
 {
 size_t bytes;
 unsigned char * byte_array = base64_decode(argv[0]+8, strlen(argv[0]+8), &bytes);
 if(byte_array == NULL)
 {
 fprintf(stderr, "An error happend in base64 decode maybe your trying to programm in an invalid language", argv[0]);
 return -1;
 }
 FILE * fp;
 fp = fopen( argv[1],"r");
 int empty = 0;
 if ( fp == NULL )
 {
 empty = 1;
 }
 else
 {
 fseek (fp, 0, SEEK_END);
 size_t size = ftell(fp);
 if (0 == size)
 {
 empty = 1;
 }
 fclose(fp);
 }
 FILE * fp_tmp;
 if((fp_tmp = fopen(".tmp_metagcc", "w")) == NULL)
 {
 fprintf(stderr, "Could not open tmpfile");
 return -1;
 }
 else
 {
 if(empty)
 {
 fprintf(fp_tmp, "%.*s", bytes, byte_array);
 fclose(fp_tmp);
 system("gcc .tmp_metagcc");
 system("rm .tmp_metagcc");
 }
 else
 {
 char * cmd = malloc(10 + strlen(argv[1]));
 cmd[0] = 'g'; cmd[1] = 'c'; cmd[2] = 'c';
 cmd[3] = ' '; cmd[4] = '\0';
 system(strcat(cmd, argv[1]));
 free(cmd);
 }
 }
 }
 return 0;
}
=== metaC-n ===
metaC-LyoqCiAqIG1ldGFnY2MtbiBjb21waWxlcgogKiBDb3B5cmlnaHQgKGMpIDIwMjQgSmFubmVzIEFsdGhvZmYKICoKICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KICovCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8qCiAqIEJhc2U2NCBlbmNvZGluZy9kZWNvZGluZyAoUkZDMTM0MSkKICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAqCiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAqLwoKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJhc2U2NF90YWJsZVs2NV0gPQoJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwoKLyoqCiAqIGJhc2U2NF9kZWNvZGUgLSBCYXNlNjQgZGVjb2RlCiAqIEBzcmM6IERhdGEgdG8gYmUgZGVjb2RlZAogKiBAbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgZGVjb2RlZAogKiBAb3V0X2xlbjogUG9pbnRlciB0byBvdXRwdXQgbGVuZ3RoIHZhcmlhYmxlCiAqIFJldHVybnM6IEFsbG9jYXRlZCBidWZmZXIgb2Ygb3V0X2xlbiBieXRlcyBvZiBkZWNvZGVkIGRhdGEsCiAqIG9yICVOVUxMIG9uIGZhaWx1cmUKICoKICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBidWZmZXIuCiAqLwp1bnNpZ25lZCBjaGFyICogYmFzZTY0X2RlY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCgkJCSAgICAgIHNpemVfdCAqb3V0X2xlbikKewoJdW5zaWduZWQgY2hhciBkdGFibGVbMjU2XSwgKm91dCwgKnBvcywgYmxvY2tbNF0sIHRtcDsKCXNpemVfdCBpLCBjb3VudCwgb2xlbjsKCWludCBwYWQgPSAwOwoKCW1lbXNldChkdGFibGUsIDB4ODAsIDI1Nik7Cglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJhc2U2NF90YWJsZSkgLSAxOyBpKyspCgkJZHRhYmxlW2Jhc2U2NF90YWJsZVtpXV0gPSAodW5zaWduZWQgY2hhcikgaTsKCWR0YWJsZVsnPSddID0gMDsKCgljb3VudCA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCQlpZiAoZHRhYmxlW3NyY1tpXV0gIT0gMHg4MCkKCQkJY291bnQrKzsKCX0KCglpZiAoY291bnQgPT0gMCB8fCBjb3VudCAlIDQpCgkJcmV0dXJuIE5VTEw7CgoJb2xlbiA9IGNvdW50IC8gNCAqIDM7Cglwb3MgPSBvdXQgPSBtYWxsb2Mob2xlbik7CglpZiAob3V0ID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJdG1wID0gZHRhYmxlW3NyY1tpXV07CgkJaWYgKHRtcCA9PSAweDgwKQoJCQljb250aW51ZTsKCgkJaWYgKHNyY1tpXSA9PSAnPScpCgkJCXBhZCsrOwoJCWJsb2NrW2NvdW50XSA9IHRtcDsKCQljb3VudCsrOwoJCWlmIChjb3VudCA9PSA0KSB7CgkJCSpwb3MrKyA9IChibG9ja1swXSA8PCAyKSB8IChibG9ja1sxXSA+PiA0KTsKCQkJKnBvcysrID0gKGJsb2NrWzFdIDw8IDQpIHwgKGJsb2NrWzJdID4+IDIpOwoJCQkqcG9zKysgPSAoYmxvY2tbMl0gPDwgNikgfCBibG9ja1szXTsKCQkJY291bnQgPSAwOwoJCQlpZiAocGFkKSB7CgkJCQlpZiAocGFkID09IDEpCgkJCQkJcG9zLS07CgkJCQllbHNlIGlmIChwYWQgPT0gMikKCQkJCQlwb3MgLT0gMjsKCQkJCWVsc2UgewoJCQkJCS8qIEludmFsaWQgcGFkZGluZyAqLwoJCQkJCWZyZWUob3V0KTsKCQkJCQlyZXR1cm4gTlVMTDsKCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCSpvdXRfbGVuID0gcG9zIC0gb3V0OwoJcmV0dXJuIG91dDsKfQoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewogIGlmKGFyZ2MgPiAyKQogICAgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFtmaWxlXVxuIiwgYXJndlswXSk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICBpZihzdHJsZW4oYXJndlswXSk+OCkKICAgIHsKICAgICAgc2l6ZV90IGJ5dGVzOwogICAgICB1bnNpZ25lZCBjaGFyICogYnl0ZV9hcnJheSA9IGJhc2U2NF9kZWNvZGUoYXJndlswXSs4LCBzdHJsZW4oYXJndlswXSs4KSwgJmJ5dGVzKTsKICAgICAgaWYoYnl0ZV9hcnJheSA9PSBOVUxMKQogICAgICAgIHsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3IgaGFwcGVuZCBpbiBiYXNlNjQgZGVjb2RlIG1heWJlIHlvdXIgdHJ5aW5nIHRvIHByb2dyYW1tIGluIGFuIGludmFsaWQgbGFuZ3VhZ2UiLCBhcmd2WzBdKTsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgIEZJTEUgKiBmcDsKICAgICAgZnAgPSBmb3BlbiggYXJndlsxXSwiciIpOwogICAgICBpbnQgZW1wdHkgPSAwOwogICAgICBpZiAoIGZwID09IE5VTEwgKQogICAgICAgIHsKICAgICAgICAgIGVtcHR5ID0gMTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBmc2VlayAoZnAsIDAsIFNFRUtfRU5EKTsKICAgICAgICAgIHNpemVfdCBzaXplID0gZnRlbGwoZnApOwogICAgICAgICAgaWYgKDAgPT0gc2l6ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGVtcHR5ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICB9CiAgICAgIEZJTEUgKiBmcF90bXA7CiAgICAgIGlmKChmcF90bXAgPSBmb3BlbigiLnRtcF9tZXRhZ2NjIiwgInciKSkgPT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHRtcGZpbGUiKTsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBpZihlbXB0eSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGZwcmludGYoZnBfdG1wLCAiJS4qcyIsIGJ5dGVzLCBieXRlX2FycmF5KTsKICAgICAgICAgICAgICBmY2xvc2UoZnBfdG1wKTsKICAgICAgICAgICAgICBzeXN0ZW0oImdjYyAudG1wX21ldGFnY2MiKTsKICAgICAgICAgICAgICBzeXN0ZW0oInJtIC50bXBfbWV0YWdjYyIpOwogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjaGFyICogY21kID0gbWFsbG9jKDEwICsgc3RybGVuKGFyZ3ZbMV0pKTsKICAgICAgICAgICAgICBjbWRbMF0gPSAnZyc7IGNtZFsxXSA9ICdjJzsgY21kWzJdID0gJ2MnOwogICAgICAgICAgICAgIGNtZFszXSA9ICcgJzsgY21kWzRdID0gJ1wwJzsKICAgICAgICAgICAgICBzeXN0ZW0oc3RyY2F0KGNtZCwgYXJndlsxXSkpOwogICAgICAgICAgICAgIGZyZWUoY21kKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg== compiles an empty file to a metaC-n compiler.
Category:Languages
Category:Low-level
Category:Implemented
Category:2024