Wednesday, August 17, 2011

Exercise 1-18 (continued)

Exercise 1-18  Write a program to remove trailing blanks and tabs from each line of input, and to delete entirely blank lines.

This program can buffer up to a certain number of blank characters, and spills only one character at a time when the buffer is full.

#include <stdio.h>

#define BUFFERSIZE 100

int bufpos = 0;
char buffer[BUFFERSIZE];

void clear_buffer(void)
{
  bufpos = 0;
}

void flush(void)
{
  int i;
  for (i = 0; i < bufpos; ++i)
    putchar(buffer[i]);

  clear_buffer();
}

void push(char c)
{
  if (bufpos<BUFFERSIZE)
    buffer[bufpos++] = c;
  else
  {
    int i;

    putchar(buffer[0]);

    for (i=1; i<BUFFERSIZE; ++i)
      buffer[i-1] = buffer[i];

    buffer[BUFFERSIZE-1] = c;
  }
}

void display(char c)
{
  flush();
  putchar(c);
}

void strip(char c)
{
  switch(c)
  {
  case ' ':
  case '\t':
    push(c);
    break;

  case '\n':
    clear_buffer();
    putchar(c);
    break;

  default:
    display(c);
    break;
  }
}

int main(void)
{
  int c;
  int newline = 1;

  while (c=getchar(), c!=EOF)
  {
    if (!newline || c!='\n')
    {
      newline = 0;
      strip(c);
    }

    if (c=='\n')
      newline = 1;
  }

  return 0;
}

No comments:

Post a Comment