#!/usr/bin/perl -w use Getopt::Std; our($opt_m,$opt_c); sub help { print "\nnewclass [-m|-c] basenames\n\n", "Makes class files (and makefile if -m)\n", "-c makes c source and makefile instead of c++\n"; exit; } sub make_make { my $cmode=shift; my $objs=join('.o ',@_).'.o'; open(M,">makefile") or die("Can't create makefile: $!\n"); print M "CC = gcc\n", "LD = gcc\n", "CFLAGS = -I\$(HOME)/include -ggdb -Wall -Werror -ansi\n"; if($cmode){ print M "LDFLAGS = -L\$(HOME)/lib -lc\n"; } else{ print M "LDFLAGS = -L\$(HOME)/lib -lstdc++\n"; } print M "DEPENDENCIES = ./make.depend\n", "\n", "TARGET = a.out\n", "OBJS = ${objs}\n", "\n", "all: \$(TARGET)\n", "\n", "\$(TARGET): \$(OBJS)\n", " \$(LD) -o \$@ \$^ \$(LDFLAGS)\n", "\n"; if($cmode){ print M "%.o: %.c\n", " \$(CC) -x c -c \$(CFLAGS) \$<\n"; } else{ print M "%.o: %.cpp\n", " \$(CC) -x c++ -c \$(CFLAGS) \$<\n"; } print M "\n", ".PHONY: clean\n", "clean:\n", " rm -f \$(TARGET) \$(OBJS)\n", "\n", ".PHONY: realclean\n", "realclean: clean\n", " rm -f *~\n", "\n", ".PHONY: run\n", "run: \$(TARGET)\n", " ./\$(TARGET)\n", "\n", ".PHONY: install\n", "install: \$(TARGET)\n", " cp \$(TARGET) \$(HOME)/bin\n", "\n", "\$(DEPENDENCIES): depend\n", "\n", ".PHONY: depend\n", "depend:\n"; if($cmode){ print M " \$(CC) \$(CFLAGS) -MM *.c > \$(DEPENDENCIES)\n"; } else{ print M " \$(CC) \$(CFLAGS) -MM *.cpp > \$(DEPENDENCIES)\n"; } print M "\n", "-include \$(DEPENDENCIES)\n"; close M; } sub make_header { my $cmode=shift; my $name=shift; my $hdr_name=""; if($cmode){ $hdr_name="$name.h"; } else{ $hdr_name="$name.hpp"; } open(H,">${hdr_name}") or die("Can't create header file: $!\n"); my $uc_name=$name; $uc_name=~y/[a-z]/[A-Z]/; if($cmode){ print H "#ifndef ${uc_name}_H\n", "#define ${uc_name}_H\n", "#endif /* ${uc_name}_H */\n"; } else{ print H "#ifndef ${uc_name}_HPP\n", "#define ${uc_name}_HPP\n", "#include \n\n", "class $name\n", "{\n", " ${name}(const ${name}& c);\n", " ${name}& ${name}::operator=(const ${name}& c);\n", "public:\n", " ${name}();\n", " virtual ~${name}();\n", "};\n\n", "#endif // ${uc_name}_HPP\n"; } close H; } sub make_src { my $cmode=shift; my ${name}=shift; my $src_name=""; if($cmode){ $src_name="$name.c"; } else{ $src_name="$name.cpp"; } open(S,">${src_name}") or die("Can't create source file: $!\n"); if($cmode){ print S "#include \n", "#include \n\n"; } else{ print S "#include \n", "#include \"${name}.hpp\"\n", "\n", "${name}::\n"; } close S; } sub make_main { my $cmode=shift; my $src_name=""; if($cmode){ $src_name="main.c"; } else{ $src_name="main.cpp"; } open(S,">${src_name}") or die("Can't create main: $!\n"); if($cmode){ print S "#include \n", "#include \n", } else{ print S "#include \n"; } print S "\n", "int main(int argc, char **argv)\n", "{\n", " return 0;\n", "}\n"; close S; } help unless @ARGV; getopts('mc'); $cmode=$opt_c; if($opt_m){ make_make($cmode,@ARGV); } for(@ARGV){ if($_ eq "main"){ make_main($cmode); } else{ make_header($cmode,$_); make_src($cmode,$_); } }