/* * @(#)create_header.c 1.4 06/22/98 SMI * * Copyright 1997 by Sun Microsystems, Inc. * All rights reserved * * Manipulates a RFC 822 header * * Syntax: * create_header * */ #include #include #include #include imhdr_t hdr = (void *)NULL; static void check (int status) { if ( status < 0 ) { printf( "ERROR"); exit (status); } return; } static void usage() { printf("Usage:\n create_header\n\n"); return; } static void print_help() { printf("help : list all available commands\n"); printf("add : add a new header line\n"); printf("del : delete an existing header line\n"); printf("new : start new header\n"); printf("print : display the current header\n"); printf("quit : exit the program\n"); return; } static void print_header_line_types() { printf(" From: (1)\n"); printf(" To: (2)\n"); printf(" Subject: (3)\n"); printf(" Date: (4)\n"); printf(" Cc: (5)\n"); printf(" Comments: (6)\n"); printf("Header line type : "); return; } static void create_new_line() { char input[1024], output[1024]; int input_len, output_len; char type; print_header_line_types(); while ( fgets(input, sizeof(input), stdin) ) { type = *input; printf("Header value : "); if ( fgets(input, sizeof(input), stdin) ) { input[strlen(input) - 1] = 0; /* Strip off the \n */ switch( type ) { case '1': check( imhdr_add_line( &hdr, HL_FROM, input, 0) ); break; case '2': check( imhdr_add_line( &hdr, HL_TO, input, 0) ); break; case '3': check( imhdr_add_line( &hdr, HL_SUBJECT, input, 0) ); break; case '4': check( imhdr_add_line( &hdr, HL_DATE, input, 0) ); break; case '5': check( imhdr_add_line( &hdr, HL_CC, input, 0) ); break; case '6': check( imhdr_add_line( &hdr, HL_COMMENTS, input, 0) ); break; default: printf("Invalid header type!\n"); print_header_line_types(); continue; } } break; } return; } static void delete_line() { char input[1024]; int input_len; print_header_line_types(); while ( fgets(input, sizeof(input), stdin) ) { switch( *input ) { case '1': check( imhdr_delete_line( hdr, HL_FROM) ); break; case '2': check( imhdr_delete_line( hdr, HL_TO) ); break; case '3': check( imhdr_delete_line( hdr, HL_SUBJECT) ); break; case '4': check( imhdr_delete_line( hdr, HL_DATE) ); break; case '5': check( imhdr_delete_line( hdr, HL_CC) ); break; case '6': check( imhdr_delete_line( hdr, HL_COMMENTS) ); break; default: printf("Invalid header type."); print_header_line_types(); continue; } return; } } static void display_header() { char *result; int i, status; for ( i = HL_FIRST_HEADER ; i < HL_LAST_HEADER ; i++ ) { switch( i ) { case HL_FROM : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "From: %s\n", result); imhdr_free_line(hdr, result); } break; case HL_TO : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "To: %s\n", result); imhdr_free_line(hdr, result); } break; case HL_SUBJECT : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "Subject: %s\n", result); imhdr_free_line(hdr, result); } break; case HL_DATE : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "Date: %s\n", result); imhdr_free_line(hdr, result); } break; case HL_CC : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "Cc: %s\n", result); imhdr_free_line(hdr, result); } break; case HL_COMMENTS : result = (char *)NULL; while ( imhdr_get_line( hdr, i, &result) > 0 ) { printf( "Comments: %s\n", result); imhdr_free_line(hdr, result); } break; default: continue; } } return; } main ( int argc, char **argv) { char input[1024], output[1024]; int input_len, output_len; char c; int count = 0, i; print_help(); imhdr_alloc(&hdr); do { printf("Now what? "); if ( fgets(input, sizeof(input), stdin) ) { switch ( *input ) { case 'h': print_help(); break; case 'a': create_new_line(); break; case 'n': /* new header */ if (hdr) { imhdr_free(hdr); hdr = NULL; } imhdr_alloc(&hdr); break; case 'd': delete_line(); break; case 'p': display_header(); break; case 'q': if (hdr) { imhdr_free(hdr); hdr = NULL; } exit( EX_OK); default: printf("Invalid entry!\n"); break; } } } while(1); }