Changes In Branch pure-c Through [20809b08ce] Excluding Merge-Ins
This is equivalent to a diff from 992994189a to 20809b08ce
2020-03-25
| ||
00:24 | Integrate pure C version check-in: eebfe1f40f user: rkeene tags: trunk | |
2019-12-02
| ||
02:44 | Implemented completed xvfs-create-c check-in: 0ffa676110 user: rkeene tags: pure-c | |
2019-12-01
| ||
00:17 | Added the C file itself check-in: 20809b08ce user: rkeene tags: pure-c | |
00:16 | Started work on xvfs-create-c, a pure C version of the builder with no dependencies check-in: ae8437b96b user: rkeene tags: pure-c | |
2019-11-14
| ||
23:39 | Revert [ac58551e55], needs more work check-in: 992994189a user: rkeene tags: trunk | |
23:14 | Updated to use Tcl-computed mechanism for building shared objects check-in: ac58551e55 user: rkeene tags: trunk | |
Modified Makefile from [fa4437d0b1] to [b414b18e08].
1 2 3 4 5 6 7 8 9 10 11 | TCL_CONFIG_SH := /usr/lib64/tclConfig.sh XVFS_ROOT_MOUNTPOINT := //xvfs:/ CPPFLAGS := -DXVFS_ROOT_MOUNTPOINT='"$(XVFS_ROOT_MOUNTPOINT)"' -I. -DUSE_TCL_STUBS=1 -DXVFS_DEBUG $(shell . "${TCL_CONFIG_SH}" && echo "$${TCL_INCLUDE_SPEC}") $(XVFS_ADD_CPPFLAGS) CFLAGS := -fPIC -g3 -ggdb3 -Wall $(XVFS_ADD_CFLAGS) LDFLAGS := $(XVFS_ADD_LDFLAGS) LIBS := $(shell . "${TCL_CONFIG_SH}" && echo "$${TCL_STUB_LIB_SPEC}") TCLSH := tclsh LIB_SUFFIX := $(shell . "${TCL_CONFIG_SH}"; echo "$${TCL_SHLIB_SUFFIX:-.so}") all: example-standalone$(LIB_SUFFIX) example-client$(LIB_SUFFIX) example-flexible$(LIB_SUFFIX) xvfs$(LIB_SUFFIX) | | > > | > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | TCL_CONFIG_SH := /usr/lib64/tclConfig.sh XVFS_ROOT_MOUNTPOINT := //xvfs:/ CPPFLAGS := -DXVFS_ROOT_MOUNTPOINT='"$(XVFS_ROOT_MOUNTPOINT)"' -I. -DUSE_TCL_STUBS=1 -DXVFS_DEBUG $(shell . "${TCL_CONFIG_SH}" && echo "$${TCL_INCLUDE_SPEC}") $(XVFS_ADD_CPPFLAGS) CFLAGS := -fPIC -g3 -ggdb3 -Wall $(XVFS_ADD_CFLAGS) LDFLAGS := $(XVFS_ADD_LDFLAGS) LIBS := $(shell . "${TCL_CONFIG_SH}" && echo "$${TCL_STUB_LIB_SPEC}") TCLSH := tclsh LIB_SUFFIX := $(shell . "${TCL_CONFIG_SH}"; echo "$${TCL_SHLIB_SUFFIX:-.so}") all: example-standalone$(LIB_SUFFIX) example-client$(LIB_SUFFIX) example-flexible$(LIB_SUFFIX) xvfs$(LIB_SUFFIX) example.c: $(shell find example -type f) $(shell find lib -type f) lib/xvfs/xvfs.c.rvt xvfs-create-c xvfs-create Makefile rm -f example.c.new.1 example.c.new.2 ./xvfs-create-c --directory example --name example > example.c.new.1 ./xvfs-create --directory example --name example > example.c.new.2 diff -u example.c.new.1 example.c.new.2 rm -f example.c.new.2 mv example.c.new.1 example.c example-standalone.o: example.c xvfs-core.h xvfs-core.c Makefile $(CC) $(CPPFLAGS) -DXVFS_MODE_STANDALONE $(CFLAGS) -o example-standalone.o -c example.c example-standalone$(LIB_SUFFIX): example-standalone.o Makefile $(CC) $(CFLAGS) $(LDFLAGS) -shared -o example-standalone$(LIB_SUFFIX) example-standalone.o $(LIBS) |
︙ | ︙ | |||
41 42 43 44 45 46 47 48 49 50 51 52 53 54 | # like lib/minirivet, xvfs-core.c, etc) version of "xvfs-create" xvfs-create-standalone: $(shell find lib -type f) xvfs-create xvfs-core.c xvfs-core.h lib/xvfs/xvfs.c.rvt Makefile rm -f xvfs-create-standalone.new xvfs-create-standalone ./xvfs-create --dump-tcl --remove-debug > xvfs-create-standalone.new chmod +x xvfs-create-standalone.new mv xvfs-create-standalone.new xvfs-create-standalone xvfs_random$(LIB_SUFFIX): $(shell find example -type f) $(shell find lib -type f) lib/xvfs/xvfs.c.rvt xvfs-create-random Makefile ./xvfs-create-random | $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DXVFS_MODE_FLEXIBLE -x c - -shared -o xvfs_random$(LIB_SUFFIX) $(LIBS) xvfs_synthetic$(LIB_SUFFIX): $(shell find lib -type f) lib/xvfs/xvfs.c.rvt xvfs-create-synthetic Makefile ./xvfs-create-synthetic | $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DXVFS_MODE_FLEXIBLE -x c - -shared -o xvfs_synthetic$(LIB_SUFFIX) $(LIBS) do-benchmark: | > > > > > > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # like lib/minirivet, xvfs-core.c, etc) version of "xvfs-create" xvfs-create-standalone: $(shell find lib -type f) xvfs-create xvfs-core.c xvfs-core.h lib/xvfs/xvfs.c.rvt Makefile rm -f xvfs-create-standalone.new xvfs-create-standalone ./xvfs-create --dump-tcl --remove-debug > xvfs-create-standalone.new chmod +x xvfs-create-standalone.new mv xvfs-create-standalone.new xvfs-create-standalone xvfs-create-c: xvfs-create-c.o $(CC) $(CFLAGS) $(LDFLAGS) -o xvfs-create-c xvfs-create-c.o $(LIBS) xvfs-create-c.o: xvfs-create-c.c $(CC) $(CPPFLAGS) $(CFLAGS) -o xvfs-create-c.o -c xvfs-create-c.c xvfs_random$(LIB_SUFFIX): $(shell find example -type f) $(shell find lib -type f) lib/xvfs/xvfs.c.rvt xvfs-create-random Makefile ./xvfs-create-random | $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DXVFS_MODE_FLEXIBLE -x c - -shared -o xvfs_random$(LIB_SUFFIX) $(LIBS) xvfs_synthetic$(LIB_SUFFIX): $(shell find lib -type f) lib/xvfs/xvfs.c.rvt xvfs-create-synthetic Makefile ./xvfs-create-synthetic | $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DXVFS_MODE_FLEXIBLE -x c - -shared -o xvfs_synthetic$(LIB_SUFFIX) $(LIBS) do-benchmark: |
︙ | ︙ | |||
95 96 97 98 99 100 101 | ./profile-gperf gprof ./profile-gperf valgrind --tool=callgrind --callgrind-out-file=callgrind.out ./profile-bare 10 2 callgrind_annotate callgrind.out clean: rm -f xvfs-create-standalone.new xvfs-create-standalone | > | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | ./profile-gperf gprof ./profile-gperf valgrind --tool=callgrind --callgrind-out-file=callgrind.out ./profile-bare 10 2 callgrind_annotate callgrind.out clean: rm -f xvfs-create-standalone.new xvfs-create-standalone rm -f xvfs-create-c.o xvfs-create-c rm -f example.c example.c.new example.c.new.1 example.c.new.2 rm -f example-standalone$(LIB_SUFFIX) example-standalone.o rm -f example-client.o example-client$(LIB_SUFFIX) rm -f example-flexible.o example-flexible$(LIB_SUFFIX) rm -f xvfs.o xvfs$(LIB_SUFFIX) rm -f example-standalone.gcda example-standalone.gcno rm -f example-client.gcda example-client.gcno rm -f example-flexible.gcda example-flexible.gcno |
︙ | ︙ |
Modified lib/xvfs/xvfs.c.rvt from [ced159acac] to [becb8ac3f3].
1 2 | <? if {[info exists ::xvfs::xvfsCoreH]} { | > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <? # Care must be taken when editing this file as # it may be processed by either "xvfs-create" # which uses a full Tcl and Rivet parser # or by "xvfs-create-c" which uses a much # simpler one that only knows about printable # sections and ignores all Tcl sections if {[info exists ::xvfs::xvfsCoreH]} { ::minirivet::_emitOutput $::xvfs::xvfsCoreH } else { ?>#include <xvfs-core.h><? } ?> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <tcl.h> |
︙ | ︙ | |||
51 52 53 54 55 56 57 | } data; }; #endif <? package require xvfs | | | < | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | } data; }; #endif <? package require xvfs set ::xvfs::fileInfoStruct [xvfs::main $::xvfs::argv] ?><?= $::xvfs::fileInfoStruct ?> static long xvfs_<?= $::xvfs::fsName ?>_nameToIndex(const char *path) { <? if {[llength $::xvfs::outputFiles] < 3} { set hashMode perfectHashFunction } else { set hashMode hashTable } |
︙ | ︙ |
Modified lib/xvfs/xvfs.tcl from [842e8c1c67] to [6afa223420].
1 2 3 4 5 6 7 8 9 | #! /usr/bin/env tclsh namespace eval ::xvfs {} namespace eval ::xvfs::callback {} set ::xvfs::_xvfsDir [file dirname [info script]] # Functions proc ::xvfs::_emitLine {line} { | < < < | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #! /usr/bin/env tclsh namespace eval ::xvfs {} namespace eval ::xvfs::callback {} set ::xvfs::_xvfsDir [file dirname [info script]] # Functions proc ::xvfs::_emitLine {line} { lappend ::xvfs::_emitLine $line } proc ::xvfs::printHelp {channel {errors ""}} { if {[llength $errors] != 0} { foreach error $errors { puts $channel "error: $error" } |
︙ | ︙ | |||
278 279 280 281 282 283 284 285 286 287 288 289 290 291 | } ## 3. Start processing directory and producing initial output set ::xvfs::outputFiles [processDirectory $fsName $rootDirectory] set ::xvfs::fsName $fsName set ::xvfs::rootDirectory $rootDirectory } proc ::xvfs::run {args} { uplevel #0 { package require minirivet } set ::xvfs::argv $args ::minirivet::parse [file join $::xvfs::_xvfsDir xvfs.c.rvt] | > > > | 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 | } ## 3. Start processing directory and producing initial output set ::xvfs::outputFiles [processDirectory $fsName $rootDirectory] set ::xvfs::fsName $fsName set ::xvfs::rootDirectory $rootDirectory # Return the output return [join $::xvfs::_emitLine "\n"] } proc ::xvfs::run {args} { uplevel #0 { package require minirivet } set ::xvfs::argv $args ::minirivet::parse [file join $::xvfs::_xvfsDir xvfs.c.rvt] |
︙ | ︙ |
Added xvfs-create-c.c version [a50f6e796a].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | #include <string.h> #include <stdio.h> #include <ctype.h> struct options { char *name; char *directory; }; enum xvfs_minirivet_mode { XVFS_MINIRIVET_MODE_COPY, XVFS_MINIRIVET_MODE_TCL, XVFS_MINIRIVET_MODE_TCL_PRINT }; static int parse_options(int argc, char **argv, struct options *options) { char *arg; char **option; int idx; int retval; for (idx = 0; idx < argc; idx++) { arg = argv[idx]; if (strcmp(arg, "--directory") == 0) { option = &options->directory; } else if (strcmp(arg, "--name") == 0) { option = &options->name; } else { fprintf(stderr, "Invalid argument %s\n", arg); return(0); } idx++; arg = argv[idx]; *option = arg; } retval = 1; if (!options->directory) { fprintf(stderr, "error: --directory must be specified\n"); retval = 0; } if (!options->name) { fprintf(stderr, "error: --name must be specified\n"); retval = 0; } return(retval); } static void parse_xvfs_minirivet_directory(FILE *outfp, const char * const directory) { fprintf(outfp, "\t...\n"); } static int parse_xvfs_minirivet(FILE *outfp, const char * const file, const char * const name, const char * const directory) { FILE *fp; int ch, ch_buf[3]; char tcl_buffer[8192], *tcl_buffer_p, *tcl_buffer_e; enum xvfs_minirivet_mode mode; fp = fopen(file, "r"); if (!fp) { return(0); } #define parse_xvfs_minirivet_getbyte(var) var = fgetc(fp); if (var == EOF) { break; } mode = XVFS_MINIRIVET_MODE_COPY; while (1) { parse_xvfs_minirivet_getbyte(ch); switch (mode) { case XVFS_MINIRIVET_MODE_COPY: if (ch == '<') { parse_xvfs_minirivet_getbyte(ch_buf[0]); if (ch_buf[0] != '?') { fputc('<', outfp); ch = ch_buf[0]; break; } tcl_buffer_p = tcl_buffer; parse_xvfs_minirivet_getbyte(ch_buf[0]); if (ch_buf[0] == '=') { mode = XVFS_MINIRIVET_MODE_TCL_PRINT; } else { mode = XVFS_MINIRIVET_MODE_TCL; *tcl_buffer_p = ch_buf[0]; tcl_buffer_p++; } *tcl_buffer_p = '\0'; continue; } break; case XVFS_MINIRIVET_MODE_TCL: case XVFS_MINIRIVET_MODE_TCL_PRINT: if (ch == '?') { parse_xvfs_minirivet_getbyte(ch_buf[0]); if (ch_buf[0] != '>') { *tcl_buffer_p = ch; tcl_buffer_p++; ch = ch_buf[0]; break; } *tcl_buffer_p = '\0'; if (mode == XVFS_MINIRIVET_MODE_TCL_PRINT) { tcl_buffer_p = tcl_buffer; while (*tcl_buffer_p && isspace(*tcl_buffer_p)) { tcl_buffer_p++; } tcl_buffer_e = tcl_buffer_p + strlen(tcl_buffer_p) - 1; while (tcl_buffer_e >= tcl_buffer_p && isspace(*tcl_buffer_e)) { *tcl_buffer_e = '\0'; tcl_buffer_e--; } if (strcmp(tcl_buffer_p, "$::xvfs::fsName") == 0) { fprintf(outfp, name); } else if (strcmp(tcl_buffer_p, "$::xvfs::fileInfoStruct") == 0) { fprintf(outfp, "static const struct xvfs_file_data xvfs_"); fprintf(outfp, name); fprintf(outfp, "_data[] = {\n"); parse_xvfs_minirivet_directory(outfp, directory); fprintf(outfp, "};\n"); } else if (strcmp(tcl_buffer_p, "[zlib adler32 $::xvfs::fsName]") == 0) { fprintf(outfp, "0"); } else { fprintf(outfp, "@INVALID@%s@INVALID@", tcl_buffer_p); } } mode = XVFS_MINIRIVET_MODE_COPY; continue; } break; } switch (mode) { case XVFS_MINIRIVET_MODE_COPY: fputc(ch, outfp); break; case XVFS_MINIRIVET_MODE_TCL: case XVFS_MINIRIVET_MODE_TCL_PRINT: *tcl_buffer_p = ch; tcl_buffer_p++; break; } } #undef parse_xvfs_minirivet_getbyte return(1); } static int xvfs_create(FILE *outfp, const char * const name, const char * const directory) { return(parse_xvfs_minirivet(outfp, "lib/xvfs/xvfs.c.rvt", name, directory)); } int main(int argc, char **argv) { struct options options = {0}; int parse_options_ret, xvfs_create_ret; argc--; argv++; parse_options_ret = parse_options(argc, argv, &options); if (!parse_options_ret) { return(1); } xvfs_create_ret = xvfs_create(stdout, options.name, options.directory); if (!xvfs_create_ret) { return(1); } return(0); } |