//
//  Pile_exo.c  -- Solution
//
//      version PPI-2025
//
//  Implement a stack with using a static array à la 'C'


#include <stdio.h>
#include <stdlib.h>
#define sMAX 10

enum {
    noErr = 0,
    ErrStackFull =  -1,
    ErrStackEmpty = -2,
};


struct tStack {
    int sz;
    int data[sMAX];
};


int pop(struct tStack* s, int* x) {
    if (s->sz < 0) {
        return ErrStackEmpty;
    }
    *x=s->data[s->sz];
    s->sz--;
    
    return noErr;
    
}

int push(struct tStack* s, int x) {
    s->sz++;
    if (s->sz>=sMAX) {
        s->sz--;
        return ErrStackFull;
    }
    s->data[s->sz]=x;
    return noErr;
    
}

void init(struct tStack* s){
    s->sz=-1;
}


int main (int argc, char * const argv[]) {
    struct tStack s;
    int i,x;
    int e;
    
    init(&s);
    for (i=0;i<10;i++) {
        push(&s,i+10);
        printf("-> %d\n",i+10);
    }
    
    e=push(&s,22); // test stack full err
    printf("error: %d\n",e);
    
    while (!pop(&s,&x))
        printf("%d ->\n",x);
    
    e=pop(&s,&x); // test stack empty err
    printf("error: %d\n",e);
    
    return 0;
}

