+ s.write_native(items, first_byte, byte_length)
+ end
+
+ redef fun file_extension do
+ var its = _items
+ var p = last_byte
+ var c = its[p]
+ var st = _first_byte
+ while p >= st and c != '.'.ascii do
+ p -= 1
+ c = its[p]
+ end
+ if p <= st then return null
+ var ls = last_byte
+ return new FlatString.with_infos(its, ls - p, p + 1)
+ end
+
+ redef fun basename(extension) do
+ var bname
+ if is_windows then
+ var l = last_byte
+ var its = _items
+ var min = _first_byte
+ var sl = '/'.ascii
+ var ls = '\\'.ascii
+ while l > min and (its[l] == sl or its[l] == ls) do l -= 1
+ if l == min then return "\\"
+ var ns = l
+ while ns >= min and its[ns] != sl and its[ns] != ls do ns -= 1
+ bname = new FlatString.with_infos(its, l - ns, ns + 1)
+ else
+ var l = last_byte
+ var its = _items
+ var min = _first_byte
+ var sl = '/'.ascii
+ while l > min and its[l] == sl do l -= 1
+ if l == min then return "/"
+ var ns = l
+ while ns >= min and its[ns] != sl do ns -= 1
+ bname = new FlatString.with_infos(its, l - ns, ns + 1)
+ end
+
+ return if extension != null then bname.strip_extension(extension) else bname