82-define
"
-if [ ! -x ./i686-unknown-linux-gnu-tcc ]; then
- tests=$(echo "$tests" | grep -Ev "02-return-1|05-call-1|80-setjmp|81-qsort")
-fi
+broken="$broken
+"
set +e
+expect=$(echo $broken | wc -w)
+pass=0
fail=0
total=0
+export LIBC=libc/libc
for t in $tests; do
+ if [ -z "${t/[012][0-9]-*/}" ]; then
+ LIBC=lib/mini-libc;
+ elif [ -z "${t/8[0-9]-*/}" ]; then
+ LIBC=lib/libc+tcc;
+ else
+ LIBC=lib/libc;
+ fi
sh build-aux/test.sh "scaffold/tests/$t" &> scaffold/tests/"$t".log
r=$?
total=$((total+1))
if [ $r = 0 ]; then
echo $t: [OK]
+ pass=$((pass+1))
else
echo $t: [FAIL]
fail=$((fail+1))
10_pointer
11_precedence
12_hashdefine
-
+13_integer_literals
14_if
15_recursion
16_nesting
20_pointer_comparison
21_char_array
-
-
-
+22_floating_point
+23_type_coercion
+24_math_library
25_quicksort
-
-
+26_character_constants
+27_sizeof
+28_strings
29_array_address
-
+30_hanoi
31_args
-
-
+32_led
33_ternary_op
+34_array_assignment
35_sizeof
+36_array_initialisers
+37_sprintf
+38_multiple_array_index
+39_typedef
-
-
-
-
-
+40_stdio
41_hashif
-
+42_function_pointer
43_void_param
44_scoped_declarations
45_empty_for
-
+46_grep
47_switch_return
48_nested_break
-
+49_bracket_evaluation
50_logical_second_arg
-
-
+51_static
+52_unnamed_enum
+55_lshift_type
54_goto
+"
+broken="$broken
+18_include
+
+22_floating_point
+23_type_coercion
+24_math_library
+26_character_constants
+27_sizeof
+28_strings
+
+30_hanoi
+32_led
+34_array_assignment
+37_sprintf
+38_multiple_array_index
+39_typedef
+
+40_stdio
+42_function_pointer
+46_grep
+49_bracket_evaluation
+
+51_static
+52_unnamed_enum
+55_lshift_type
"
-#13_integer_literals ; fail
#22_floating_point ; float
#23_type_coercion ; float
#24_math_library ; float
#55_lshift_type ; unsigned
-# FIXME: have no diff
-tests=
+expect=$(echo $broken | wc -w)
for t in $tests; do
if [ ! -f scaffold/tinycc/"$t.c" ]; then
echo ' [SKIP]'
continue;
fi
- sh build-aux/test.sh "scaffold/tinycc/$t" &> scaffold/tinycc/"$t".log
+ sh build-aux/test.sh "scaffold/tinycc/$t" arg1 arg2 arg3 arg4 arg5 &> scaffold/tinycc/"$t".log
r=$?
total=$((total+1))
if [ $r = 0 ]; then
echo $t: [OK]
+ pass=$((pass+1))
else
echo $t: [FAIL]
fail=$((fail+1))
fi
done
-
-if [ $fail != 0 ]; then
+[ $expect != 0 ] && echo "expect: $expect"
+[ $fail != 0 ] && echo "failed: $fail"
+[ $fail -lt $expect ] && echo "solved: $(($expect - $fail))"
+echo "passed: $pass"
+echo "total: $total"
+if [ $fail != 0 -a $fail -gt $expect ]; then
echo FAILED: $fail/$total
exit 1
+elif [ $fail != 0 ]; then
+ echo PASS: $pass/$total
else
echo PASS: $total
fi
--- /dev/null
+#! /bin/sh
+# -*-scheme-*-
+exec ${GUILE-guile} -L $(dirname 0) -e '(diff)' -s "$0" "$@"
+!#
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; mes-snarf.scm: This file is part of Mes.
+;;;
+;;; Mes 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (diff)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
+ #:use-module (ice-9 rdelim)
+ #:export (main))
+
+(cond-expand
+ (mes
+ (define %scheme "mes"))
+ (guile-2
+ (define %scheme "guile")
+ (define-macro (mes-use-module . rest) #t))
+ (guile
+ (use-modules (ice-9 syncase))
+ (define %scheme "guile")
+ (define-macro (mes-use-module . rest) #t)))
+
+(mes-use-module (mes guile))
+
+(format (current-error-port) "diff[~a]...\n" %scheme)
+
+(define (plus a)
+ (string-append "+" a))
+(define (minus a)
+ (string-append "-" a))
+(define (keep a)
+ (string-append " " a))
+
+(define-record-type <hunk> (make-hunk context after removed added)
+ hunk?
+ (context hunk.context)
+ (after hunk.after)
+ (removed hunk.removed)
+ (added hunk.added))
+
+(define (hunk->lines o)
+ (append `(,(format #f "@@ -~a,~a +~a,~a" (length (hunk.removed o)) (+ 3 (car (hunk.context o))) (length (hunk.added o)) (+ 3 (cadr (hunk.context o))))
+ ,@(map keep (filter identity (cddr (hunk.context o)))))
+ (map minus (hunk.removed o))
+ (map plus (hunk.added o))
+ (map keep (hunk.after o))))
+
+(define (safe-list-head lst n)
+ (list-head lst (min n (length lst))))
+
+;; naive diff
+(define (diff a b)
+ (let ((a-lines (string-split (with-input-from-file a read-string) #\newline))
+ (b-lines (string-split (with-input-from-file b read-string) #\newline)))
+ (let loop ((context '(1 1 #f #f #f)) (a-lines a-lines) (b-lines b-lines))
+ ;;(format (current-error-port) "loop context=~s\n" context)
+ (cond ((and (null? a-lines) (null? b-lines)) '())
+ ((null? a-lines)
+ (list (make-hunk context (safe-list-head a-lines 3) '() b-lines)))
+ ((null? b-lines)
+ (list (make-hunk context (safe-list-head a-lines 3) a-lines '())))
+ ((equal? (car a-lines) (car b-lines))
+ (loop `(,(1+ (car context))
+ ,(1+ (cadr context))
+ ,@(cdddr context)
+ ,(car a-lines))
+ (cdr a-lines) (cdr b-lines)))
+ (else
+ (cond ((and (pair? (cdr b-lines)) (equal? (car a-lines) (cadr b-lines)))
+ (cons (make-hunk context (safe-list-head a-lines 3) '() (list (car b-lines)))
+ (loop `(,(+ 1 (car context))
+ ,(+ 2 (cadr context))
+ ,@(cdddr context)
+ ,(car a-lines))
+ (cdr a-lines) (cddr b-lines))))
+ ((and (pair? (cdr a-lines)) (equal? (cadr a-lines) (car b-lines)))
+ (cons (make-hunk context (safe-list-head a-lines 3) (list (car a-lines)) '())
+ (loop `(,(+ 2 (car context))
+ ,(+ 1 (cadr context))
+ ,@(cddddr context)
+ ,(car a-lines)
+ ,(cadr a-lines))
+ (cddr a-lines) (cdr b-lines))))
+ (else (cons (make-hunk context (safe-list-head a-lines 3) (list (car a-lines)) (list (car b-lines)))
+ (loop `(,(1+ (car context))
+ ,(1+ (cadr context))
+ ,@(cdddr context)
+ ,(car a-lines))
+ (cdr a-lines) (cdr b-lines))))))))))
+
+(define (main args)
+ (let* ((files (cdr args))
+ (files (if (equal? (car files) "-u") (cdr files) files))
+ (hunks (apply diff (list-head files 2))))
+ (when (pair? hunks)
+ (display (string-join (append-map hunk->lines hunks) "\n"))
+ (newline)
+ (exit 1))))