commit
ca0d95e266
12 changed files with 197 additions and 0 deletions
@ -0,0 +1,3 @@
|
||||
[submodule "reqs/simple-opt"] |
||||
path = reqs/simple-opt |
||||
url = https://github.com/shmibs/simple-opt |
@ -0,0 +1,29 @@
|
||||
BSD 3-Clause License |
||||
|
||||
Copyright (c) 2019, katherine |
||||
All rights reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this |
||||
list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the name of the copyright holder nor the names of its |
||||
contributors may be used to endorse or promote products derived from |
||||
this software without specific prior written permission. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,77 @@
|
||||
#!/bin/sh |
||||
|
||||
# kinda brittle, this, but mostly works |
||||
# just don't use names with whitespaces |
||||
|
||||
target='confconf' |
||||
srcdir='src' |
||||
sources=`find $srcdir -type f -name '*.c' | sed -e "s/$srcdir\/\(.*\).c/\1.c/"` |
||||
objdir='build' |
||||
objects=`find $srcdir -type f -name '*.c' | sed -e "s/$srcdir\/\(.*\).c/\1.o/"` |
||||
|
||||
cc='cc' |
||||
cflags='-Wall -O2' |
||||
cflagsdebug='-Wall -ggdb3 -O0 -DDEBUG' |
||||
prefix='/usr/local' |
||||
|
||||
|
||||
|
||||
|
||||
dbg_objects=`printf %s "$objects" | sed -e "s/^/dbg_/"` |
||||
sources_wdir=`printf %s "$sources" | sed -e "s/^/$srcdir\//"` |
||||
objects_wdir=`printf %s "$objects" | sed -e "s/^/$objdir\//"` |
||||
|
||||
dgen='gcc' |
||||
if [ ! `2>/dev/null which gcc` ]; then |
||||
if [ ! `2>/dev/null which clang` ]; then |
||||
echo 'err: could not find a suitable ' \ |
||||
'compiler for calculating dependencies' |
||||
return 1 |
||||
fi |
||||
dgen='clang' |
||||
fi |
||||
|
||||
{ |
||||
printf %s\\n '.POSIX:' |
||||
printf %s\\n '.SUFFIXES:' |
||||
printf %s\\n '' |
||||
printf %s\\n "CC = $cc" |
||||
printf %s\\n "CFLAGS = $cflags" |
||||
printf %s\\n "CFLAGSDEBUG = $cflagsdebug" |
||||
printf %s\\n "PREFIX = $prefix" |
||||
printf %s\\n '' |
||||
printf %s\\n "all: objdir $target" |
||||
printf %s\\n '' |
||||
printf %s\\n "debug: objdir dbg_$target" |
||||
printf %s\\n '' |
||||
printf %s\\n 'objdir:' |
||||
printf %s\\n " mkdir -p $objdir" |
||||
printf %s\\n '' |
||||
printf %s\\n "install: all" |
||||
printf %s\\n ' mkdir -p $(DESTDIR)$(PREFIX)/bin' |
||||
printf %s\\n ' mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1' |
||||
printf %s\\n " cp -f $target \$(DESTDIR)\$(PREFIX)/bin" |
||||
printf %s\\n " gzip < ${target}.1 > \$(DESTDIR)\$(PREFIX)/share/man/man1/${target}.1.gz" |
||||
printf %s\\n '' |
||||
printf %s\\n "$target: `printf %s "$objects" | tr '\n' ' '`" |
||||
printf %s\\n " \$(CC) \$(LDFLAGS) -o $target `printf %s "$objects_wdir" | tr '\n' ' '` \$(LDLIBS)" |
||||
printf %s\\n '' |
||||
printf %s\\n "dbg_$target: `printf %s "$dbg_objects" | tr '\n' ' '`" |
||||
printf %s\\n " \$(CC) \$(LDFLAGS) -o $target `printf %s "$objects_wdir" | tr '\n' ' '` \$(LDLIBS)" |
||||
printf %s\\n '' |
||||
printf %s\\n "$sources" | (while IFS= read -r s; do |
||||
$dgen $CFLAGS -MM -MT `printf %s $s | sed -e 's/\.c$/\.o/'` "$srcdir/$s" |
||||
printf %s\\n " \$(CC) -c \$(CFLAGS) -o ${objdir}/`printf %s $s | sed -e 's/\.c$/\.o/'` ${srcdir}/$s" |
||||
done |
||||
) |
||||
printf %s\\n '' |
||||
printf %s\\n "$sources" | (while IFS= read -r s; do |
||||
$dgen $CFLAGS -MM -MT dbg_`printf %s $s | sed -e 's/\.c$/\.o/'` "$srcdir/$s" |
||||
printf %s\\n " \$(CC) -c \$(CFLAGSDEBUG) -o ${objdir}/`printf %s $s | sed -e 's/\.c$/\.o/'` ${srcdir}/$s" |
||||
done |
||||
) |
||||
printf %s\\n '' |
||||
printf %s\\n 'clean:' |
||||
printf %s\\n " rm -f $target" |
||||
printf %s\\n " rm -rf $objdir" |
||||
} > Makefile |
@ -0,0 +1,16 @@
|
||||
#include "opt.h" |
||||
|
||||
#include <stdio.h> |
||||
|
||||
int main(int argc, char **argv) |
||||
{ |
||||
opt_parse(argc, argv); |
||||
|
||||
if (opt_infile_str()) |
||||
puts(opt_infile_str()); |
||||
|
||||
if (opt_outfile_str()) |
||||
puts(opt_outfile_str()); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,62 @@
|
||||
#include "opt.h" |
||||
|
||||
#include "../reqs/simple-opt/simple-opt.h" |
||||
|
||||
#include <stdbool.h> |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
|
||||
static struct simple_opt options[] = { |
||||
{ SIMPLE_OPT_FLAG, 'h', "help", false, |
||||
"print this help message and exit" }, |
||||
{ SIMPLE_OPT_FLAG, 'v', "version", false, |
||||
"print the version of confconf in use and exit" }, |
||||
{ SIMPLE_OPT_STRING, 'i', "input", true, |
||||
"specify file to read from (default is stdin)", "<file>" }, |
||||
{ SIMPLE_OPT_STRING, 'o', "output", true, |
||||
"specify file to write to (default is stdout)", "<file>" }, |
||||
{ SIMPLE_OPT_END } |
||||
}; |
||||
|
||||
void opt_parse(int argc, char **argv) |
||||
{ |
||||
struct simple_opt_result result; |
||||
const char version[] = "confconf develop"; |
||||
|
||||
result = simple_opt_parse(argc, argv, options); |
||||
|
||||
/* parse err */ |
||||
if (result.result_type != SIMPLE_OPT_RESULT_SUCCESS) { |
||||
simple_opt_print_error(stderr, 80, argv[0], result); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
|
||||
/* help */ |
||||
if (options[0].was_seen) { |
||||
simple_opt_print_usage(stdout, 70, argv[0], |
||||
"[-i input] [-o output]", |
||||
"confconf is a config file parser generator for C", |
||||
options); |
||||
exit(EXIT_SUCCESS); |
||||
} |
||||
|
||||
/* version */ |
||||
if (options[1].was_seen) { |
||||
puts(version); |
||||
exit(EXIT_SUCCESS); |
||||
} |
||||
} |
||||
|
||||
const char* opt_infile_str(void) |
||||
{ |
||||
return (options[2].was_seen |
||||
? options[2].val_string |
||||
: NULL); |
||||
} |
||||
|
||||
const char* opt_outfile_str(void) |
||||
{ |
||||
return (options[3].was_seen |
||||
? options[3].val_string |
||||
: NULL); |
||||
} |
@ -0,0 +1,9 @@
|
||||
#ifndef CONFCONF_OPT_H |
||||
#define CONFCONF_OPT_H |
||||
|
||||
void opt_parse(int argc, char **argv); |
||||
|
||||
const char* opt_infile_str(void); |
||||
const char* opt_outfile_str(void); |
||||
|
||||
#endif |
Loading…
Reference in new issue