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

Pages: 1-

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 0:17

WELL WAT DA FUCK ARE U TRAVERSIN? AN ARRAY? A LINKED LIST? A BINARY TREE? A TRIE? A SNAKE? A COW? A WHAT?

Name: Anonymous 2013-04-12 0:22

IN DA FIRST TWO CASES U MAY AS WELL JUST USE DA WIDELY ACCEPTED IDIOMS:

for (i = 0; i < sizeof a / sizeof a[0]; i++) { a[i] ... }
for (np = l; np; np = np->next) { np->data ... }

Name: Anonymous 2013-04-12 0:46

>>3
Those aren't foreach macros. Those are just for loops.

Name: Anonymous 2013-04-12 0:52

Those aren't fruiteach macros. Those are just fruit loops.

Name: Anonymous 2013-04-12 1:50

>>4
#define foreach_array(a,i) for (i = 0; i < sizeof a / sizeof a[0]; i++)
#define foreach_list(l,np) for (np = l; np; np = np->next)

Name: Anonymous 2013-04-12 2:54

>>6
I think he meant something along the lines of #define foreach(array, function) ...

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:14

>>8
I detest you.

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?

Name: Anonymous 2013-04-12 3:58

>>9
for why?

Name: Anonymous 2013-04-12 6:10

>>8,10
LOL functions FTW! We use a file lel/company_standard.h for shit like that here.

Name: Anonymous 2013-04-12 9:36

>>12
U NOOBS AINT EVEN RED DA C STANDARD AND UR MAKING UR OWN SHITTY STANDARDS ON TOP OF C? GET FUCKD

Name: Anonymous 2013-04-13 4:48

The macros do not work correctly!

Try:

int i [10];
printf("%d",STATIC_ARRAY_LENGTH(++i));

Name: Anonymous 2013-04-13 5:16

if you need features like this, maybe it's time to upgrade to C++

Name: Anonymous 2013-04-13 5:30

>>15
maybe it's time to upgrade to php
fftgj

Name: Anonymous 2013-04-13 12:04

C++11 has this.

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