MetaC

From Esolang
(Redirected from Metac)
Jump to navigation Jump to search
This article is not detailed enough and needs to be expanded. Please help us by adding some more information.
MetaC
Designed by Jannes
Appeared in 2024
Dimensions one-dimensional
Computational class Meta Turing-complete
Reference implementation See #Implementations
Influenced by C, MetaGolfScript
File extension(s) .c

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.