Class Origami::Filter::ASCII85
In: sources/parser/filters.rb
Parent: Object

Class representing a filter used to encode and decode data written in base85 encoding.

Methods

decode   encode  

Included Modules

Filter

Public Instance methods

Decodes the given data encoded in base85.

string:The data to decode.

[Source]

     # File sources/parser/filters.rb, line 349
349:       def decode(string)
350:         
351:         input = (string.include?(EOD) ? string[0..string.index(EOD) - 1] : string).delete(" \f\t\r\n\0")
352:         
353:         i = 0
354:         result = ""
355:         while i < input.size do
356:           
357:           if input.length - i < 5
358:           then
359:             if input.length - i == 1 then raise InvalidASCII85String, "Invalid length" end
360:             
361:             addend = 5 - (input.length - i)
362:             input << "u" * addend
363:           else
364:             addend = 0
365:           end
366:           
367:           if input[i] == ?z
368:             inblock = 0
369:           else
370:             
371:             inblock = 0
372:             outblock = ""
373:             
374:             # Checking if this string is in base85
375:             5.times { |j|
376:               if input[i+j] > ?u or input[i+j] < ?!
377:                 raise InvalidASCII85String, string
378:               else
379:                 inblock += (input[i+j] - ?!) * 85 ** (4 - j)
380:               end
381:             }
382:           
383:             if inblock > 2**32 - 1
384:               raise InvalidASCII85String, "Invalid value"
385:             end
386:           
387:           end
388:         
389:           4.times do |p|
390:             c = inblock / 256 ** (3 - p)
391:             outblock << c.chr
392:             
393:             inblock -= c * 256 ** (3 - p)
394:           end
395:           
396:           if addend != 0
397:             outblock = outblock[0, 4 - addend]
398:           end
399:         
400:           result << outblock
401:           
402:           i = i + 5
403:         end
404:         
405:         result
406:       end

Encodes given data into base85.

stream:The data to encode.

[Source]

     # File sources/parser/filters.rb, line 306
306:       def encode(stream)
307:         
308:         i = 0
309:         code = ""
310:         input = stream.dup
311:         
312:         while i < input.size do
313:           
314:           if input.length - i < 4
315:             addend = 4 - (input.length - i)
316:             input << "\0" * addend
317:           else
318:             addend = 0
319:           end
320:           
321:           inblock = (input[i] * 256**3 + input[i+1] * 256**2 + input[i+2] * 256 + input[i+3])
322:           outblock = ""
323:           
324:           5.times do |p|
325:             c = inblock / 85 ** (4 - p)
326:             outblock << (?! + c).chr
327:             
328:             inblock -= c * 85 ** (4 - p)
329:           end
330:           
331:           if outblock == "!!!!!" and addend == 0 then outblock = "z" end
332:           
333:           if addend != 0
334:             outblock = outblock[0,(4 - addend) + 1]
335:           end
336:           
337:           code << outblock
338:           
339:           i = i + 4
340:         end
341: 
342:         code
343:       end

[Validate]