// basename.h
#include <string.h>
static size_t basename_start_calc(const char* filename)
{
const char* base = strrchr(filename, '/');
return base ? (base - filename + 1) : 0;
}
static inline size_t basename_start(const char* filename)
{
static size_t retval = basename_start_calc(filename);
return retval;
}
#define STR_(t) #t
#define STR(t) STR_(t)
#define BASENAME() ((__FILE__ ":" STR(__LINE__)) + basename_start(__FILE__))
#include <stdio.h>
#undef __FILE__
#define __FILE__ "/alal/dupa.cpp"
int main() {
printf("%s\n", BASENAME());
#undef __FILE__
#define __FILE__ "/ala2/ala1/bobas.cpp"
printf("%s\n", BASENAME());
}
Ly8gYmFzZW5hbWUuaAojaW5jbHVkZSA8c3RyaW5nLmg+CgpzdGF0aWMgc2l6ZV90IGJhc2VuYW1lX3N0YXJ0X2NhbGMoY29uc3QgY2hhciogZmlsZW5hbWUpCnsKICAgIGNvbnN0IGNoYXIqIGJhc2UgPSBzdHJyY2hyKGZpbGVuYW1lLCAnLycpOwogICAgcmV0dXJuIGJhc2UgPyAoYmFzZSAtIGZpbGVuYW1lICsgMSkgOiAwOwp9CnN0YXRpYyBpbmxpbmUgc2l6ZV90IGJhc2VuYW1lX3N0YXJ0KGNvbnN0IGNoYXIqIGZpbGVuYW1lKQp7CiAgICBzdGF0aWMgc2l6ZV90IHJldHZhbCA9IGJhc2VuYW1lX3N0YXJ0X2NhbGMoZmlsZW5hbWUpOwogICAgcmV0dXJuIHJldHZhbDsKfQojZGVmaW5lIFNUUl8odCkgI3QKI2RlZmluZSBTVFIodCkgU1RSXyh0KQojZGVmaW5lIEJBU0VOQU1FKCkgICgoX19GSUxFX18gIjoiIFNUUihfX0xJTkVfXykpICsgYmFzZW5hbWVfc3RhcnQoX19GSUxFX18pKQoKI2luY2x1ZGUgPHN0ZGlvLmg+CgojdW5kZWYgX19GSUxFX18KI2RlZmluZSBfX0ZJTEVfXyAiL2FsYWwvZHVwYS5jcHAiCmludCBtYWluKCkgewogICAgcHJpbnRmKCIlc1xuIiwgQkFTRU5BTUUoKSk7CiN1bmRlZiBfX0ZJTEVfXwojZGVmaW5lIF9fRklMRV9fICIvYWxhMi9hbGExL2JvYmFzLmNwcCIKICAgIHByaW50ZigiJXNcbiIsIEJBU0VOQU1FKCkpOwp9