From keithp at keithp.com Sun Nov 25 21:14:56 2007 From: keithp at keithp.com (Keith Packard) Date: Sun, 25 Nov 2007 21:14:56 -0800 (PST) Subject: [Nickle] nickle: Branch 'master' Message-ID: <20071126051456.DD869130022@keithp.com> gram.y | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) New commits: commit 96c5c70c8226c3f60419fa2eee981d259efb07f2 Author: Keith Packard Date: Sun Nov 25 21:13:25 2007 -0800 Allow . in struct initializers. C places a '.' before the structure member name in initializers, which would eliminate a shift/reduce conflict in the grammar. Nickle has not allowed the dot in the past, so instead of requiring it, we'll just make it optional, which doesn't eliminate the conflict, but at least works. diff --git a/gram.y b/gram.y index 7c2e559..0f2970a 100644 --- a/gram.y +++ b/gram.y @@ -1594,8 +1594,11 @@ structelt : NAME ASSIGN simpleexpr { $$ = NewExprTree (ASSIGN, NewExprAtom ($1, 0, False), $3); } | NAME ASSIGN init { $$ = NewExprTree (ASSIGN, NewExprAtom ($1, 0, False), $3); } + | DOT NAME ASSIGN simpleexpr + { $$ = NewExprTree (ASSIGN, NewExprAtom ($2, 0, False), $4); } + | DOT NAME ASSIGN init + { $$ = NewExprTree (ASSIGN, NewExprAtom ($2, 0, False), $4); } ; - init : arrayinit | structinit | hashinit From keithp at keithp.com Sun Nov 25 21:52:22 2007 From: keithp at keithp.com (Keith Packard) Date: Sun, 25 Nov 2007 21:52:22 -0800 (PST) Subject: [Nickle] nickle: Branch 'master' - 5 commits Message-ID: <20071126055223.0FA80130022@keithp.com> command.5c | 44 ++++++++++++++++++++++---------------------- examples/apsp.5c | 2 +- examples/circle.5c | 2 +- examples/fourfours.5c | 24 ++++++++++++------------ examples/menace2.5c | 6 +++--- examples/miller-rabin.5c | 4 ++-- examples/mutextest.5c | 4 ++-- examples/numbers.5c | 2 +- examples/polynomial.5c | 4 ++-- examples/prime.5c | 4 ++-- examples/randtest.5c | 2 +- examples/rijndael.5c | 8 ++++---- examples/roman.5c | 6 +++--- examples/shortpaths.5c | 2 +- examples/skiplist.5c | 14 +++++++------- examples/skiplisttest.5c | 2 +- examples/smlng/context.5c | 2 +- examples/smlng/parse.5c | 30 +++++++++++++++--------------- mutex.5c | 4 ++-- printf.5c | 24 ++++++++++++------------ string.5c | 4 ++-- test/optest.5c | 4 ++-- 22 files changed, 99 insertions(+), 99 deletions(-) New commits: commit 94a41e46b6381304a5b1c67675afd9c5f3f8574c Author: Keith Packard Date: Sun Nov 25 21:51:23 2007 -0800 Examples - use '.' in struct initializers. Add '.' before struct tag in initializers now that it is permitted. diff --git a/examples/apsp.5c b/examples/apsp.5c index 6547176..61a1455 100644 --- a/examples/apsp.5c +++ b/examples/apsp.5c @@ -22,7 +22,7 @@ namespace APSP { int n = ns[0]; /* set things up */ shortest_path[n,n] path = - {{{dist = -1, first_hop = -1}, ...},...}; + {{{.dist = -1, .first_hop = -1}, ...},...}; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j && adjacencies[i,j] >= 0) { diff --git a/examples/circle.5c b/examples/circle.5c index c54cb2e..ae8cd50 100644 --- a/examples/circle.5c +++ b/examples/circle.5c @@ -29,5 +29,5 @@ course function great_circle (loc start, loc end) { real rdist = earth_radius * r; real sinth = sin(phi) * sin(b) / sin(r); real th = asin(sinth) / rad; - return (course){dist = rdist, bearing = th}; + return (course){ .dist = rdist, .bearing = th }; } diff --git a/examples/fourfours.5c b/examples/fourfours.5c index e9233ab..e6f0da9 100644 --- a/examples/fourfours.5c +++ b/examples/fourfours.5c @@ -14,12 +14,12 @@ typedef struct { poly() argloop() { int i = 0; static poly[] a = { - (v_t) { s = "4", v = 4, p = 25 }, - (v_t) { s = ".4", v = .4, p = 5 }, - (v_t) { s = ".{4}", v =.{4}, p = 1 }, - (v_t) { s = "4!", v = 4!, p = 25 }, - (v_t) { s = "???4", v = sqrt(4), p = 25 }, - (v_t) { s = "???.{4}", v = sqrt(.{4}), p = 1 }, + (v_t) { .s = "4", .v = 4, .p = 25 }, + (v_t) { .s = ".4", .v = .4, .p = 5 }, + (v_t) { .s = ".{4}", .v =.{4}, .p = 1 }, + (v_t) { .s = "4!", .v = 4!, .p = 25 }, + (v_t) { .s = "???4", .v = sqrt(4), .p = 25 }, + (v_t) { .s = "???.{4}", .v = sqrt(.{4}), .p = 1 }, ??? }; return poly func() = a[i++ % dim(a)]; @@ -30,14 +30,14 @@ poly () binloop(poly() l, poly() r) { int i = 0; poly la = ???, ra = ???; static (poly(poly, poly))[] a = { - poly func(x,y) = (v_t) { s = "(" + x.s + " + " + y.s + ")", v=x.v + y.v, p = x.p + y.p }, - poly func(x,y) = (v_t) { s = "(" + x.s + " - " + y.s + ")", v=x.v - y.v, p = x.p + y.p }, - poly func(x,y) = (v_t) { s = "(" + x.s + " * " + y.s + ")", v=x.v * y.v, p = x.p + y.p }, - poly func(x,y) = (v_t) { s = "(" + x.s + " / " + y.s + ")", v=x.v / y.v, p = x.p + y.p }, + poly func(x,y) = (v_t) { .s = "(" + x.s + " + " + y.s + ")", .v = x.v + y.v, .p = x.p + y.p }, + poly func(x,y) = (v_t) { .s = "(" + x.s + " - " + y.s + ")", .v = x.v - y.v, .p = x.p + y.p }, + poly func(x,y) = (v_t) { .s = "(" + x.s + " * " + y.s + ")", .v = x.v * y.v, .p = x.p + y.p }, + poly func(x,y) = (v_t) { .s = "(" + x.s + " / " + y.s + ")", .v = x.v / y.v, .p = x.p + y.p }, poly func(x,y) { if (y.v > 4) raise invalid_argument ("rhs of ** too large", 1, y.v); - return (v_t) { s = "(" + x.s + " ^ " + y.s + ")", v=x.v ** y.v, p = x.p + y.p }; + return (v_t) { .s = "(" + x.s + " ^ " + y.s + ")", .v =x.v ** y.v, .p = x.p + y.p }; } }; return poly func() { @@ -78,7 +78,7 @@ poly() parenloop(poly() x, poly() y, poly() z) { /* find equations which compute all values */ void main () { int limit = 100; - v_t[limit + 1] values = { { s = "no solution", v = 0, p=0 } ... }; + v_t[limit + 1] values = { { .s = "no solution", .v = 0, .p = 0 } ... }; poly() f = parenloop (binloop(argloop(), argloop()), argloop(), argloop()); while (((poly value) = f()) != ???) { diff --git a/examples/menace2.5c b/examples/menace2.5c index 006f155..7ac45ae 100755 --- a/examples/menace2.5c +++ b/examples/menace2.5c @@ -108,9 +108,9 @@ ttentref ttable_lookup(position pos) { /* nope: create a new entry */ nttstates++; ttent t = { - on_move = side_on_move(&pos), - posns = all_posns(pos), - next = ttable + .on_move = side_on_move(&pos), + .posns = all_posns(pos), + .next = ttable }; /* count legal moves */ int nmoves = 0; diff --git a/examples/miller-rabin.5c b/examples/miller-rabin.5c index cfd2ac1..01477a3 100644 --- a/examples/miller-rabin.5c +++ b/examples/miller-rabin.5c @@ -34,9 +34,9 @@ namespace MillerRabin { witness_result function witnessexp(int b, int e, int m) { switch (e) { case 0: - return (witness_result){pow = 0, wit = 1}; + return (witness_result){ .pow = 0, .wit = 1}; case 1: - return (witness_result){pow = b % m, wit = 0}; + return (witness_result){ .pow = b % m, .wit = 0}; } witness_result tmp = witnessexp(b, e // 2, m); if (tmp.wit != 0) diff --git a/examples/mutextest.5c b/examples/mutextest.5c index 73faa1d..da3ecba 100644 --- a/examples/mutextest.5c +++ b/examples/mutextest.5c @@ -76,8 +76,8 @@ void start (int nthread, int nmut_ex, int delay) for (i = 0; i < nmut_ex; i++) { mutexes[i] = (named_mutex) { - mut_ex = new (), - name = String::new('A' + i) + .mut_ex = new (), + .name = String::new('A' + i) }; } for (i = 0; i < nthread; i++) diff --git a/examples/numbers.5c b/examples/numbers.5c index 972146d..42cfe6f 100644 --- a/examples/numbers.5c +++ b/examples/numbers.5c @@ -32,7 +32,7 @@ namespace Numbers { /* Extended Euclid's Algorithm */ public coeff function extgcd(int a, int b) { if (b == 0) - return (coeff) {d = a, x = 1, y = 0}; + return (coeff) { .d = a, .x = 1, .y = 0}; coeff t = extgcd(b, a % b); int x = t.x; t.x = t.y; diff --git a/examples/polynomial.5c b/examples/polynomial.5c index 2e91fa6..1d9a61b 100644 --- a/examples/polynomial.5c +++ b/examples/polynomial.5c @@ -104,7 +104,7 @@ namespace Polynomial { abort("leading integer coefficient in divisor should be 1"); coefficient nq = na - nb + 1; if (nq <= 0) - return (quot_rem) { quot = (polynomial){0}, rem = b }; + return (quot_rem) { .quot = (polynomial){0}, .rem = b }; coefficient[nq] q = {0 ...}; while (na >= nb) { @@ -119,7 +119,7 @@ namespace Polynomial { while (na >= 1 && a[na - 1] == 0) --na; } - return (quot_rem) { quot = q, rem = normalize(a) }; + return (quot_rem) { .quot = q, .rem = normalize(a) }; } diff --git a/examples/prime.5c b/examples/prime.5c index 7068a03..b4ca209 100644 --- a/examples/prime.5c +++ b/examples/prime.5c @@ -50,12 +50,12 @@ namespace Factor { } if (i < 3) - return (int_list.ref) reference ((int_list_struct) { next = int_list.end, v = 2 }); + return (int_list.ref) reference ((int_list_struct) { .next = int_list.end, .v = 2 }); int_list l = primes (i-1); if (prime_wrt (l, i)) - return (int_list.ref) reference ((int_list_struct) { next = l, v = i }); + return (int_list.ref) reference ((int_list_struct) { .next = l, .v = i }); return l; } diff --git a/examples/rijndael.5c b/examples/rijndael.5c index 7a9b951..09526d9 100644 --- a/examples/rijndael.5c +++ b/examples/rijndael.5c @@ -924,10 +924,10 @@ void function main () /* * Create an encryption key and encryption instance */ - keyInstance encKeyInst = (keyInstance) { blockLen = 128 }; + keyInstance encKeyInst = (keyInstance) { .blockLen = 128 }; makeKey (&encKeyInst, DIR_ENCRYPT, 128, secret); - cipherInstance encCipherInst = (cipherInstance) { blockLen = 128 }; + cipherInstance encCipherInst = (cipherInstance) { .blockLen = 128 }; cipherInit (&encCipherInst, MODE_ECB, ""); /* @@ -942,10 +942,10 @@ void function main () /* * Create a decryption key and decryption instance */ - keyInstance decKeyInst = (keyInstance) { blockLen = 128 }; + keyInstance decKeyInst = (keyInstance) { .blockLen = 128 }; makeKey (&decKeyInst, DIR_DECRYPT, 128, secret); - cipherInstance decCipherInst = (cipherInstance) { blockLen = 128 }; + cipherInstance decCipherInst = (cipherInstance) { .blockLen = 128 }; cipherInit (&decCipherInst, MODE_ECB, ""); /* diff --git a/examples/roman.5c b/examples/roman.5c index 9c9da5b..5a15197 100644 --- a/examples/roman.5c +++ b/examples/roman.5c @@ -21,9 +21,9 @@ string function roman (int i) } digit; digit[*] digits = { - (digit) { ones = "C", five = "D", tens = "M", base = 100 }, - (digit) { ones = "X", five = "L", tens = "C", base = 10 }, - (digit) { ones = "I", five = "V", tens = "X", base = 1 } + (digit) { .ones = "C", .five = "D", .tens = "M", .base = 100 }, + (digit) { .ones = "X", .five = "L", .tens = "C", .base = 10 }, + (digit) { .ones = "I", .five = "V", .tens = "X", .base = 1 } }; string function place (int i, digit dig) diff --git a/examples/shortpaths.5c b/examples/shortpaths.5c index 14512ec..9c42a35 100644 --- a/examples/shortpaths.5c +++ b/examples/shortpaths.5c @@ -21,7 +21,7 @@ int blot = 10; SVG::start(stdout, side, side); -point[10] locns = { [i] = (point){x = randint(side), y = randint(side)} }; +point[10] locns = { [i] = (point){ .x = randint(side), .y = randint(side)} }; for (int i = 0; i < dim(locns); i++) SVG::spot(stdout, "red", locns[i].x, locns[i].y, blot); diff --git a/examples/skiplist.5c b/examples/skiplist.5c index b71afe5..f081d48 100644 --- a/examples/skiplist.5c +++ b/examples/skiplist.5c @@ -66,11 +66,11 @@ namespace Skiplist { */ { return &(SkipRec) { - level = 0, - greater = greater, - header = { - forward = (ElementPtr[MaxLevel]) { [i] = ElementPtr.nil }, - value = <> + .level = 0, + .greater = greater, + .header = { + .forward = (ElementPtr[MaxLevel]) { [i] = ElementPtr.nil }, + .value = <> } }; } @@ -125,8 +125,8 @@ namespace Skiplist { * Allocate new list entry */ ElementPtr new = (ElementPtr.element) &(Element) { - value = value, - forward = (ElementPtr[level]) {} + .value = value, + .forward = (ElementPtr[level]) {} }; for (int i = 0; i < level; i++) diff --git a/examples/smlng/context.5c b/examples/smlng/context.5c index f0c8cec..1517d05 100644 --- a/examples/smlng/context.5c +++ b/examples/smlng/context.5c @@ -22,7 +22,7 @@ typedef struct { *context no_context = reference ((context) {}); context root_context = (context) { - styles=0, underline=0, color=-1, size=-1 + .styles=0, .underline=0, .color=-1, .size=-1 }; public exception UnknownColor (int name); diff --git a/examples/smlng/parse.5c b/examples/smlng/parse.5c index e29d42b..584e981 100644 --- a/examples/smlng/parse.5c +++ b/examples/smlng/parse.5c @@ -94,15 +94,15 @@ public namespace Lex { case StateStart: switch (c.id) { case Lexc::Eof: - return (token) { id = Eof, value = "" }; + return (token) { .id = Eof, .value = "" }; case Lexc::Printable: case Lexc::Slash: state = StateString; - t = (token) { id = Text, value = String::new (c.c) }; + t = (token) { .id = Text, .value = String::new (c.c) }; continue; case Lexc::White: state = StateSpace; - t = (token) { id = Space, value = String::new (c.c) }; + t = (token) { .id = Space, .value = String::new (c.c) }; continue; case Lexc::Left: state = StateSeenLeft; @@ -113,11 +113,11 @@ public namespace Lex { switch (c.id) { case Lexc::Printable: state = StateStartTag; - t = (token) { id = Start, value = String::new (c.c) }; + t = (token) { .id = Start, .value = String::new (c.c) }; continue; case Lexc::Slash: state = StateEndTag; - t = (token) { id = End, value = "" }; + t = (token) { .id = End, .value = "" }; continue; } break; @@ -197,7 +197,7 @@ public namespace Parse { { *element first = element_end; * *element p = &first; - *c_list c = reference ( (c_list) { ctxt=&root_context, prev=c_list_end}); + *c_list c = reference ( (c_list) { .ctxt=&root_context, .prev=c_list_end}); for (;;) { @@ -211,23 +211,23 @@ public namespace Parse { return first; case Lex::Text: *p = reference ((element) { - next = element_end, - data = t.value, - ctxt = c->ctxt }); + .next = element_end, + .data = t.value, + .ctxt = c->ctxt }); p = &(*p)->next; break; case Lex::Space: *p = reference ((element) { - next = element_end, - data = t.value, - ctxt = c->ctxt }); + .next = element_end, + .data = t.value, + .ctxt = c->ctxt }); p = &(*p)->next; break; case Lex::Start: c = reference ((c_list) { - ctxt = reference (*c->ctxt), - prev = c, - active_tag = t.value }); + .ctxt = reference (*c->ctxt), + .prev = c, + .active_tag = t.value }); context_set (c->ctxt, t.value); break; case Lex::End: commit 3cf7567bbfa16e93c32a5a2477b28e2a91b37ae1 Author: Keith Packard Date: Sun Nov 25 21:50:59 2007 -0800 Skiplist test code had a typo. "hi" is not a legal initializer for an integer variable. diff --git a/examples/skiplisttest.5c b/examples/skiplisttest.5c index 9037d86..baf0236 100644 --- a/examples/skiplisttest.5c +++ b/examples/skiplisttest.5c @@ -10,7 +10,7 @@ autoload Skiplist; autoload PRNG; -int gt_count = "hi"; +int gt_count = 0; bool int_gt (int a, int b) { ++gt_count; commit 9be14d5dcb8e55d22066845a0278a0c22374b0c9 Author: Keith Packard Date: Sun Nov 25 21:49:41 2007 -0800 'randtest' example used now-missing 'vprintf' function. vprintf was replaced by the general '...' mechanism for passing an array as a list of arguments. Somehow, this example was never updated. diff --git a/examples/randtest.5c b/examples/randtest.5c index adebee4..5b68c9f 100644 --- a/examples/randtest.5c +++ b/examples/randtest.5c @@ -18,4 +18,4 @@ int[*] function t(int n) { return s; } -File::vprintf ("%d %d\n", t (string_to_integer (argv[1]))); +File::printf ("%d %d\n", t (string_to_integer (argv[1]))...); commit f8f1d223a46cffff9fcc89fa7524fdf57cbacf7c Author: Keith Packard Date: Sun Nov 25 21:48:22 2007 -0800 Tests - use '.' in struct initializers. Add '.' before struct tag in initializers now that it is permitted. diff --git a/test/optest.5c b/test/optest.5c index 18dbb76..1b88d7e 100644 --- a/test/optest.5c +++ b/test/optest.5c @@ -49,9 +49,9 @@ check (*z, 4); union {int a; string b;} test; check (sprintf ("%v", test), "{}") check (test.a = 1, 1); -check (test, (union {int a;}) {a = 1}); +check (test, (union {int a;}) { .a = 1}); check (test.b = "hello", "hello"); -check (test, (union {string b;}) { b = "hello" }); +check (test, (union {string b;}) { .b = "hello" }); check (bool func () { try { test.a; return false; commit 81beb0e9394e715e7354cebeb58c261a2e9b2019 Author: Keith Packard Date: Sun Nov 25 21:47:11 2007 -0800 Builtins -- add newly permitted '.' before tag in struct initializers. Now that struct initializers permit '.', use them for the builtin nickle code. diff --git a/command.5c b/command.5c index e3778f8..c4f69c1 100644 --- a/command.5c +++ b/command.5c @@ -274,30 +274,30 @@ extend namespace Command { } ParseArgs::argdesc argd = { - args = { - {var = {arg_lambda = save_library}, - abbr = 'l', - name = "library", - expr_name = "lib", - desc = "Library to load."}, - {var = {arg_lambda = save_file}, - abbr = 'f', - name = "file", - expr_name = "source", - desc = "Source file to load."}, - {var = {arg_lambda = save_expr}, - abbr = 'e', - name = "expr", - expr_name = "expression", - desc = "Expression to evaluate."} + .args = { + { .var = { .arg_lambda = save_library}, + .abbr = 'l', + .name = "library", + .expr_name = "lib", + .desc = "Library to load."}, + { .var = { .arg_lambda = save_file}, + .abbr = 'f', + .name = "file", + .expr_name = "source", + .desc = "Source file to load."}, + { .var = { .arg_lambda = save_expr}, + .abbr = 'e', + .name = "expr", + .expr_name = "expression", + .desc = "Expression to evaluate."} }, - posn_args = { - {var = {arg_lambda = save_script}, - name = "script", - optional = <>} + .posn_args = { + { .var = { .arg_lambda = save_script}, + .name = "script", + .optional = <>} }, - unknown = &(int user_argind), - prog_name = "nickle" + .unknown = &(int user_argind), + .prog_name = "nickle" }; /* actually parse the arguments */ diff --git a/mutex.5c b/mutex.5c index 2882a88..865354b 100644 --- a/mutex.5c +++ b/mutex.5c @@ -91,8 +91,8 @@ namespace Mutex { */ { return reference ((mutex_struct) { - sem = Semaphore::new (1), - owner = mutex_owner.nobody + .sem = Semaphore::new (1), + .owner = mutex_owner.nobody }); } } diff --git a/printf.5c b/printf.5c index 480521b..69d13eb 100644 --- a/printf.5c +++ b/printf.5c @@ -161,18 +161,18 @@ extend namespace File { string message; int base; }[*] fmts = { - { formats = "s", test = is_string, - message = "string", base = 10 }, - { formats = "dD", test = is_int, - message = "int", base = 10 }, - { formats = "bB", test = is_int, - message = "int", base = 2 }, - { formats = "oO", test = is_int, - message = "int", base = 8 }, - { formats = "xX", test = is_int, - message = "int", base = 16 }, - { formats = "efEF", test = is_number, - message = "real", base = 10 } + { .formats = "s", .test = is_string, + .message = "string", .base = 10 }, + { .formats = "dD", .test = is_int, + .message = "int", .base = 10 }, + { .formats = "bB", .test = is_int, + .message = "int", .base = 2 }, + { .formats = "oO", .test = is_int, + .message = "int", .base = 8 }, + { .formats = "xX", .test = is_int, + .message = "int", .base = 16 }, + { .formats = "efEF", .test = is_number, + .message = "real", .base = 10 } }; poly this_arg = arg::next(); diff --git a/string.5c b/string.5c index 24e30d1..8f9af18 100644 --- a/string.5c +++ b/string.5c @@ -185,7 +185,7 @@ extend namespace String { } public dequote_t dequote = make_dequote( - (quote_context) {oq = "\"", cq = "\"", qq = "\\"} + (quote_context) { .oq = "\"", .cq = "\"", .qq = "\\"} ); typedef (string[*])(string) parse_csv_t; @@ -249,7 +249,7 @@ extend namespace String { } public parse_csv_t parse_csv = make_parse_csv( - (quote_context) {oq = "\"", cq = "\"", qq = "\""} + (quote_context) { .oq = "\"", .cq = "\"", .qq = "\""} ); } From keithp at keithp.com Sun Nov 25 22:03:42 2007 From: keithp at keithp.com (Keith Packard) Date: Sun, 25 Nov 2007 22:03:42 -0800 (PST) Subject: [Nickle] nickle: Branch 'master' Message-ID: <20071126060342.7BBAF130022@keithp.com> configure.in | 2 +- debian/changelog | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) New commits: commit f697f8a66f4e4a408a076a6f7ea9daf5256a71c5 Author: Keith Packard Date: Sun Nov 25 22:00:19 2007 -0800 Bump to version 2.61 diff --git a/configure.in b/configure.in index 53e7a66..7616586 100644 --- a/configure.in +++ b/configure.in @@ -7,7 +7,7 @@ dnl for licensing information. AC_PREREQ(2.59) AC_INIT([nickle], - 2.60, + 2.61, [http://nickle.org], nickle) diff --git a/debian/changelog b/debian/changelog index e5988fe..8081efd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +nickle (2.61-1) unstable; urgency=low + * Allow '.' before struct elt in initializers + * Update builtins, tests and examples to use the new syntax + * Bump to version 2.61 + + -- Keith Packard Sun, 25 Nov 2007 21:57:24 -0800 + nickle (2.60-1) unstable; urgency=low * Bump to version 2.60 * Flush file output on exit call. From keithp at keithp.com Sun Nov 25 22:03:46 2007 From: keithp at keithp.com (Keith Packard) Date: Sun, 25 Nov 2007 22:03:46 -0800 (PST) Subject: [Nickle] nickle: Changes to 'refs/tags/2.61' Message-ID: <20071126060346.68465130022@keithp.com> Tag '2.61' created by Keith Packard at 2007-11-26 06:03 -0800 Nickle version 2.61 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBHSmGlQp8BWwlsTdMRAhYsAJ9FkiEdMHlCoZjhdgXiv4860ZotIwCfdfjx BBFojyp1od/ppP9eeVvjSkg= =pW16 -----END PGP SIGNATURE----- Changes since 2.60-10: --- 0 files changed ---