diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 2833bbd2..398bb834 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1663,6 +1663,13 @@ LilyPond: - .ily ace_mode: text +Limbo: + type: programming + extensions: + - .b + - .m + ace_mode: text + Liquid: type: markup extensions: diff --git a/samples/Limbo/cat.b b/samples/Limbo/cat.b new file mode 100644 index 00000000..5b9e3b5b --- /dev/null +++ b/samples/Limbo/cat.b @@ -0,0 +1,48 @@ +implement Cat; + +include "sys.m"; + sys: Sys; + +include "draw.m"; + +Cat: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +stdout: ref Sys->FD; + +init(nil: ref Draw->Context, args: list of string) +{ + sys = load Sys Sys->PATH; + stdout = sys->fildes(1); + args = tl args; + if(args == nil) + args = "-" :: nil; + for(; args != nil; args = tl args){ + file := hd args; + if(file != "-"){ + fd := sys->open(file, Sys->OREAD); + if(fd == nil){ + sys->fprint(sys->fildes(2), "cat: cannot open %s: %r\n", file); + raise "fail:bad open"; + } + cat(fd, file); + }else + cat(sys->fildes(0), ""); + } +} + +cat(fd: ref Sys->FD, file: string) +{ + buf := array[Sys->ATOMICIO] of byte; + while((n := sys->read(fd, buf, len buf)) > 0) + if(sys->write(stdout, buf, n) < n) { + sys->fprint(sys->fildes(2), "cat: write error: %r\n"); + raise "fail:write error"; + } + if(n < 0) { + sys->fprint(sys->fildes(2), "cat: error reading %s: %r\n", file); + raise "fail:read error"; + } +} diff --git a/samples/Limbo/lock.b b/samples/Limbo/lock.b new file mode 100644 index 00000000..8b51e4f9 --- /dev/null +++ b/samples/Limbo/lock.b @@ -0,0 +1,26 @@ +implement Lock; + +include "sys.m"; + sys: Sys; +include "lock.m"; + +Semaphore.obtain(l: self ref Semaphore) +{ + l.c <-= 0; +} + +Semaphore.release(l: self ref Semaphore) +{ + <-l.c; +} + +Semaphore.new(): ref Semaphore +{ + l := ref Semaphore; + l.c = chan[1] of int; + return l; +} + +init() +{ +} diff --git a/samples/Limbo/lock.m b/samples/Limbo/lock.m new file mode 100644 index 00000000..ffd818c5 --- /dev/null +++ b/samples/Limbo/lock.m @@ -0,0 +1,13 @@ +Lock: module +{ + PATH: con "/dis/lib/lock.dis"; + + Semaphore: adt { + c: chan of int; + obtain: fn(nil: self ref Semaphore); + release: fn(nil: self ref Semaphore); + new: fn(): ref Semaphore; + }; + + init: fn(); +};