Try this on for size:
https://gist.github.com/2040569
It's easier to follow in CoffeeScript but here is compiled javascript
version:
var parseSDP, readMedia, readSession, readTime;
parseSDP = function(text) {
var lines;
if (!text) return;
lines = text.split('\r\n');
return readSession(lines);
};
readSession = function(lines) {
var line, name, session, value, _ref, _ref2, _ref3;
session = {};
line = null;
while (line = lines.shift()) {
name = line.charAt(0);
value = line.slice(2);
if (name === 'a' || name === 'b') {
((_ref = session[name]) != null ? _ref : session[name] =
[]).push(value);
} else if (name === 't') {
((_ref2 = session.t) != null ? _ref2 : session.t =
[]).push(readTime(lines, {
t: value
}));
} else if (name === 'm') {
((_ref3 = session.m) != null ? _ref3 : session.m =
[]).push(readMedia(lines, {
m: value
}));
} else if (name) {
session[name] = value;
}
}
return session;
};
readTime = function(lines, entry) {
var line, _ref;
line = null;
while (line = lines.shift()) {
if (line.charAt(0) === 'r') {
((_ref = entry.r) != null ? _ref : entry.r =
[]).push(line.slice(2));
} else {
lines.unshift(line);
break;
}
}
return entry;
};
readMedia = function(lines, entry) {
var line, name, value, _ref;
line = null;
while (line = lines.shift()) {
name = line.charAt(0);
value = line.slice(2);
if (name === 'm') {
lines.unshift(line);
break;
} else if (name === 'a' || name === 'b') {
((_ref = entry[name]) != null ? _ref : entry[name] =
[]).push(value);
} else if (name) {
entry[name] = value;
}
}
return entry;
};