URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/or1k/tags/start/gdb-5.0/utils/spu
- from Rev 579 to Rev 1765
- ↔ Reverse comparison
Rev 579 → Rev 1765
/Makefile.in
0,0 → 1,124
# Copyright 1993, 1994 Free Software Foundation, Inc. |
|
# This file is part of GNU CC. |
|
# This program is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2 of the License, or |
# (at your option) any later version. |
# |
# This program is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with this program; if not, write to the Free Software |
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
prefix = /usr/local |
|
program_transform_name = |
exec_prefix = $(prefix) |
bindir = $(exec_prefix)/bin |
libdir = $(exec_prefix)/lib |
tooldir = $(libdir)/$(target_alias) |
|
datadir = $(prefix)/share |
mandir = $(prefix)/man |
man1dir = $(mandir)/man1 |
man2dir = $(mandir)/man2 |
man3dir = $(mandir)/man3 |
man4dir = $(mandir)/man4 |
man5dir = $(mandir)/man5 |
man6dir = $(mandir)/man6 |
man7dir = $(mandir)/man7 |
man8dir = $(mandir)/man8 |
man9dir = $(mandir)/man9 |
infodir = $(prefix)/info |
includedir = $(prefix)/include |
|
SHELL = /bin/sh |
|
INSTALL = install -c |
INSTALL_PROGRAM = $(INSTALL) |
INSTALL_DATA = $(INSTALL) |
|
AR = ar |
AR_FLAGS = qv |
RANLIB = ranlib |
|
# Directory containing source files. Don't clean up the spacing, |
# this exact string is matched for by the "configure" script. |
srcdir = . |
|
# Where is the "include" directory? Traditionally ../include or ./include |
|
INCLUDE_DIR = ${srcdir}/../../include |
INCLUDE_DEP = $$(INCLUDE_DIR) |
|
# All the includes used for CFLAGS and for lint. |
# -I. for config files. |
# -I${srcdir} possibly for regex.h also. |
# -I${srcdir}/config for more generic config files. |
|
INCLUDE_CFLAGS = -I. -I${srcdir} -I${srcdir}/config -I$(INCLUDE_DIR) |
|
# CFLAGS is specifically reserved for setting from the command line |
# when running make. I.E. "make CFLAGS=-Wmissing-prototypes". |
|
CFLAGS = -g |
|
# ALL_CFLAGS is the aggregate of all other *CFLAGS macros. |
|
ALL_CFLAGS = $(CFLAGS) $(INCLUDE_CFLAGS) |
|
# None of the things in CFLAGS will do any harm, and on some systems |
# (e.g. SunOS4) it is important to use the MH_CFLAGS. |
|
LDFLAGS = $(CFLAGS) |
|
# Where is the "-liberty" library, containing getopt and obstack? |
|
LIBIBERTY_DIR = ${srcdir}/../../libiberty |
LIBIBERTY = ./../../libiberty${subdir}/libiberty.a |
|
# Host and target-dependent makefile fragments come in here. |
#### |
# End of host and target-dependent makefile fragments |
|
# Prevent Sun make from putting in the machine type. Setting |
# TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1. |
|
.c.o: |
${CC} -c ${ALL_CFLAGS} $< |
|
OFILES = spu.o |
|
all: spu |
|
info: |
|
install: |
|
install-info: |
|
spu: ${OFILES} |
$(CC) $(CFLAGS) -o spu spu.o |
|
spu.o: spu.c |
|
mostlyclean: |
|
clean: mostlyclean |
rm -f *.o spu |
|
distclean: clean |
rm -f Makefile config.status |
|
maintainer-clean realclean: distclean |
|
Makefile: Makefile.in $(host_makefile_frag) $(target_makefile_frag) |
$(SHELL) config.status |
|
force: |
/configure.in
0,0 → 1,13
# This file is a shell script fragment that supplies the information |
# necessary to tailor a template configure script into the configure |
# script appropriate for this directory. For more information, check |
# any existing configure script. |
|
srctrigger=spu.c |
srcname="spu" |
|
# per-host: |
|
# per-target: |
|
# post-target: |
/ChangeLog
0,0 → 1,18
Tue Jun 25 23:19:38 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) |
|
* Makefile.in (datadir): Set to $(prefix)/share. |
(docdir): Removed. |
|
Wed Sep 20 13:42:55 1995 Ian Lance Taylor <ian@cygnus.com> |
|
* Makefile.in (maintainer-clean): New synonym for realclean. |
|
Sun Aug 6 11:47:49 1995 Fred Fish <fnf@cygnus.com> |
|
* Makefile.in (distclean): Remove Makefile and config.status. |
|
Mon Jun 27 11:39:55 1994 Stan Shebs (shebs@andros.cygnus.com) |
|
* configure.in, Makefile.in, README, spu.c: New files. |
|
|
/spu.c
0,0 → 1,933
/* spu -- A program to make lots of random C code. |
Copyright (C) 1993, 1994 Free Software Foundation, Inc. |
Contributed by Cygnus Support. Written by Stan Shebs. |
|
This file is part of SPU. |
|
SPU is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
|
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
|
You should have received a copy of the GNU General Public License |
along with this program; see the file COPYING. If not, write to |
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
/* This is a random program generator. */ |
|
#include <stdio.h> |
|
#include "ansidecl.h" |
|
/* The limits on these could be eliminated, but that would be |
some work. As they stand, the limits are enough to generate |
some truly enormous programs... */ |
|
#define MAXMACROS 50000 |
#define MAXMARGS 6 |
#define MAXSTRUCTS 1000 |
#define MAXSLOTS 20 |
#define MAXFUNCTIONS 50000 |
#define MAXFARGS 6 |
|
struct macro_desc { |
char *name; |
int numargs; |
char *args[MAXMARGS]; |
}; |
|
struct slot_desc { |
char *name; |
}; |
|
struct struct_desc { |
char *name; |
int numslots; |
struct slot_desc slots[MAXSLOTS]; |
}; |
|
/* (should add unions as type of struct) */ |
|
struct type_desc { |
char *name; |
}; |
|
struct function_desc { |
char *name; |
int numargs; |
char *args[MAXFARGS]; |
}; |
|
struct file_desc { |
char *name; |
}; |
|
void |
display_usage PARAMS ((void)); |
|
void |
init_xrandom PARAMS ((int seed)); |
|
int |
xrandom PARAMS ((int n)); |
|
char * |
copy_string PARAMS ((char *str)); |
|
char * |
xmalloc PARAMS ((int n)); |
|
char * |
gen_new_macro_name PARAMS ((int n)); |
|
char * |
gen_random_name PARAMS ((char *root)); |
|
char * |
gen_random_local_name PARAMS ((int n, char **others)); |
|
void |
write_struct PARAMS ((FILE *fp, int n)); |
|
void |
create_structs PARAMS ((void)); |
|
void |
create_macros PARAMS ((void)); |
|
void |
create_functions PARAMS ((void)); |
|
void |
write_header_file PARAMS ((int n)); |
|
void |
write_source_file PARAMS ((int n)); |
|
void |
write_macro PARAMS ((FILE *fp, int n)); |
|
void |
write_function_decl PARAMS ((FILE *fp, int n)); |
|
void |
write_function PARAMS ((FILE *fp, int n)); |
|
void |
write_statement PARAMS ((FILE *fp, int depth, int max_depth)); |
|
void |
write_expression PARAMS ((FILE *fp, int depth, int max_depth)); |
|
void |
write_makefile PARAMS ((void)); |
|
/* The default values are set low for testing purposes. |
Real values can get much larger. */ |
|
int numfiles = 5; |
int numheaderfiles = 1; |
|
char *file_base_name = "file"; |
|
int nummacros = 1000; |
|
int numstructs = 20; |
int numslots = MAXSLOTS; |
|
int numfunctions = 100; |
|
int function_length = 20; |
|
int num_functions_per_file; |
|
/* The amount of commenting in the source. */ |
|
int commenting = 0; |
|
struct macro_desc macros[MAXMACROS]; |
|
struct struct_desc structs[MAXSTRUCTS]; |
|
struct function_desc functions[MAXFUNCTIONS]; |
|
int num_computer_terms; |
|
/* Likely words to appear in names of things. */ |
|
char *computerese[] = { |
"make", |
"create", |
"alloc", |
"modify", |
"delete", |
"new", |
"add", |
"list", |
"array", |
"queue", |
"object", |
"of", |
"by", |
"point", |
"line", |
"rectangle", |
"shape", |
"area", |
"window", |
"null", |
NULL |
}; |
|
/* Return a word that commonly appears in programs. */ |
|
char * |
computer_word () |
{ |
if (num_computer_terms == 0) |
{ |
int i; |
|
for (i = 0; computerese[i] != NULL; ++i) ; |
num_computer_terms = i; |
} |
return computerese[xrandom (num_computer_terms)]; |
} |
|
main (argc, argv) |
int argc; |
char **argv; |
{ |
int i, num; |
char *arg; |
FILE *fp; |
|
/* Parse all the arguments. */ |
/* (should check on numeric values) */ |
for (i = 1; i < argc; ++i) |
{ |
arg = argv[i]; |
if (strcmp(arg, "--comments") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
commenting = num; |
} |
else if (strcmp(arg, "--files") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
numfiles = num; |
} |
else if (strcmp(arg, "--functions") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
numfunctions = num; |
} |
else if (strcmp(arg, "--function-length") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
function_length = num; |
} |
else if (strcmp(arg, "--function-depth") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
/* (should use this!) */ |
} |
else if (strcmp(arg, "--header-files") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
numheaderfiles = num; |
} |
else if (strcmp(arg, "--help") == 0) |
{ |
display_usage (); |
exit (0); |
} |
else if (strcmp(arg, "--macros") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
nummacros = num; |
} |
else if (strcmp(arg, "--slots") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
numslots = num; |
} |
else if (strcmp(arg, "--structs") == 0) |
{ |
num = strtol (argv[++i], NULL, 10); |
numstructs = num; |
} |
else if (strcmp(arg, "--version") == 0) |
{ |
fprintf (stderr, "SPU program generator version 0.1\n"); |
exit (0); |
} |
else |
{ |
fprintf (stderr, "Usage: \"%s\" not valid, ignored\n", arg); |
display_usage (); |
} |
} |
init_xrandom (-1); |
/* Create the definitions of objects internally. */ |
create_macros (); |
create_structs (); |
create_functions (); |
num_functions_per_file = numfunctions / numfiles; |
/* Write out a bunch of files. */ |
printf ("Writing %d header files...\n", numheaderfiles); |
for (i = 0; i < numheaderfiles; ++i) |
write_header_file (i); |
printf ("Writing %d files...\n", numfiles); |
for (i = 0; i < numfiles; ++i) |
write_source_file (i); |
/* Write out a makefile. */ |
write_makefile (); |
/* Succeed if we actually wrote out a whole program correctly. */ |
exit (0); |
} |
|
void |
display_usage () |
{ |
fprintf (stderr, "Usage: spu [ ... options ... ]\n"); |
fprintf (stderr, " --comments <n>\n"); |
fprintf (stderr, " --files <n>\n"); |
fprintf (stderr, " --functions <n>\n"); |
fprintf (stderr, " --function-length <n>\n"); |
fprintf (stderr, " --function-depth <n>\n"); |
fprintf (stderr, " --help\n"); |
fprintf (stderr, " --macros <n>\n"); |
fprintf (stderr, " --slots <n>\n"); |
fprintf (stderr, " --structs <n>\n"); |
fprintf (stderr, " --version\n"); |
} |
|
int |
create_type (str) |
char *str; |
{ |
int i; |
|
return 1; |
} |
|
int |
random_type () |
{ |
return 1; |
} |
|
char * |
name_from_type (n) |
int n; |
{ |
return "int"; |
} |
|
/* Generate a macro name that is unique if the given n is unique. */ |
|
char * |
gen_new_macro_name (n) |
int n; |
{ |
int i = 0; |
char namebuf[100]; |
|
++n; |
namebuf[i] = '\0'; |
strcat (namebuf, computer_word ()); |
i = strlen (namebuf); |
namebuf[i++] = '_'; |
namebuf[i++] = 'M'; |
while (n > 0) |
{ |
namebuf[i++] = 'a' + (n % 26); |
n /= 26; |
} |
namebuf[i] = '\0'; |
return copy_string (namebuf); |
} |
|
/* Create basic definitions of macros. */ |
|
void |
create_macros() |
{ |
int i, j, numargs; |
|
printf ("Creating %d macros...\n", nummacros); |
for (i = 0; i < nummacros; ++i) |
{ |
macros[i].name = gen_new_macro_name (i); |
numargs = xrandom (MAXMARGS + 1); |
for (j = 0; j < numargs; ++j) |
{ |
macros[i].args[j] = gen_random_local_name(j, NULL); |
} |
macros[i].numargs = numargs; |
} |
} |
|
/* Generate a unique structure name, based on the number n. */ |
|
char * |
gen_new_struct_name (n) |
int n; |
{ |
int i = 0; |
char namebuf[100]; |
|
++n; |
namebuf[i++] = 's'; |
namebuf[i++] = '_'; |
while (n > 0) |
{ |
namebuf[i++] = 'a' + (n % 26); |
n /= 26; |
} |
namebuf[i] = '\0'; |
if (xrandom (4) == 0) |
strcat (namebuf, "_struct"); |
return copy_string (namebuf); |
} |
|
char * |
gen_random_slot_name (n) |
int n; |
{ |
char namebuf[100]; |
|
/* (should have more variety) */ |
sprintf (namebuf, "slot%d", n); |
return copy_string (namebuf); |
} |
|
/* Create definitions of the desired number of structures. */ |
|
void |
create_structs() |
{ |
int i, j; |
|
printf ("Creating %d structs...\n", numstructs); |
for (i = 0; i < numstructs; ++i) |
{ |
structs[i].name = gen_new_struct_name(i); |
for (j = 0; j < 20; ++j) |
{ |
structs[i].slots[j].name = gen_random_slot_name (j); |
} |
structs[i].numslots = j; |
} |
} |
|
/* Generate a function name that is unique if n is unique. */ |
|
char * |
gen_new_function_name (n) |
int n; |
{ |
int i = 0; |
char namebuf[100]; |
|
++n; |
namebuf[i] = '\0'; |
/* Start with a random computer term. */ |
if (xrandom (5) == 0) |
{ |
strcat (namebuf, computer_word ()); |
i = strlen (namebuf); |
namebuf[i++] = '_'; |
} |
namebuf[i++] = 'f'; |
/* Note that if we just add an 'f', there is a small chance of getting |
the name "for", which make the compiler unhappy. */ |
namebuf[i++] = 'n'; |
/* Convert the number n itself into a string, maybe with some underscores |
thrown in for flavor. */ |
while (n > 0) |
{ |
if (xrandom(4) == 0) namebuf[i++] = '_'; |
namebuf[i++] = 'a' + (n % 26); |
n /= 26; |
} |
namebuf[i] = '\0'; |
/* Maybe add some more computerese on the end. */ |
if (xrandom (4) != 0) |
{ |
namebuf[i++] = '_'; |
namebuf[i] = '\0'; |
strcat (namebuf, computer_word ()); |
} |
return copy_string (namebuf); |
} |
|
/* Create a number of functions with random numbers of arguments. */ |
|
/* (should gen with random arg types also) */ |
|
void |
create_functions() |
{ |
int i, j, numargs; |
|
printf ("Creating %d functions...\n", numfunctions); |
for (i = 0; i < numfunctions; ++i) |
{ |
functions[i].name = gen_new_function_name(i); |
numargs = xrandom (MAXFARGS + 1); |
for (j = 0; j < numargs; ++j) |
{ |
functions[i].args[j] = gen_random_local_name(j, NULL); |
} |
functions[i].numargs = numargs; |
} |
} |
|
void |
write_header_file (n) |
int n; |
{ |
int i; |
char tmpbuf[100]; |
FILE *fp; |
|
sprintf (tmpbuf, "%s%d.h", file_base_name, n); |
fp = fopen (tmpbuf, "w"); |
if (fp) |
{ |
if (commenting > 0) |
fprintf (fp, "/* header */\n"); |
if (1) |
{ |
printf ("Writing %d structs...\n", numstructs); |
for (i = 0; i < numstructs; ++i) |
{ |
write_struct (fp, i); |
} |
} |
if (1) |
{ |
printf ("Writing %d macros...\n", nummacros); |
for (i = 0; i < nummacros; ++i) |
{ |
write_macro (fp, i); |
} |
} |
if (1) |
{ |
printf ("Writing %d function decls...\n", numfunctions); |
for (i = 0; i < numfunctions; ++i) |
{ |
write_function_decl (fp, i); |
} |
} |
fclose (fp); |
} |
} |
|
/* Write out the definition of a structure. */ |
|
void |
write_struct (fp, i) |
FILE *fp; |
int i; |
{ |
int j; |
|
if (i == 0) printf (" (Each struct contains %d slots)\n", numslots); |
fprintf (fp, "struct %s {\n", structs[i].name); |
for (j = 0; j < structs[i].numslots; ++j) |
{ |
fprintf (fp, " %s %s;\n", |
name_from_type (random_type ()), structs[i].slots[j].name); |
} |
fprintf (fp, "};\n\n"); |
} |
|
void |
write_macro (fp, n) |
FILE *fp; |
int n; |
{ |
int i, j; |
|
fprintf (fp, "#define %s", macros[n].name); |
if (1) |
{ |
fprintf (fp, "("); |
for (j = 0; j < macros[n].numargs; ++j) |
{ |
if (j > 0) fprintf (fp, ","); |
fprintf (fp, "%s", macros[n].args[j]); |
} |
fprintf (fp, ")"); |
} |
/* Generate a macro body. */ |
switch (xrandom(2)) |
{ |
case 0: |
fprintf (fp, "\\\n"); |
fprintf (fp, "("); |
if (macros[n].numargs > 0) |
{ |
for (i = 0; i < macros[n].numargs; ++i) |
{ |
if (i > 0) fprintf (fp, ","); |
fprintf (fp, " \\\n"); |
fprintf (fp, " (%s)", macros[n].args[i]); |
if (xrandom (2) == 0) |
{ |
fprintf (fp, ","); |
fprintf (fp, " \\\n"); |
fprintf (fp, " ((int) (%s))", macros[n].args[i]); |
} |
} |
fprintf (fp, "\\\n"); |
} |
else |
{ |
fprintf (fp, " (1)"); |
} |
fprintf (fp, ")"); |
break; |
default: |
fprintf (fp, " (1)"); |
break; |
} |
fprintf (fp, "\n\n"); |
} |
|
void |
write_function_decl (fp, n) |
FILE *fp; |
int n; |
{ |
fprintf (fp, "int %s (", functions[n].name); |
fprintf (fp, ");\n"); |
} |
|
/* Write a complete source file. */ |
|
void |
write_source_file (n) |
int n; |
{ |
char tmpbuf[100]; |
int j, k; |
FILE *fp; |
|
sprintf (tmpbuf, "%s%d.c", file_base_name, n); |
fp = fopen (tmpbuf, "w"); |
if (fp) |
{ |
if (numheaderfiles > 0) |
{ |
for (j = 0; j < numheaderfiles; ++j) |
{ |
fprintf(fp, "#include \"%s%d.h\"\n", file_base_name, j); |
} |
fprintf(fp, "\n"); |
} |
|
if (n == 0) printf (" (Each file contains %d functions)\n", |
num_functions_per_file); |
|
/* Put out a "main", but only in the first C file. */ |
if (n == 0) |
{ |
fprintf (fp, "main ()\n"); |
fprintf (fp, "{\n"); |
if (1 /* use stdio */) |
{ |
fprintf (fp, " printf (\"hello world\\n\");\n"); |
/* (should issue calls to other functions?) */ |
} |
fprintf (fp, "}\n\n"); |
} |
|
for (j = 0; j < num_functions_per_file; ++j) |
{ |
write_function (fp, n * num_functions_per_file + j); |
} |
} |
fclose (fp); |
} |
|
void |
write_function (fp, n) |
FILE *fp; |
int n; |
{ |
int k; |
|
fprintf(fp, "%s ()\n", functions[n].name); |
fprintf(fp, "{\n"); |
/* Generate a plausible function body. */ |
for (k = 0; k < function_length; ++k) |
{ |
write_statement (fp, 0, xrandom(2) + 1); |
} |
fprintf (fp, "}\n\n"); |
} |
|
void |
write_statement (fp, depth, max_depth) |
FILE *fp; |
int depth, max_depth; |
{ |
int n, j; |
|
/* Always do non-recursive statements if going too deep. */ |
if (depth >= max_depth || xrandom(2) == 0) |
{ |
switch (xrandom(2)) |
{ |
default: |
write_expression (fp, 0, xrandom(4) + 1); |
fprintf (fp, ";\n"); |
break; |
} |
} |
else |
{ |
switch (xrandom(2)) |
{ |
default: |
fprintf (fp, "if ("); |
write_expression (fp, 0, xrandom(2) + 1); |
fprintf (fp, ")\n {\n"); |
write_statement(fp, depth + 1, max_depth); |
fprintf (fp, " }\n"); |
break; |
} |
} |
} |
|
/* Write a single expression. */ |
|
void |
write_expression (fp, depth, max_depth) |
FILE *fp; |
int depth, max_depth; |
{ |
int n, j; |
|
/* Always do non-recursive statements if going too deep. */ |
if (depth >= max_depth || xrandom(2) == 0) |
{ |
switch (xrandom(10)) |
{ |
case 7: |
fprintf (fp, "%d", xrandom (1000)); |
break; |
default: |
fprintf (fp, "%d", xrandom (127)); |
break; |
} |
} |
else |
{ |
switch (xrandom(10)) |
{ |
case 0: |
case 5: |
case 7: |
n = xrandom (numfunctions); |
fprintf(fp, " %s (", functions[n].name); |
for (j = 0; j < functions[n].numargs; ++j) |
{ |
if (j > 0) fprintf (fp, ", "); |
write_expression(fp, depth + 1, max_depth); |
} |
fprintf(fp, ")"); |
break; |
case 1: |
case 6: |
case 8: |
n = xrandom (nummacros); |
fprintf(fp, " %s(", macros[n].name); |
for (j = 0; j < macros[n].numargs; ++j) |
{ |
if (j > 0) fprintf (fp, ", "); |
write_expression(fp, depth + 1, max_depth); |
} |
fprintf(fp, ")"); |
break; |
case 2: |
write_expression (fp, depth + 1, max_depth); |
fprintf (fp, " + "); |
write_expression (fp, depth + 1, max_depth); |
break; |
case 3: |
write_expression (fp, depth + 1, max_depth); |
fprintf (fp, " - "); |
write_expression (fp, depth + 1, max_depth); |
break; |
case 4: |
write_expression (fp, depth + 1, max_depth); |
fprintf (fp, " * "); |
write_expression (fp, depth + 1, max_depth); |
break; |
default: |
fprintf (fp, "%d", xrandom (127)); |
break; |
} |
} |
} |
|
/* Write out a makefile that will compile the program just generated. */ |
|
void |
write_makefile () |
{ |
char tmpbuf[100]; |
int i, j; |
FILE *fp; |
|
sprintf (tmpbuf, "%s.mk", file_base_name); |
fp = fopen (tmpbuf, "w"); |
if (fp) |
{ |
fprintf (fp, "CC = cc\n\n"); |
/* Write dependencies and action line for the executable. */ |
fprintf (fp, "%s: ", file_base_name); |
for (i = 0; i < numfiles; ++i) |
fprintf (fp, " %s%d.o", file_base_name, i); |
fprintf (fp, "\n"); |
fprintf (fp, "\t$(CC) -o %s.out", file_base_name); |
for (i = 0; i < numfiles; ++i) |
fprintf (fp, " %s%d.o", file_base_name, i); |
fprintf (fp, "\n\n"); |
/* Write dependencies for individual files. */ |
for (i = 0; i < numfiles; ++i) |
{ |
fprintf (fp, " %s%d.o: %s%d.c", |
file_base_name, i, file_base_name, i); |
for (j = 0; j < numheaderfiles; ++j) |
fprintf (fp, " %s%d.h", file_base_name, j); |
fprintf (fp, "\n"); |
} |
fclose (fp); |
} |
} |
|
|
/* Utility/general functions. */ |
|
char * |
gen_random_name (root) |
char *root; |
{ |
char namebuf[100]; |
|
if (root == NULL) root = "n"; |
sprintf (namebuf, "%s_%d", root, xrandom (10000)); |
return copy_string (namebuf); |
} |
|
/* Generate a local variable name. */ |
|
char * |
gen_random_local_name (numothers, others) |
int numothers; |
char **others; |
{ |
char namebuf[100]; |
|
sprintf (namebuf, "arg%d", numothers + 1); |
return copy_string (namebuf); |
} |
|
#include <time.h> |
|
/* Random number handling is important but terrible/nonexistent |
in some systems. Do it ourselves. Also, this will give repeatable |
results across multiple platforms. */ |
|
/* The random state *must* be at least 32 bits. */ |
|
unsigned long initrandstate = 0; |
|
unsigned long randstate = 0; |
|
/* Seed can come from elsewhere, for repeatability. Otherwise, it comes |
from the current time, scaled down to where 32-bit arithmetic won't |
overflow. */ |
|
void |
init_xrandom (seed) |
int seed; |
{ |
time_t tm; |
|
if (seed > 0) |
{ |
/* If the random state is already set, changes are somewhat |
suspicious. */ |
if (randstate > 0) |
{ |
fprintf (stderr, "Randstate being changed from %lu to %d\n", |
randstate, seed); |
} |
randstate = seed; |
} |
else |
{ |
time (&tm); |
randstate = tm; |
} |
/* Whatever its source, put the randstate into known range (0 - 99999). */ |
randstate = abs (randstate); |
randstate %= 100000L; |
/* This is kept around for the sake of error reporting. */ |
initrandstate = randstate; |
} |
|
/* Numbers lifted from Numerical Recipes, p. 198. */ |
/* Arithmetic must be 32-bit. */ |
|
int |
xrandom (m) |
int m; |
{ |
randstate = (8121 * randstate + 28411) % 134456L; |
return ((m * randstate) / 134456L); |
} |
|
char * |
xmalloc (amt) |
int amt; |
{ |
char *value = (char *) malloc (amt); |
|
if (value == NULL) |
{ |
/* This is pretty serious, have to get out quickly. */ |
fprintf (stderr, "Memory exhausted!!\n"); |
exit (1); |
} |
/* Save callers from having to clear things themselves. */ |
bzero (value, amt); |
return value; |
} |
|
/* Copy a string to newly-allocated space. The new space is never freed. */ |
|
char * |
copy_string (str) |
char *str; |
{ |
int len = strlen (str); |
char *rslt; |
|
rslt = xmalloc (len + 1); |
strcpy (rslt, str); |
return rslt; |
} |
/README
0,0 → 1,39
This directory contains version 0.1 of the Software Productivity Unit |
(SPU, pronounced ``spew''), which is a random program generator. |
|
To configure, say `./configure'. |
|
To build, say `make'. |
|
To run, say `spu'. This will produce a set of .h and .c files, plus a .mk |
file which is a Makefile. All the generated files share a prefix, which |
defaults to "file", and can be set with the `--prefix' option. |
|
To compile the generated program, you can say either |
|
make -f file.mk |
|
or |
|
gcc file*.c |
|
By default, SPU does not generate a large program. To generate larger |
programs, you can use the `--functions' option to set the number of |
functions that will be generated. For instance, `--functions 10000' |
together with default values for the other options, will generate 600,000 |
lines or about 10MB of source code. |
|
To find out about the other available options, use the `--help' option. |
|
TO DO |
|
Finish describing the command options. |
|
Generate more kinds of program constructs. |
|
Add more kinds of macro generation. |
|
Make the output code look more normal. |
|
Generate runnable programs. |
|