parent
f26f2c2e61
commit
4e351686f4
@ -1,88 +0,0 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require "digest/sha1"
|
||||
|
||||
FLAGS="-g -MP -MD -Os"
|
||||
LDFLAGS = "-larchive"
|
||||
#FLAGS="-g -MP -MD"
|
||||
|
||||
def cxx( code_base, filename )
|
||||
hash = Digest::SHA1.hexdigest(filename)[0,8]
|
||||
|
||||
dir = File.dirname(filename)
|
||||
base = "." + File.basename(filename)
|
||||
|
||||
basename = File.join(dir, base.gsub(/\.c$/,"") + "-" + hash )
|
||||
rebuild_needed = $clean
|
||||
|
||||
if !File.exists?(obj_file=(basename + ".o"))
|
||||
rebuild_needed = true
|
||||
elsif !File.exists?(deps=(basename + ".deps"))
|
||||
rebuild_needed = true
|
||||
else
|
||||
obj_file_mtime = File.mtime(obj_file)
|
||||
|
||||
if obj_file_mtime < File.mtime(filename)
|
||||
rebuild_needed = true
|
||||
else
|
||||
File.read(deps).each_line {|line|
|
||||
line = line.strip
|
||||
if File.exists?(line)
|
||||
if File.mtime(line) > obj_file_mtime
|
||||
#puts "#{line} is forcing rebuild of #{filename}"
|
||||
rebuild_needed = true
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
return unless rebuild_needed
|
||||
|
||||
puts "[CC] #{filename} => #{obj_file}"
|
||||
if !system("gcc -c #{FLAGS} \"#{filename}\" -o \"#{obj_file}\" -Isrc/ -I #{code_base} -I./")
|
||||
File.unlink( obj_file )
|
||||
File.unlink( deps )
|
||||
exit(1)
|
||||
end
|
||||
deps = File.read(basename+".d").strip.split("\n").select {|l|
|
||||
!l.include?("tmp") \
|
||||
&& !l.include?("include") \
|
||||
&& l[0] != ' '
|
||||
}.map {|l|
|
||||
l[..-2]
|
||||
}
|
||||
File.open(basename+".deps","w") {|f|
|
||||
deps.each {|d| f.puts d }
|
||||
}
|
||||
File.unlink(basename+".d")
|
||||
cmd = "ar r #{code_base}.a \"#{obj_file}\""
|
||||
#puts cmd
|
||||
system(cmd)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
$clean = false
|
||||
code_base = "src/"
|
||||
ARGV.each_with_index {|arg,i|
|
||||
case arg
|
||||
when "clean"
|
||||
$clean = true
|
||||
%x( rm #{code_base}.a )
|
||||
when "--code"
|
||||
code_base = ARGV[i+1]
|
||||
end
|
||||
}
|
||||
|
||||
puts "Compiling #{code_base}"
|
||||
|
||||
files = %x( find "#{code_base}" -type f ).strip.split("\n").select {|f| /\.c$/ =~ f }
|
||||
|
||||
%x( ar cr #{code_base}.a )
|
||||
|
||||
files.each {|filename|
|
||||
cxx( code_base, filename )
|
||||
}
|
||||
system("gcc #{code_base}.a -g -o #{code_base}.bin -rdynamic #{LDFLAGS}")
|
||||
|
@ -0,0 +1,83 @@
|
||||
#include "form.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct form_parser
|
||||
{
|
||||
FILE* f;
|
||||
char* buffer;
|
||||
int size;
|
||||
int pos;
|
||||
};
|
||||
|
||||
struct form_parser* form_pull_parser_new( FILE* f )
|
||||
{
|
||||
struct form_parser* fp = (struct form_parser*)malloc(sizeof(struct form_parser));
|
||||
if( !fp ) { return NULL; }
|
||||
|
||||
fp->f = f;
|
||||
fp->buffer = malloc(32);
|
||||
fp->buffer[0] = '\0';
|
||||
fp->size = 32;
|
||||
fp->pos = 0;
|
||||
|
||||
return fp;
|
||||
}
|
||||
|
||||
void form_pull_parser_release( struct form_parser* fp )
|
||||
{
|
||||
fclose(fp->f);
|
||||
free(fp->buffer);
|
||||
free(fp);
|
||||
}
|
||||
|
||||
static void append_char( struct form_parser* fp, char ch )
|
||||
{
|
||||
if( fp->pos == fp->size - 1 ) {
|
||||
fp->size += 32;
|
||||
fp->buffer = realloc( fp->buffer, fp->size );
|
||||
}
|
||||
fp->buffer[ fp->pos ] = ch;
|
||||
fp->buffer[ fp->pos+1 ] = '\0';
|
||||
fp->pos += 1;
|
||||
}
|
||||
|
||||
static char* read_item( struct form_parser* fp, char delim )
|
||||
{
|
||||
char ch;
|
||||
char escape[3] = "00";
|
||||
int tmp;
|
||||
|
||||
// Clear any existing data
|
||||
fp->pos = 0;
|
||||
fp->buffer[0] = '\0';
|
||||
|
||||
while( (ch=fgetc(fp->f)) != EOF ) {
|
||||
if( ch == delim ) { break; }
|
||||
|
||||
if( ch == '%' ) {
|
||||
escape[0] = fgetc(fp->f);
|
||||
escape[1] = fgetc(fp->f);
|
||||
sscanf(escape, "%02x",&tmp);
|
||||
append_char( fp, tmp );
|
||||
} else {
|
||||
append_char( fp, ch );
|
||||
}
|
||||
}
|
||||
|
||||
if( fp->pos == 0 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fp->buffer;
|
||||
}
|
||||
|
||||
char* form_pull_parser_read_key( struct form_parser* fp )
|
||||
{
|
||||
return read_item( fp, '=' );
|
||||
}
|
||||
char* form_pull_parser_read_value( struct form_parser* fp )
|
||||
{
|
||||
return read_item( fp, '&' );
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
struct form_parser;
|
||||
|
||||
struct form_parser* form_pull_parser_new( FILE* f );
|
||||
void form_pull_parser_release( struct form_parser* );
|
||||
|
||||
char* form_pull_parser_read_key( struct form_parser* fp );
|
||||
char* form_pull_parser_read_value( struct form_parser* fp );
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 50565dcf4dfc56523eef0f381e6fc0fe44f48a52
|
||||
Subproject commit ac013e14cae0f377356ef8a1ae002c465d53a306
|
@ -0,0 +1 @@
|
||||
Subproject commit 17ff36dbc17a82c629ee95952d888ea6c84b5d8d
|
Loading…
Reference in new issue