From 617b32ecf9744cc0612e7c695ab33ab46e8b6eda Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Fri, 29 Mar 2019 22:14:24 +0100 Subject: [PATCH] tranche-make draft --- module/da/src/da.lib.c | 9 +- module/da/src/da.lib.h | 2 + module/share/include/da.h | 4 + module/share/lib/libda.a | Bin 12372 -> 14634 bytes module/tranche/src/tranche-make.c | 53 --------- module/tranche/src/tranche-make.cli.c | 155 ++++++++++++++++++++++++++ module/tranche/src/tranche.lib.c | 82 ++++++++++++++ module/tranche/src/tranche.lib.h | 8 +- 8 files changed, 255 insertions(+), 58 deletions(-) delete mode 100644 module/tranche/src/tranche-make.c create mode 100644 module/tranche/src/tranche-make.cli.c diff --git a/module/da/src/da.lib.c b/module/da/src/da.lib.c index 47558e0..7fa384a 100644 --- a/module/da/src/da.lib.c +++ b/module/da/src/da.lib.c @@ -28,10 +28,15 @@ void da_rewind(Da *dap){ dap->end = dap->base; } -bool da_empty(Da *dap){ +bool da_emptyq(Da *dap){ return dap->end == dap->base; } +size_t da_length(Da *dap){ + return dap->end - dap->base; +} + + void da_rebase(Da *dap, char *old_base, void *pta){ char **pt = (char **)pta; size_t offset = *pt - old_base; @@ -129,7 +134,7 @@ void da_free_elements(Da *dap){ // for the case of an array of strings void da_strings_puts(Da *dap){ - char *pt = dap->base; + char *pt = dap->base; // char * because it points to a byte in the array while( pt < dap->end ){ puts(*(char **)pt); pt += dap->element_size; diff --git a/module/da/src/da.lib.h b/module/da/src/da.lib.h index d480d8c..189ee50 100644 --- a/module/da/src/da.lib.h +++ b/module/da/src/da.lib.h @@ -17,6 +17,8 @@ typedef struct Da{ void da_alloc(Da *dap, size_t element_size); void da_free(Da *dap); void da_rewind(Da *dap); +bool da_emptyq(Da *dap); +size_t da_length(Da *dap); char *da_expand(Da *dap); void da_rebase(Da *dap, char *old_base, void *pta); bool da_endq(Da *dap, void *pt); diff --git a/module/share/include/da.h b/module/share/include/da.h index 6d3c43b..189ee50 100644 --- a/module/share/include/da.h +++ b/module/share/include/da.h @@ -17,16 +17,20 @@ typedef struct Da{ void da_alloc(Da *dap, size_t element_size); void da_free(Da *dap); void da_rewind(Da *dap); +bool da_emptyq(Da *dap); +size_t da_length(Da *dap); char *da_expand(Da *dap); void da_rebase(Da *dap, char *old_base, void *pta); bool da_endq(Da *dap, void *pt); bool da_boundq(Da *dap); void da_push(Da *dap, void *element); bool da_pop(Da *dap, void *element); +void da_cat(Da *dap_base, Da *dap_cat); char *da_index(Da *dap, size_t i); void da_map(Da *dap, void f(void *, void *), void *closure); void da_free_elements(Da *dap); void da_strings_puts(Da *dap); +void da_ints_print(Da *dap); char *da_fgets(Da *dap, FILE *fd); #endif diff --git a/module/share/lib/libda.a b/module/share/lib/libda.a index ba48a6e6db4981956023b4317de9cd2e97734614..49ece6500c9e81338ca19d8e4cae70adadc5bdc3 100644 GIT binary patch literal 14634 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 xcqjyg_tSW$ghOiT... : - tranche $@ - - file is opened for append. If the depfile is not present stdout is used. - -If the given source file name has a directory prefix, the targets in -the dep line are given the same prefix. -*/ - -#include -#include -#include -#include "tranche.lib.h" - -#define ERR_ARGC 1 -#define ERR_SRC_OPEN 2 -#define ERR_DEP_OPEN 4 - - -int main(int argc, char **argv, char **envp){ - if(argc < 2 || argc > 3){ - fprintf(stderr, "usage: %s []\n",argv[0]); - return ERR_ARGC; - } - char *src_file_name = argv[1]; - char *dep_file_name = argv[2]; - - int dep_fd; - FILE *src_file = fopen(src_file_name, "r"); - if(argc < 3) - dep_fd = 1; - else{ - dep_fd = open(file_name, O_WRONLY | O_APPEND | O_CREAT, 0666); - } - unsigned int err = 0; - if(!src_file){ - fprintf(stderr,"could not open tranche source file %s\n", src_file_name); - err+= ERR_SRC_OPEN; - } - if(dep_fd == -1){ - fprintf(stderr, "Could not open the dep file %s\n", dep_file_name); - err+= ERR_DEP_OPEN; - } - if(err) return err; - - tranche_deps(src_file, dep_fd); - fclose(file); - close(dep_fd); - return 0; -} diff --git a/module/tranche/src/tranche-make.cli.c b/module/tranche/src/tranche-make.cli.c new file mode 100644 index 0000000..5286e3c --- /dev/null +++ b/module/tranche/src/tranche-make.cli.c @@ -0,0 +1,155 @@ +/* + +usage: + argv[0] [] [-sname ] [-sdir ] [-tdir ] [-mfile ] + +gets the names of all the targets from the source file, then appends +to the mfile a couple of lines of the form: + +... : + tranche $@ + +Our makefile is typically run in the directory above where the sources are +located. + +options + the trc file to be read +-sdir prepend to in the makefile deps line that is printed +-tdir prepend to each " +-mfile where to send the output, defaults to stdout +-sname replaces sourcename as the name to write as the source - useful for pipes + +If is not provided stdin is used. +If -mfile is not provided, stdout is used. +If -sdir is not provided, the directory part of the is used. If the +user does not want this behavior, give a value of "." for -sdir. + +*/ + +#include +#include +#include +#include "tranche.lib.h" + +int main(int argc, char **argv, char **envp){ + + char *source_file_path = 0; + char *sname = 0; + char *sdir = 0; + char *tdir = 0; + char *mfile_path = 0; + + { // argument parse + Da args; // we will queue the non option args here + Da *argsp = &args; + da_alloc(argsp, sizeof(char *)); + int args_cnt = 0; + + int err_cnt = 0; + char **pt = argv; + char *option; + char *value; // currently all our tranche options have exactly one value + while(*pt){ + if( **pt == '-' ){ + option = *pt + 1; + if(!*option){ + fprintf(stderr, "Currently there is no lone '-' option.\n"); + err_cnt++; + continue; + } + pt++; if(!*pt || **pt == '-'){ + fprintf(stderr, "Missing value for option %s.\n", option); + err_cnt++; + if(!*pt) break; + continue; + } + value = *pt; + if( !strcmp(option, "mfile") ){ + mfile_path = value; + continue; + } + if( !strcmp(option, "sdir") ){ + sdir = value; + continue; + } + if( !strcmp(option, "tdir") ){ + tdir = value; + continue; + } + if( !strcmp(option, "sname") ){ + sname = value; + continue; + } + fprintf(stderr, "Unrecognized option %s.", option); + err_cnt++; + continue; + } + da_push(argsp, pt); + arg_cnt++; + pt++; + } + if(!da_emptyq(argsp)) src_file_path = da_index(args, 0); + + // arg contracts + if(da_length(argsp) > 1){ + fprintf(stderr, "too many args/n"); + err_cnt++; + } + if(!src_file_name && !sname){ + fprintf(stderr, "must specify at least one eof a source_file_path or an sname/n"); + err_cnt++; + } + if(err_cnt > 0){ + fprintf(stderr, "usage: %s [] [-sname ] [-sdir ] [-tdir ] [-mfile ]\n", argv[0]); + return TRANCHE_ERR_ARG_PARSE; + } + + }// end of argument parse + + FILE *src_file; + int mfile_fd; + { //source and mfile open + if(!src_file_path) + src_file = stdin; + else + src_file = fopen(src_file_path, "r"); + + if(mfile_path == "") + mfile_fd = STDOUT_FILENO; + else + mfile_fd = open(file_name, O_WRONLY | O_APPEND | O_CREAT, 0666); + + int err = 0; + if(!src_file){ + fprintf(stderr,"could not open tranche source file %s\n", src_file_path); + err+= ERR_SRC_OPEN; + } + if(mfile_fd == -1){ + fprintf(stderr, "Could not open the dep file %s\n", mfile_path); + err+= ERR_DST_OPEN; + } + if(err) return err; + } + + char *file_name_part; + if(src_file_path){ + // we are guaranteed a filename part, otherwise the fopen above would have failed + file_name_part = path_chop(src_file_path); + if(!sname) sname = file_name_part; + if(!sdir && file_name_part != src_file_path) sdir = src_file_path; // note the file name has been chopped from src_file_path + } + tranche_make(src_file, sname, mfile_fd, sdir, tdir); + + { // deallocate resources instead of just existing, so as to catch any errors + da_free(argsp); + int err_cnt = 0; + if(src_file != stdin) + if( !fclose(src_file) ){perror(); err_cnt++;} + if(mfile_fd != STDOUT_FILENO) + if( close(mfile_fd) == -1 ){perror(); err_cnt++;} + if( err_cnt ) + return TRANCHE_ERR_CLOSE; + else + return 0; + } +} diff --git a/module/tranche/src/tranche.lib.c b/module/tranche/src/tranche.lib.c index 276fa95..455c6d7 100644 --- a/module/tranche/src/tranche.lib.c +++ b/module/tranche/src/tranche.lib.c @@ -163,6 +163,7 @@ static void combine(Da *string_arrp, Da *proffered_string_arrp){ return; } +// make a list of the unique tranche target files found in src int tranche_target(FILE *src, Da *target_arrp){ char *pt; Da line; // buffer holding the characters from a line @@ -185,3 +186,84 @@ int tranche_target(FILE *src, Da *target_arrp){ da_free(&file_name_arr); return 0; } + +// Inserts a zero to chop off the filename similar to the old basename. +// Returns a pointer to the first character after the inserted zero, i.e. to the filename. +char *path_chop(char *path){ + file = path + strlen(path); + if(file == path) return file; + file--; + if(file == path){ + if(*file == '.') file++; // lone '.' case + return file; + } + file--; + if(file == path){ + if(*file == '.' && *(file+1)=='.') file+=2; // lone '..' case + return file; + } + do{ + file--; + }while(file != path && *file != '/'); + if( *file == '/' ){ + *file = 0; + file++; + } + return file; +} + +// write a make file rule for making the tranche targets +void tranche_make(FILE *src_file, char *src_name, int mfile_fd, char *sdir, char *tdir){ + + // target list + Da tarr; + Da *tarrp; // target array pointer + da_alloc(tarrp, sizeof(char *)); + tranche_target(src_file, tarrp); + + char sp = ' '; + char colon = ':'; + char slash = '/'; + char newline = '\n'; + char tab = '\t'; + char terminator = 0; + + // output the dependency line ---------------------------------------- + Da dlarr; + Da *dlarrp; // dependency line array pointer + da_alloc(dlarrp, sizeof(char)); + char *pt = tarrp->base; // char * because it points to a byte in the array + while( pt < tarrp->end ){ + if(tdir){ + da_push_string(dlarrp, tdir); + da_push(dlarrp, &slash); + } + da_push_string(dlarrp, *(char **)pt); + da_push(dlarrp, &sp); + pt += dap->element_size; + } + da_push(dlarrp, &colon); + da_push(dlarrp, &sp); + if(sdir){ + da_push_string(dlarrp, sdir); + da_push(dlarrp, &slash); + } + da_push_string(dlarrp, src_name); + da_push(dlarrp, &newline); + da_push(dlarrp, &terminator); + write(mfile_fd, dlarrp->base, dlarrp->end - dlarrp->base); + da_free_elements(tarrp); + da_free(tarrp); + + // output acction line ---------------------------------------- + da_rewind(dlarrp); // reuse the line buffer + da_push(dlarrp, &tab); + da_push_string(dlarrp, "tranche $<"); + da_push(dlarrp, &newline); + da_push(dlarrp, &newline); + da_push(dlarrp, &terminator); + write(mfile_fd, dlarrp->base, dlarrp->end - dlarrp->base); + da_free(dlarrp); + + return; +} diff --git a/module/tranche/src/tranche.lib.h b/module/tranche/src/tranche.lib.h index 4c1d2f3..4ef4840 100644 --- a/module/tranche/src/tranche.lib.h +++ b/module/tranche/src/tranche.lib.h @@ -1,12 +1,14 @@ #ifndef TRANCHE_LIB_H #define TRANCHE_LIB_H -#define TRANCHE_ERR_ARGC 1 +#define TRANCHE_ERR_ARG_PARSE 1 #define TRANCHE_ERR_SRC_OPEN 2 -#define TRANCHE_ERR_DEP_OPEN 4 +#define TRANCHE_ERR_DST_OPEN 4 +#define TRANCHE_ERR_FCLOSE 8 +char *path_chop(char *path); int tranche_send(FILE *src, Da *arg_fds); int tranche_target(FILE *src, Da *targets); - +void tranche_make(FILE *src_file, char *src_file_name, int mfile_fd, char *sdir, char *tdir); #endif -- 2.20.1