CS 330 Lecture 14 – Postfix Calculator and Make
Agenda
- what ?s
- hw2 grading script ready and untested
- program this!
- making stack reusable
- managing compilation with make
TODO
- Read section 8.3 in your book. Quarter sheet.
- On the valgrind logo: http://valgrind.org/gallery/artwork.html.
Program This
Write a function strappend, which
- takes two strings as parameters
- makes the first bigger so that it can hold both strings
- copies the second string onto the end of the first
- returns nothing
Code
strappend.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void strappend(char **base, const char *suffix) {
int total_chars = strlen(*base) + strlen(suffix) + 1;
char *bigger = (char *) malloc(total_chars * sizeof(char));
strcpy(bigger, *base);
strcat(bigger, suffix);
printf("bigger: %s\n", bigger);
free(*base);
*base = bigger;
printf("base: %s\n", *base);
// Suffix is not necessarily on heap. It's not ours to reclaim.
/* free(suffix); */
// DON'T DO THIS, PAL! We're relying on you.
/* free(bigger); */
}
int main(int argc, char **argv) {
char *foo = strdup("Angry Beyonce");
strappend(&foo, " a ring");
printf("foo: %s\n", foo);
free(foo);
return 0;
}
stack.c
#define EZMALLOC(type, n) \
(type *) malloc((n) * sizeof(type))
stack_t *make_stack(int capacity) {
stack_t *stack = EZMALLOC(stack_t, 1);
stack->size = 0;
stack->capacity = capacity;
stack->items = EZMALLOC(int, stack->capacity);
}
void stack_push(stack_t *stack, int item) {
if (stack->size >= stack->capacity) {
fprintf(stderr, "Stack full, you foo bag.\n");
exit(1);
}
stack->items[stack->size] = item;
++stack->size;
}
int stack_pop(stack_t *stack) {
if (stack->size == 0) {
fprintf(stderr, "Stack empty, you foo bag.\n");
exit(1);
}
int item = stack->items[stack->size - 1];
--stack->size;
return item;
}
stack.h
#ifndef STACK_H
#define STACK_H
struct stack_t {
int size;
int capacity;
int *items;
};
typedef struct stack_t stack_t;
stack_t *make_stack(int capacity);
void stack_push(stack_t *stack, int item);
int stack_pop(stack_t *stack);
#endif
stack_user.c
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
int main(int argc, char **argv) {
stack_t *stack = make_stack(10);
stack_push(stack, 42);
printf("stack_pop(stack): %d\n", stack_pop(stack));
return 0;
}
Haiku
Languages have warts
Some of us are monsters — “Blarp!”
That’s Monster for “Like”
Some of us are monsters — “Blarp!”
That’s Monster for “Like”