From: Danny Milosavljevic <dannym@scratchpost.org>
To: Ricardo Wurmus <rekado@elephly.net>
Cc: 34531@debbugs.gnu.org
Subject: bug#34531: Guix profile fails on Overdrive 1000
Date: Sun, 24 Feb 2019 13:12:07 +0100 [thread overview]
Message-ID: <20190224131204.21fdc1e5@scratchpost.org> (raw)
In-Reply-To: <878sy52yw1.fsf@elephly.net>
[-- Attachment #1.1: Type: text/plain, Size: 810 bytes --]
Hi Ricardo,
On Sun, 24 Feb 2019 12:45:34 +0100
Ricardo Wurmus <rekado@elephly.net> wrote:
> Danny Milosavljevic <dannym@scratchpost.org> writes:
>
> > Final version attached. Works fine now.
>
> The loop looks a bit more complicated than it needs to be, I think. Did
> my version not work for you?
It did, but I wanted to make sure the port did exactly the same as the
original generate.py--maybe I overdid it, but I didn't want to break it
by porting it.
What skip_comments in the original does is strip comments, but not strip
"comment-like things" that are in string literals ("/*blah*/").
(as far as I can tell, at least)
I agree your version is easier but does it do the same thing?
Attached a v2 where I fixed a bug in literal handling related to that (oops).
WDYT?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: generate.scm --]
[-- Type: text/x-scheme, Size: 11246 bytes --]
;; -*- geiser-scheme-implementation: guile -*-
;;; Implementation: Danny Milosavljevic <dannym@scratchpost.org>
;;; Based on: Implementation in Python by Vicent Marti.
;;; License: ISC, like the original generate.py in clar.
(use-modules (ice-9 ftw))
(use-modules (ice-9 regex))
(use-modules (ice-9 getopt-long))
(use-modules (ice-9 rdelim))
(use-modules (ice-9 match))
(use-modules (ice-9 textual-ports))
(use-modules (srfi srfi-1))
(define (render-callback cb)
(if cb
(string-append " { \"" (assoc-ref cb "short-name") "\", &"
(assoc-ref cb "symbol") " }")
" { NULL, NULL }"))
(define (replace needle replacement haystack)
"Replace all occurences of NEEDLE in HAYSTACK by REPLACEMENT.
NEEDLE is a regular expression."
(regexp-substitute/global #f needle haystack 'pre replacement 'post))
(define (skip-comments* text)
(call-with-input-string
text
(lambda (port)
(let loop ((result '())
(section #f))
(define (consume-char)
(cons (read-char port) result))
(define (skip-char)
(read-char port)
result)
(match section
(#f
(match (peek-char port)
(#\/ (loop (consume-char) 'almost-in-block-comment))
(#\" (loop (consume-char) 'in-string-literal))
(#\' (loop (consume-char) 'in-character-literal))
((? eof-object?) result)
(_ (loop (consume-char) section))))
('almost-in-block-comment
(match (peek-char port)
(#\* (loop (consume-char) 'in-block-comment))
(#\/ (loop (consume-char) 'in-line-comment))
((? eof-object?) result)
(_ (loop (consume-char) #f))))
('in-line-comment
(match (peek-char port)
(#\newline (loop (consume-char) #f))
((? eof-object?) result)
(_ (loop (skip-char) section))))
('in-block-comment
(match (peek-char port)
(#\* (loop (skip-char) 'almost-out-of-block-comment))
((? eof-object?) result)
(_ (loop (skip-char) section))))
('almost-out-of-block-comment
(match (peek-char port)
(#\/ (loop (cons (read-char port) (cons #\* result)) #f))
(#\* (loop (skip-char) 'almost-out-of-block-comment))
((? eof-object?) result)
(_ (loop (skip-char) 'in-block-comment))))
('in-string-literal
(match (peek-char port)
(#\\ (loop (consume-char) 'in-string-literal-escape))
(#\" (loop (consume-char) #f))
((? eof-object?) result)
(_ (loop (consume-char) section))))
('in-string-literal-escape
(match (peek-char port)
((? eof-object?) result)
(_ (loop (consume-char) 'in-string-literal))))
('in-character-literal
(match (peek-char port)
(#\\ (loop (consume-char) 'in-character-literal-escape))
(#\' (loop (consume-char) #f))
((? eof-object?) result)
(_ (loop (consume-char) section))))
('in-character-literal-escape
(match (peek-char port)
((? eof-object?) result)
(_ (loop (consume-char) 'in-character-literal)))))))))
(define (skip-comments text)
(list->string (reverse (skip-comments* text))))
(define (maybe-only items)
(match items
((a) a)
(_ #f)))
(define (Module name path excludes)
(let* ((clean-name (replace "_" "::" name))
(enabled (not (any (lambda (exclude)
(string-prefix? exclude clean-name))
excludes))))
(define (parse contents)
(define (cons-match match prev)
(cons
`(("declaration" . ,(match:substring match 1))
("symbol" . ,(match:substring match 2))
("short-name" . ,(match:substring match 3)))
prev))
(let* ((contents (skip-comments contents))
(entries (fold-matches (make-regexp
(string-append "^(void\\s+(test_"
name
"__(\\w+))\\s*\\(\\s*void\\s*\\))\\s*\\{")
regexp/newline)
contents
'()
cons-match))
(callbacks (filter (lambda (entry)
(match (assoc-ref entry "short-name")
("initialize" #f)
("cleanup" #f)
(_ #t)))
entries)))
(if (> (length callbacks) 0)
`(("name" . ,name)
("enabled" . ,(if enabled "1" "0"))
("clean-name" . ,clean-name)
("initialize" . ,(maybe-only (filter-map (lambda (entry)
(match (assoc-ref entry "short-name")
("initialize" entry)
(_ #f)))
entries)))
("cleanup" . ,(maybe-only (filter-map (lambda (entry)
(match (assoc-ref entry "short-name")
("cleanup" entry)
(_ #f)))
entries)))
("callbacks" . ,callbacks))
#f)))
(define (refresh path)
(and (file-exists? path)
(parse (call-with-input-file path get-string-all))))
(refresh path)))
(define (generate-TestSuite path output excludes)
(define (load)
(define enter? (const #t))
(define (leaf file stat result)
(let* ((module-root (string-drop (dirname file)
(string-length path)))
(module-root (filter-map (match-lambda
("" #f)
(a a))
(string-split module-root #\/))))
(define (make-module path)
(let* ((name (string-join (append module-root (list (string-drop-right (basename path) (string-length ".c")))) "_"))
(name (replace "-" "_" name)))
(Module name path excludes)))
(if (string-suffix? ".c" file)
(let ((module (make-module file)))
(if module
(cons module result)
result))
result)))
(define (down dir stat result)
result)
(define (up file state result)
result)
(define skip (const #f))
(define error (const #f)) ; FIXME
(file-system-fold enter? leaf down up skip error '() path))
(define (CallbacksTemplate module)
(string-append "static const struct clar_func _clar_cb_"
(assoc-ref module "name") "[] = {\n"
(string-join (map render-callback
(assoc-ref module "callbacks"))
",\n")
"\n};\n"))
(define (DeclarationTemplate module)
(string-append (string-join (map (lambda (cb)
(string-append "extern "
(assoc-ref cb "declaration")
";"))
(assoc-ref module "callbacks"))
"\n")
"\n"
(if (assoc-ref module "initialize")
(string-append "extern " (assoc-ref (assoc-ref module "initialize") "declaration") ";\n")
"")
(if (assoc-ref module "cleanup")
(string-append "extern " (assoc-ref (assoc-ref module "cleanup") "declaration") ";\n")
"")))
(define (InfoTemplate module)
(string-append "
{
\"" (assoc-ref module "clean-name") "\",
" (render-callback (assoc-ref module "initialize")) ",
" (render-callback (assoc-ref module "cleanup")) ",
_clar_cb_" (assoc-ref module "name") ", "
(number->string (length (assoc-ref module "callbacks")))
", " (assoc-ref module "enabled") "
}"))
(define (Write data)
(define (name< module-a module-b)
(string<? (assoc-ref module-a "name")
(assoc-ref module-b "name")))
(define modules (sort (load) name<))
(define (suite-count)
(length modules))
(define (callback-count)
(fold + 0 (map (lambda (entry)
(length (assoc-ref entry "callbacks")))
modules)))
(define (display-x value)
(display value data))
(for-each (compose display-x DeclarationTemplate) modules)
(for-each (compose display-x CallbacksTemplate) modules)
(display-x "static struct clar_suite _clar_suites[] = {")
(display-x (string-join (map InfoTemplate modules) ","))
(display-x "\n};\n")
(let ((suite-count-str (number->string (suite-count)))
(callback-count-str (number->string (callback-count))))
(display-x "static const size_t _clar_suite_count = ")
(display-x suite-count-str)
(display-x ";\n")
(display-x "static const size_t _clar_callback_count = ")
(display-x callback-count-str)
(display-x ";\n")
(display (string-append "Written `clar.suite` ("
callback-count-str
" tests in "
suite-count-str
" suites)"))
(newline))
#t)
(call-with-output-file (string-append output "/clar.suite") Write))
;;; main
(define (main)
(define option-spec
'((force (single-char #\f) (value #f))
(exclude (single-char #\x) (value #t))
(output (single-char #\o) (value #t))
(help (single-char #\h) (value #f))))
(define options (getopt-long (command-line) option-spec #:stop-at-first-non-option #t))
(define args (reverse (option-ref options '() '())))
(when (> (length args) 1)
(display "More than one path given\n")
(exit 1))
(if (< (length args) 1)
(set! args '(".")))
(let* ((path (car args))
(output (option-ref options 'output path))
(excluded (filter-map (match-lambda
(('exclude . value) value)
(_ #f))
options)))
(generate-TestSuite path output excluded)))
(main)
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2019-02-24 12:13 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-18 20:05 bug#34531: Guix profile fails on Overdrive 1000 Andreas Enge
2019-02-18 20:49 ` Marius Bakke
2019-02-19 8:27 ` Andreas Enge
2019-02-19 13:23 ` Ricardo Wurmus
2019-02-19 15:19 ` Danny Milosavljevic
2019-02-20 10:51 ` Danny Milosavljevic
2019-02-20 11:46 ` Ricardo Wurmus
2019-02-20 13:26 ` Danny Milosavljevic
2019-02-20 15:56 ` Ricardo Wurmus
2019-02-20 16:26 ` Danny Milosavljevic
2019-02-20 20:53 ` Ricardo Wurmus
2019-02-20 22:08 ` Danny Milosavljevic
2019-02-20 22:28 ` Danny Milosavljevic
2019-02-23 11:20 ` Ricardo Wurmus
2019-02-24 10:40 ` Danny Milosavljevic
2019-02-24 11:45 ` Ricardo Wurmus
2019-02-24 12:12 ` Danny Milosavljevic [this message]
2019-02-26 21:07 ` Ricardo Wurmus
2019-02-20 13:28 ` Danny Milosavljevic
2019-02-19 15:35 ` Andreas Enge
2019-02-19 15:40 ` Danny Milosavljevic
2019-04-04 11:28 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190224131204.21fdc1e5@scratchpost.org \
--to=dannym@scratchpost.org \
--cc=34531@debbugs.gnu.org \
--cc=rekado@elephly.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).