#!/usr/bin/env node // An implementation of the ROT13 substitution cipher [1], replacing each letter // with the letter 13 letters after it in the alphabet. // // Nearly identical to cat, except the data is transformed in-place before // writing, and only a single input file is read. // // [1] https://en.wikipedia.org/wiki/ROT13 var rw = require("../"); var reader = rw.fileReader(process.argv[2] || "/dev/stdin"), writer = rw.fileWriter("/dev/stdout"); var CODE_A = "A".charCodeAt(0), CODE_Z = "Z".charCodeAt(0), CODE_a = "a".charCodeAt(0), CODE_z = "z".charCodeAt(0); function rot13(buffer) { for (var i = 0, n = buffer.length, character; i < n; ++i) { character = buffer[i]; if (CODE_A <= character && character <= CODE_Z) { buffer[i] = (character - CODE_A + 13) % 26 + CODE_A; } else if (CODE_a <= character && character <= CODE_z) { buffer[i] = (character - CODE_a + 13) % 26 + CODE_a; } } return buffer; } reader.fill(function flow(error) { if (error) throw error; var data = reader.read(); if (data && !writer.write(rot13(data))) return writer.drain(flow); if (reader.ended) return writer.end(); reader.fill(flow); });