// C_ACM_gets.c

#include <stdio.h> // printf, feof, getchar
#include <stdlib.h> // malloc, realloc
#include <string.h> // strlen

/* ------------------------------------------------------------- */
// USE acm_gets() IN SITUATIONS WHERE YOU NEED TO PARSE AN
// ARBITRARILY-LONG LINE THAT HAS KNOWN DELIMITERS, SUCH AS
// "\n\r".

int acm_getchar( const char *delim, char *c )  {

  *c = getchar( );

  if( feof( stdin ) )
    return( 1 );

  return( strchr( delim, *c ) != NULL );
}

char *acm_gets( const char *delim )  {
  char c;
  int size = 1;
  int pos = 0;
  char *buf = (char *)malloc( size );

  while( !acm_getchar( delim, &c ) )  {
    buf[pos++] = c;

    if( pos == size )  {
      size *= 2;
      buf = (char *)realloc( buf, size );
    }
  }

  buf = (char *)realloc( buf, pos + 1 );
  buf[pos] = 0;

  return( buf );
}

int main( int argc, char *argv[] )  {
  char *s;

  s = acm_gets( "~" );
  printf( "%i\n", strlen( s ) );
  free( s );

  return( 0 );
}
