Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 May 2004 22:07:36 +0200
From:      Cyrille Lefevre <cyrille.lefevre@laposte.net>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/67307: ready to import bootstrap_cmds/decomment from Darwin
Message-ID:  <20040528200735.GA18621@gits.dyndns.org>
Resent-Message-ID: <200405282010.i4SKA41W009644@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         67307
>Category:       bin
>Synopsis:       ready to import bootstrap_cmds/decomment from Darwin
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri May 28 13:10:04 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Cyrille Lefevre
>Release:        FreeBSD 5.2-CURRENT i386
>Organization:
ACME
>Environment:
System: FreeBSD gits 5.2-CURRENT FreeBSD 5.2-CURRENT #28: Thu May 13 00:19:50 CEST 2004 root@gits:/disk3/freebsd/current/obj/disk3/freebsd/current/src/sys/CUSTOM i386
>Description:
	decomment strip off C/C++ comments from a file.
>How-To-Repeat:
	n/a
>Fix:
# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	usr.bin/decomment/Makefile
#	usr.bin/decomment/decomment.c
#
echo x - usr.bin/decomment/Makefile
sed 's/^X//' >usr.bin/decomment/Makefile << 'END-of-usr.bin/decomment/Makefile'
X# $FreeBSD$
X
XPROG=	decomment
XWARNS?=	6
XNO_MAN=	yes
X
X.include <bsd.prog.mk>
END-of-usr.bin/decomment/Makefile
echo x - usr.bin/decomment/decomment.c
sed 's/^X//' >usr.bin/decomment/decomment.c << 'END-of-usr.bin/decomment/decomment.c'
X/*
X * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
X *
X * @APPLE_LICENSE_HEADER_START@
X * 
X * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
X * 
X * This file contains Original Code and/or Modifications of Original Code
X * as defined in and that are subject to the Apple Public Source License
X * Version 2.0 (the 'License'). You may not use this file except in
X * compliance with the License. Please obtain a copy of the License at
X * http://www.opensource.apple.com/apsl/ and read it before using this
X * file.
X * 
X * The Original Code and all software distributed under the License are
X * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
X * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
X * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
X * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
X * Please see the License for the specific language governing rights and
X * limitations under the License.
X * 
X * @APPLE_LICENSE_HEADER_END@
X */
X/*
X * decomment.c
X *
X * Removes all comments and (optionally) whitespace from an input file. 
X * Writes result on stdout.
X */
X/*
X **********************************************************************
X * HISTORY
X * 27-May-04    Cyrille Lefevre at laposte.net
X * Make it compile under FreeBSD. modifications are __FreeBSD__ #ifdef'ed.
X **********************************************************************
X */
X#include <stdio.h>
X#ifdef __FreeBSD__
X#include <ctype.h>
X#include <fcntl.h>
X#include <stdlib.h>
X#include <unistd.h>
X#else
X#include <libc.h>
X#endif
X
X/*
X * State of input scanner.
X */
Xtypedef enum {
X	IS_NORMAL,
X	IS_SLASH,		// encountered opening '/'
X	IS_IN_COMMENT,		// within / * * / comment
X	IS_STAR,		// encountered closing '*'
X	IS_IN_END_COMMENT	// within / / comment
X} input_state_t;
X
Xstatic volatile void usage(char **argv);
X
Xint main(int argc, char **argv)
X{
X	int fd;
X	char bufchar;
X	int bytes_read;
X	input_state_t input_state = IS_NORMAL;
X	int exit_code = 0;
X	int remove_whitespace = 0;
X	int arg;
X	
X	if(argc < 2)
X		usage(argv);
X	for(arg=2; arg<argc; arg++) {
X		switch(argv[arg][0]) {
X		    case 'r':
X		    	remove_whitespace++;
X			break;
X		    default:
X		    	usage(argv);
X		}
X	}	
X	
X	fd = open(argv[1], O_RDONLY, 0);
X	if(fd <= 0) {
X		fprintf(stderr, "Error opening %s\n", argv[1]);
X		perror("open");
X		exit(1);
X	}
X	for(;;) {
X		bytes_read = read(fd, &bufchar, 1);
X		if(bytes_read <= 0) {
X			if(bytes_read < 0) {
X				fprintf(stderr, "Error reading %s\n", argv[1]);
X				perror("read");
X				exit_code = 1;
X			}
X			break;
X		}
X		
X		switch(input_state) {
X		
X		    case IS_NORMAL:
X		    	if(bufchar == '/') {
X			   	/*
X				 * Might be start of a comment.
X				 */
X				input_state = IS_SLASH;
X			}
X			else {
X				if(!(remove_whitespace && isspace(bufchar))) {
X					putchar(bufchar);
X				}
X			}
X			break;
X			
X		    case IS_SLASH:
X		    	switch(bufchar) {
X			    case '*':
X			    	/*
X				 * Start of normal comment.
X				 */
X				input_state = IS_IN_COMMENT;
X				break;
X				
X			    case '/':
X			    	/*
X				 * Start of 'to-end-of-line' comment.
X				 */
X				input_state = IS_IN_END_COMMENT;
X				break;
X				
X			    default:
X			    	/*
X				 * Not the start of comment. Emit the '/'
X				 * we skipped last char in case we were
X				 * entering a comment this time, then the
X				 * current char.
X				 */
X				putchar('/');
X				if(!(remove_whitespace && isspace(bufchar))) {
X					putchar(bufchar);
X				}
X				input_state = IS_NORMAL;
X				break;
X			}
X			break;
X			
X		    case IS_IN_COMMENT:
X		    	if(bufchar == '*') {
X			    	/*
X				 * Maybe ending comment...
X				 */
X			    	input_state = IS_STAR;
X			}
X		    	break;
X	
X	
X		    case IS_STAR:
X		    	switch(bufchar) {
X			    case '/':
X				/*
X				 * End of normal comment.
X				 */
X				input_state = IS_NORMAL;
X				break;
X				
X			    case '*':
X			    	/*
X				 * Still could be one char away from end
X				 * of comment.
X				 */
X				break;
X				
X			    default:
X			    	/*
X				 * Still inside comment, no end in sight.
X				 */
X				input_state = IS_IN_COMMENT;
X				break;
X			}
X			break;
X			
X		    case IS_IN_END_COMMENT:
X		    	if(bufchar == '\n') {
X				/*
X				 * End of comment. Emit the newline if 
X				 * appropriate.
X				 */
X				if(!remove_whitespace) {
X					putchar(bufchar);
X				}
X				input_state = IS_NORMAL;
X			}
X			break;
X		
X		} /* switch input_state */
X	} 	  /* main read loop */
X	
X	/*
X	 * Done.
X	 */
X	return(exit_code);
X}
X
Xstatic volatile void usage(char **argv)
X{
X	printf("usage: %s infile [r(emove whitespace)]\n", argv[0]);
X	exit(1);
X}
END-of-usr.bin/decomment/decomment.c
exit

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040528200735.GA18621>