Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

C89 foreach macro

Name: Anonymous 2013-04-11 23:12

Anyone else ever write a foreach macro in C? I find it useful to have every now and again, but I find myself needing to rewrite the macro for every different large project. Maybe I'm not doing it right...

Name: Anonymous 2013-04-12 3:01


#include <stdio.h>
#include <stdlib.h>

#define ZERO 0
#define ONE 1
#define SUM(X,Y) ((X)+(Y))
#define SUB(X,Y) ((X)-(Y))
#define MUL(X,Y) ((X)*(Y))
#define DIV(X,Y) ((X)/(Y))
#define MOD(X,Y) ((X)%(Y))
#define DEREF(P) (*(P))
#define INDEX(A,I) DEREF(SUM(A,I))
#define LESS_THAN(X,Y) ((X)<(Y))
#define SUCCESSOR(N) SUM(N,ONE)
#define FOREVER(BODY) for(;;) { BODY; }
#define UNTIL(CONDITION,BODY) FOREVER(if(CONDITION) break; BODY)
#define DO_UNTIL(CONDITION,BODY) FOREVER(BODY; if(CONDITION) break)
#define WHILE(CONDITION,BODY) UNTIL(!(CONDITION), BODY)
#define DO_WHILE(CONDITION,BODY) DO_UNTIL(!(CONDITION), BODY)
#define FOR(INIT, CONDITION, INCR, BODY) { INIT; WHILE(CONDITION, BODY; INCR) }
#define FOLD_WHILE(SEED_TYPE, SEED_NAME, SEED_INIT, CONDITION, NEXT, BODY) FOR(SEED_TYPE SEED_NAME = (SEED_INIT), CONDITION, SEED_NAME = (NEXT), BODY)
#define FOR_INT_STEP(I, INIT, UPPER_LIMIT, STEP, BODY) FOLD_WHILE(int, I, INIT, LESS_THAN(I,UPPER_LIMIT), SUM(I,STEP), BODY)
#define FOR_INT_RANGE(I, INIT, UPPER_LIMIT, BODY) FOR_INT_STEP(I, INIT, UPPER_LIMIT, 1, BODY)
#define FOR_INT(I, UPPER_LIMIT, BODY) FOR_INT_RANGE(I, ZERO, UPPER_LIMIT, BODY)
#define STATIC_ARRAY_LENGTH(A) DIV(sizeof(A), sizeof(DEREF(A)))
#define FOR_STATIC_ARRAY(I,A,BODY) FOR_INT(I, STATIC_ARRAY_LENGTH(A), BODY)


char data[] = "hello world\n";

int main(int argc, char** argv) {
  FOR_STATIC_ARRAY(i,data,putc(INDEX(data,i), stdout));
  return EXIT_SUCCESS;
}

Name: Anonymous 2013-04-12 3:24

>>4
NO SHIT. WHY DA FUCK WOULD YOU WANT TO MAKE UP YOUR OWN SYNTAX WHEN YOU CAN JUST USE THOSE SIMPLE IDIOMS?

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List