aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2003-05-17 06:10:20 +0000
committerNick Mathewson <nickm@torproject.org>2003-05-17 06:10:20 +0000
commit1d07a97300d48872726edd989f53bf489dc00a41 (patch)
treebaa19dd713b183d6694364251b6e17afe9195b0f
parent11fddbc0273c37d651399ec782c57065f8030a76 (diff)
downloadanonbib-1d07a97300d48872726edd989f53bf489dc00a41.tar.gz
Initial revision
svn:r2
-rw-r--r--BibTeX.py637
-rw-r--r--TODO21
-rw-r--r--perl/BibTeX.pm301
-rw-r--r--perl/PDOSBib.pm211
-rw-r--r--perl/PDOSCGI.pm68
-rw-r--r--perl/bibtex-entry.cgi206
-rw-r--r--perl/mkpdospubs.pl235
-rw-r--r--perl/pubs-date.cgi274
-rw-r--r--testbib/pdos.bib1742
-rw-r--r--writeHTML.py5
10 files changed, 3700 insertions, 0 deletions
diff --git a/BibTeX.py b/BibTeX.py
new file mode 100644
index 0000000..07e3b66
--- /dev/null
+++ b/BibTeX.py
@@ -0,0 +1,637 @@
+#!/usr/bin/python
+
+import cStringIO
+import re
+import sys
+
+INITIAL_STRINGS = {
+ 'jan' : 'January', 'feb' : 'February',
+ 'mar' : 'March', 'apr' : 'April',
+ 'may' : 'May', 'jun' : 'June',
+ 'jul' : 'July', 'aug' : 'August',
+ 'sep' : 'September', 'oct' : 'October',
+ 'nov' : 'November', 'dec' : 'December'
+ }
+
+class ParseError(Exception):
+ pass
+
+class BibTeX:
+ def __init__(self):
+ self.entries = []
+ self.byKey = {}
+ def addEntry(self, ent):
+ k = ent.key
+ if self.byKey.get(ent.key):
+ print >> sys.stderr, "Already have an entry named %s"%k
+ return
+ self.entries.append(ent)
+ self.byKey[ent.key] = ent
+ def resolve(self):
+ seen = {}
+ for ent in self.entries:
+ seen.clear()
+ while ent.get('crossref'):
+ try:
+ cr = self.byKey[ent['crossref'].lower()]
+ except KeyError:
+ print "No such crossref: %s", ent['crossref']
+ print ent
+ break
+ if seen.get(cr.key):
+ raise ParseError("Circular crossref at %s" % ent.key)
+ seen[cr.key] = 1
+ del ent.entries['crossref']
+ ent.entries.update(cr.entries)
+ ent.resolve()
+
+DISPLAYED_FIELDS = [ 'title', 'author', 'journal', 'booktitle',
+'school', 'institution', 'organization', 'volume', 'number', 'year',
+'month', 'address', 'chapter', 'edition', 'pages', 'editor',
+'howpublished', 'key', 'publisher', 'type', 'note' ]
+
+class BibTeXEntry:
+ def __init__(self, type, key, entries):
+ self.type = type
+ self.key = key
+ self.entries = entries
+ self._get = self.entries.__getitem__
+ def get(self, k, v=None):
+ return self.entries.get(k,v)
+ def __getitem__(self, k):
+ return self._get(k)
+ def __str__(self):
+ return self.format(70,1)
+ def format(self, width=70,v=0):
+ d = ["@%s{%s,\n" % (self.type, self.key)]
+ if v:
+ df = DISPLAYED_FIELDS[:]
+ for k in self.entries.keys():
+ if k not in df:
+ df.append(k)
+ else:
+ df = DISPLAYED_FIELDS
+ for f in df:
+ if not self.entries.has_key(f):
+ continue
+ v = self.entries[f]
+ d.append(" ")
+ s = "%s = {%s}\n" % (f, v)
+ d.append(_split(s,width))
+ d.append("}\n")
+ return "".join(d)
+ def resolve(self):
+ a = self.get('author')
+ if a:
+ self.parsedAuthor = parseAuthor(a)
+ #print a
+ #print " => ",repr(self.parsedAuthor)
+ else:
+ self.parsedAuthor = None
+ def check(self):
+ ok = 1
+ if self.type == 'inproceedings':
+ fields = 'booktitle', 'month', 'year'
+ elif self.type == 'article':
+ fields = 'journal', 'month', 'year'
+ elif self.type == 'techreport':
+ fields = 'institution', 'number'
+ elif self.type == 'misc':
+ fields = 'howpublished',
+ else:
+ fields = ()
+ fields += 'title', 'author'
+
+ for field in fields:
+ if not self.get(field):
+ print "ERROR: %s has no %s field" % (self.key, field)
+ self.entries[field] = "<b>???</b>"
+ ok = 0
+
+ return ok
+
+ def biblio_to_html(self):
+ if self.type == 'inproceedings':
+ booktitle = self['booktitle']
+ bookurl = self.get('bookurl')
+ if bookurl:
+ m = PROCEEDINGS_RE.match(booktitle)
+ if m:
+ res = ["In the ", m.group(1),
+ '<a href="%s">'%bookurl, m.group(2), "</a>"]
+ else:
+ res = ['In the <a href="%s">%s</a>' % (bookurl,booktitle)]
+ else:
+ res = ["In the ", booktitle ]
+
+ if self.get("edition"):
+ res.append(",")
+ res.append(self['edition'])
+ if self.get("address"):
+ res.append(",")
+ res.append(self['address'])
+ res.append(", %s %s" % (self['month'], self['year']))
+ if not self.get('pages'):
+ pass
+ elif "-" in self['pages']:
+ res.append(", pages&nbsp; %s"%self['pages'])
+ else:
+ res.append(", page&nbsp; %s"%self['pages'])
+ elif self.type == 'article':
+ res = ["In "]
+ if self.get('journalurl'):
+ res.append('<a href="%s">%s</a>'%
+ (self['journalurl'],self['journal']))
+ else:
+ res.append(self['journal'])
+ if self.get('volume'):
+ res.append(" <b>%s</b>"%self['volume'])
+ if self.get('number'):
+ res.append("(%s)"%self['number'])
+ res.append(", %s %s" % (self['month'], self['year']))
+ if not self.get('pages'):
+ pass
+ elif "-" in self['pages']:
+ res.append(", pages&nbsp; %s"%self['pages'])
+ else:
+ res.append(", page&nbsp; %s"%self['pages'])
+ elif self.type == 'techreport':
+ res = [ "%s %s %s" % (self['institution'],
+ self.get('type', 'technical report'),
+ self['number']) ]
+ if self.get('month') or self.get('year'):
+ res.append(", %s %s" % (self.get('month', ''),
+ self.get('year', '')))
+ elif self.type == 'mastersthesis' or self.type == 'phdthesis':
+ if self.get('type'):
+ res = [self['type']]
+ elif type == 'mastersthesis':
+ res = ["Masters's thesis"]
+ else:
+ res = ["Ph.D. thesis"]
+ if self.get('school'):
+ res.append(", %s"%(self['school']))
+ if self.get('month') or self.get('year'):
+ res.append(", %s %s" % (self.get('month', ''),
+ self.get('year', '')))
+ elif self.type == 'misc':
+ res = [self['howpublished']]
+ if self.get('month') or self.get('year'):
+ res.append(", %s %s" % (self.get('month', ''),
+ self.get('year', '')))
+ if not self.get('pages'):
+ pass
+ elif "-" in self['pages']:
+ res.append(", pages&nbsp; %s"%self['pages'])
+ else:
+ res.append(", page&nbsp; %s"%self['pages'])
+ else:
+ res = ["&lt;Odd type %s&gt;"%self.type]
+
+ res[0:0] = ["<span class='biblio'>"]
+ res.append("</span ")
+
+ res.append("<span class='availability'>"
+ "(<a href='__'>BibTex&nbsp entry<a>)")
+ return htmlize("".join(res))
+
+ def to_html(self):
+ res = ["<li><p class='entry'><span class='title'>%s</span>"%(
+ htmlize(self['title']))]
+ availability = []
+ for key, name in (('www_abstract_url', 'abstract'),
+ ('www_html_url', 'HTML'),
+ ('www_pdf_url', 'PDF'),
+ ('www_ps_url', 'PS'),
+ ('www_ps_gz_url', 'gzipped&nbsp;PS')):
+ url = self.get('key')
+ if not url: continue
+ availability.append('<a href="%s">%s</a>' %(url,name))
+ if availability:
+ res.append(" <span class='availability'>(")
+ res.append(",&nbsp;".join(availability))
+ res.append("</span")
+ res.append("<br>")
+
+ #res.append("\n<!-- %r -->\n" % self.parsedAuthor)
+ htmlAuthors = []
+ for author in self.parsedAuthor:
+ f,v,l,j = author.first,author.von,author.last,author.jr
+ a = " ".join(f+v+l)
+ if j:
+ a = "%s, %s" %(a,j)
+ htmlAuthors.append(htmlize(a))
+ if len(htmlAuthors) == 1:
+ res.append(htmlAuthors[0])
+ elif len(htmlAuthors) == 2:
+ res.append(" and ".join(htmlAuthors))
+ else:
+ res.append(", ".join(htmlAuthors[:-1]))
+ res.append(", and ")
+ res.append(htmlAuthors[-1])
+
+ if res[-1][-1] != '.':
+ res.append(".")
+ res.append("</span><br>\n")
+ res.append(self.biblio_to_html())
+ res.append("</p></li>\n\n")
+ return "".join(res)
+
+RE_LONE_AMP = re.compile(r'&([^a-z0-9])')
+RE_LONE_I = re.compile(r'\\i([^a-z0-9])')
+RE_ACCENT = re.compile(r'\\([\'`~^"])(.)')
+ACCENT_MAP = { "'": 'acute', "`" : 'grave', "~": 'tilde',
+ "^": 'circ', '"' : 'uml' }
+RE_TEX_CMD = re.compile(r"(?:\\[a-zA-Z@]+|\\.)")
+RE_PAGE_SPAN = re.compile(r"(\d)--(\d)")
+def htmlize(s):
+ s = RE_LONE_AMP.sub(lambda m: "&amp;%s" % m.group(1), s)
+ s = RE_LONE_I.sub(lambda m: "i%s" % m.group(1), s)
+ s = RE_ACCENT.sub(lambda m: "&%s%s;" %(m.group(2),
+ ACCENT_MAP[(m.group(1))]),
+ s)
+ s = RE_TEX_CMD.sub("", s)
+ s = s.translate(ALLCHARS, "{}")
+ s = RE_PAGE_SPAN.sub(lambda m: "%s-%s"%(m.groups()), s)
+ return s
+
+PROCEEDINGS_RE = re.compile(
+ r'((?:proceedings|workshop record) of(?: the)? )(.*)',
+ re.I)
+
+
+class ParsedAuthor:
+ def __init__(self, first, von, last, jr):
+ self.first = first
+ self.von = von
+ self.last = last
+ self.jr = jr
+ def __repr__(self):
+ return "ParsedAuthor(%r,%r,%r,%r)"%(self.first,self.von,
+ self.last,self.jr)
+ def __str__(self):
+ return " ".join(self.first+self.von+self.last+self.jr)
+
+def _split(s,w=79):
+ r = []
+ s = s.replace("\n", " ")
+ while len(s) > w:
+ for i in xrange(w-1, 0, -1):
+ if s[i] == ' ':
+ r.append(s[:i])
+ s = s[i+1:]
+ break
+ else:
+ r.append(s[:w])
+ s = s[w:]
+ r.append(s)
+ r.append("")
+ return "\n".join(r)
+
+class FileIter:
+ def __init__(self, fname=None, file=None, it=None, string=None):
+ if fname:
+ file = open(fname, 'r')
+ if string:
+ file = cStringIO.StringIO(string)
+ if file:
+ it = iter(file.xreadlines())
+ self.iter = it
+ assert self.iter
+ self.lineno = 0
+ self._next = it.next
+ def next(self):
+ self.lineno += 1
+ return self._next()
+
+
+def parseAuthor(s):
+ items = []
+
+ #print "A", `s`
+ s = s.strip()
+ while s:
+ s = s.strip()
+ bracelevel = 0
+ for i in xrange(len(s)):
+ if s[i] == '{':
+ bracelevel += 1
+ elif s[i] == '}':
+ bracelevel -= 1
+ elif bracelevel <= 0 and s[i] in " \t\n,":
+ break
+ if i+1 == len(s):
+ items.append(s)
+ else:
+ items.append(s[0:i])
+ if (s[i] == ','):
+ items.append(',')
+ s = s[i+1:]
+
+ #print "B", items
+
+ authors = [[]]
+ for item in items:
+ if item == 'and':
+ authors.append([])
+ else:
+ authors[-1].append(item)
+
+ #print "C", authors
+
+ parsedAuthors = []
+ # Split into first, von, last, jr
+ for author in authors:
+ #print author
+
+ commas = 0
+ fvl = []
+ vl = []
+ f = []
+ v = []
+ l = []
+ j = []
+ cur = fvl
+ for item in author:
+ if item == ',':
+ if commas == 0:
+ vl = fvl
+ fvl = []
+ cur = f
+ else:
+ j.extend(f)
+ f = []
+ else:
+ cur.append(item)
+ if commas == 0:
+ split_von(f,v,l,fvl)
+ else:
+ split_von(None,v,l,vl)
+
+ parsedAuthors.append(ParsedAuthor(f,v,l,j))
+ #print " ====> ", parsedAuthors[-1]
+
+ return parsedAuthors
+
+ALLCHARS = "".join(map(chr,range(256)))
+LC_CHARS = "abcdefghijklmnopqrstuvwxyz"
+SV_DELCHARS = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "@")
+RE_ESCAPED = re.compile(r'\\.')
+def split_von(f,v,l,x):
+ in_von = 0
+ while x:
+ tt = t = x[0]
+ del x[0]
+ if tt[:2] == '{\\':
+ tt = tt.translate(ALLCHARS, SV_DELCHARS)
+ tt = RE_ESCAPED.sub("", tt)
+ tt = tt.translate(ALLCHARS, "{}")
+ if tt.translate(ALLCHARS, LC_CHARS) == "":
+ v.append(t)
+ in_von = 1
+ elif in_von and f is not None:
+ l.append(t)
+ l.extend(x)
+ return
+ else:
+ f.append(t)
+ if not in_von:
+ l.append(f[-1])
+ del f[-1]
+
+class Parser:
+ def __init__(self, fileiter, initial_strings):
+ self.strings = INITIAL_STRINGS.copy()
+ self.strings.update(initial_strings)
+ self.fileiter = fileiter
+ self.entries = {}
+ self.result = BibTeX()
+ self.litStringLine = 0
+ self.entryLine = 0
+
+ def _parseKey(self, line):
+ it = self.fileiter
+ line = _advance(it,line)
+ m = KEY_RE.match(line)
+ if not m:
+ raise ParseError("Expected key at line %s"%self.fileiter.lineno)
+ key, line = m.groups()
+ return key, line
+
+ def _parseValue(self, line):
+ it = self.fileiter
+ bracelevel = 0
+ data = []
+ while 1:
+ line = _advance(it,line)
+ line = line.strip()
+ assert line
+
+ # Literal string?
+ if line[0] == '"':
+ line=line[1:]
+ self.litStringLine = it.lineno
+ while 1:
+ if bracelevel:
+ m = BRACE_CLOSE_RE.match(line)
+ if m:
+ data.append(m.group(1))
+ data.append('}')
+ line = m.group(2)
+ bracelevel -= 1
+ continue
+ else:
+ m = STRING_CLOSE_RE.match(line)
+ if m:
+ data.append(m.group(1))
+ line = m.group(2)
+ break
+ m = BRACE_OPEN_RE.match(line)
+ if m:
+ data.append(m.group(1))
+ line = m.group(2)
+ bracelevel += 1
+ continue
+ data.append(line)
+ line = it.next()
+ self.litStringLine = 0
+ elif line[0] == '{':
+ bracelevel += 1
+ line = line[1:]
+ while bracelevel:
+ m = BRACE_CLOSE_RE.match(line)
+ if m:
+ #print bracelevel, "A", repr(m.group(1))
+ data.append(m.group(1))
+ bracelevel -= 1
+ if bracelevel > 0:
+ #print bracelevel, "- '}'"
+ data.append('}')
+ line = m.group(2)
+ continue
+ m = BRACE_OPEN_RE.match(line)
+ if m:
+ bracelevel += 1
+ #print bracelevel, "B", repr(m.group(1))
+ data.append(m.group(1))
+ line = m.group(2)
+ continue
+ else:
+ #print bracelevel, "C", repr(line)
+ data.append(line)
+ line = it.next()
+ elif line[0] == '#':
+ print >>sys.stderr, "Weird concat on line %s"%it.lineno
+ elif line[0] in "},":
+ if not data:
+ print >>sys.stderr, "No data after field on line %s"%(
+ it.lineno)
+ else:
+ m = RAW_DATA_RE.match(line)
+ if m:
+ s = self.strings.get(m.group(1).lower())
+ if s is not None:
+ data.append(s)
+ else:
+ data.append(m.group(1))
+ line = m.group(2)
+ else:
+ raise ParseError("Questionable line at line %s"%it.lineno)
+
+
+ # Got a string, check for concatenation.
+ line = _advance(it,line)
+ line = line.strip()
+ assert line
+ if line[0] == '#':
+ line = line[1:]
+ else:
+ return "".join(data), line
+
+ def _parseEntry(self, line): #name, strings, entries
+ it = self.fileiter
+ self.entryLine = it.lineno
+ line = _advance(it,line)
+ m = BRACE_BEGIN_RE.match(line)
+ if not m:
+ raise ParseError("Expected an opening brace at line %s"%it.lineno)
+ line = m.group(1)
+
+ proto = { 'string' : 'p',
+ 'preamble' : 'v',
+ }.get(self.curEntType, 'kp*')
+
+ v = []
+ while 1:
+ line = _advance(it,line)
+
+ m = BRACE_END_RE.match(line)
+ if m:
+ line = m.group(1)
+ break
+ if not proto:
+ raise ParseError("Overlong entry starting on line %s"
+ % self.entryLine)
+ elif proto[0] == 'k':
+ key, line = self._parseKey(line)
+ v.append(key)
+ elif proto[0] == 'v':
+ value, line = self._parseValue(line)
+ v.append(value)
+ elif proto[0] == 'p':
+ key, line = self._parseKey(line)
+ v.append(key)
+ line = _advance(it,line)
+ line = line.lstrip()
+ if line[0] == '=':
+ line = line[1:]
+ value, line = self._parseValue(line)
+ v.append(value)
+ else:
+ assert 0
+ line = line.strip()
+ if line and line[0] == ',':
+ line = line[1:]
+ if proto and proto[1:] != '*':
+ proto = proto[1:]
+ if proto and proto[1:] != '*':
+ raise ParseError("Missing arguments to %s on line %s" % (
+ self.curEntType, self.entryLine))
+
+ if self.curEntType == 'string':
+ self.strings[v[0]] = v[1]
+ elif self.curEntType == 'preamble':
+ pass
+ else:
+ key = v[0]
+ d = {}
+ for i in xrange(1,len(v),2):
+ d[v[i].lower()] = v[i+1]
+ ent = BibTeXEntry(self.curEntType, key, d)
+ self.result.addEntry(ent)
+
+ return line
+
+ def parse(self):
+ try:
+ self._parse()
+ except StopIteration:
+ if self.litStringLine:
+ raise ParseError("Unexpected EOF in string (%s)" %
+ self.litStringLine)
+ elif self.entryLine:
+ raise ParseError("Unexpected EOF at line %s (%s)" % (
+ self.fileiter.lineno, self.entryLine))
+
+ return self.result
+
+ def _parse(self):
+ it = self.fileiter
+ line = it.next()
+ while 1:
+ while not line or line.isspace() or OUTER_COMMENT_RE.match(line):
+ line = it.next()
+ m = ENTRY_BEGIN_RE.match(line)
+ if m:
+ self.curEntType = m.group(1).lower()
+ line = m.group(2)
+ line = self._parseEntry(line)
+ self.entryLine = 0
+ else:
+ raise ParseError("Bad input at line %s (expected a new entry.)"
+ % it.lineno)
+
+def _advance(it,line):
+ while not line or line.isspace() or COMMENT_RE.match(line):
+ line = it.next()
+ return line
+
+OUTER_COMMENT_RE = re.compile(r'^\s*[\#\%]')
+COMMENT_RE = re.compile(r'^\s*\%')
+ENTRY_BEGIN_RE = re.compile(r'''^\s*\@([^\s\"\%\'\(\)\,\=\{\}]+)(.*)''')
+BRACE_BEGIN_RE = re.compile(r'\s*\{(.*)')
+BRACE_END_RE = re.compile(r'\s*\}(.*)')
+KEY_RE = re.compile(r'''\s*([^\"\#\%\'\(\)\,\=\{\}\s]+)(.*)''')
+
+STRING_CLOSE_RE = re.compile(r'^([^\{\}\"]*)\"(.*)')
+BRACE_CLOSE_RE = re.compile(r'^([^\{\}]*)\}(.*)')
+BRACE_OPEN_RE = re.compile(r'^([^\{\}]*\{)(.*)')
+RAW_DATA_RE = re.compile(r'^([^\s\},]+)(.*)')
+
+if __name__ == '__main__':
+ f = FileIter(fname="testbib/pdos.bib")
+ p = Parser(f, {})
+ print p
+ r = p.parse()
+ r.resolve()
+ for e in r.entries:
+ print e
+ for e in r.entries:
+ if e.type in ("proceedings", "journal"): continue
+ e.check()
+ for e in r.entries:
+ if e.type in ("proceedings", "journal"): continue
+ print e.to_html()
+
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..a0d767f
--- /dev/null
+++ b/TODO
@@ -0,0 +1,21 @@
+
+First usable python version:
+6 - Port what's there to python
+1 - Automate generation; delay implementing search?
+0 X I need a CGI for submitting changes? Probably not.
+2 - Make an HTML file with many anchors to hold the BiBTeX stuff.
+0 X Cached parsed BibTeX, if we have any reason to do so.
+ - Integrate two files: search for duplicates, return everything else.
+ - Matching
+15 min - Very dumb match: is everything the same? (For all fields)
+1 - Dumb match: Can we find something that has the same title
+ and the same year and the same authors? If so, and some
+ other fields differ, dump out both version in third file.
+4 - Less dumb match: As above, but with some fuzziness in
+ authors and titles.
+1.5 - CLI and real code
+2 - Cleaning
+1 - CLI
+1 - "Important" note.
+
+~ 20-21 hours.
diff --git a/perl/BibTeX.pm b/perl/BibTeX.pm
new file mode 100644
index 0000000..35d3467
--- /dev/null
+++ b/perl/BibTeX.pm
@@ -0,0 +1,301 @@
+package BibTeX;
+use Symbol 'qualify_to_ref';
+
+%bibtex_prototypes = ('string' => 'p', 'preamble' => 'v', '_' => 'kp*');
+
+sub parse_bibtex_key ($) {
+ my($fh) = @_;
+ $_ = <$fh> while ((/^\s+$/s || /^\s+%/) && !eof $fh);
+ if (/^\s*([^"#%'(),={}\s]+)(.*)/s) {
+ $_ = $2;
+ lc($1);
+ } else {
+ print STDERR "no key at line $.\n";
+ "";
+ }
+}
+
+sub parse_bibtex_value ($$) {
+ my($fh, $strings) = @_;
+ my($data) = "";
+ my($bracelevel, $line);
+
+ # loop over concatenation
+ while (1) {
+
+ # loop over lines
+ $_ = <$fh> while ((/^\s+$/s || /^\s+%/) && !eof $fh);
+ s/^\s+//;
+ if (eof $fh) {
+ print STDERR "unexpected end of file\n";
+ return $data;
+ }
+
+ # check type of thing
+ if (/^\"(.*)/s) {
+ $_ = $1;
+ $bracelevel = 0;
+ $line = $.;
+ while (1) {
+ if (!$bracelevel && /^([^{}\"]*)\"(.*)/s) {
+ $data .= $1;
+ $_ = $2;
+ last;
+ } elsif ($bracelevel && /^([^{}]*\})(.*)/s) {
+ $data .= $1;
+ $_ = $2;
+ $bracelevel--;
+ } elsif (/^([^{}]*\{)(.*)/s) {
+ $data .= $1;
+ $_ = $2;
+ $bracelevel++;
+ } else {
+ $data .= $_;
+ die "end of file within quotes started at line $line" if eof $fh;
+ $_ = <$fh>;
+ }
+ }
+
+ } elsif (/^\{(.*)/s) {
+ $_ = $1;
+ $bracelevel = 1;
+ $line = $.;
+ while ($bracelevel) {
+ if (/^([^{}]*)\}(.*)/s) {
+ $data .= $1;
+ $data .= "}" if $bracelevel > 1;
+ $_ = $2;
+ $bracelevel--;
+ } elsif (/^([^{}]*\{)(.*)/s) {
+ $data .= $1;
+ $_ = $2;
+ $bracelevel++;
+ } else {
+ $data .= $_;
+ die "end of file within braces started at line $line" if eof $fh;
+ $_ = <$fh>;
+ }
+ }
+
+ } elsif (/^\#/) {
+ # do nothing
+ print STDERR "warning: odd concatenation at line $.\n";
+ } elsif (/^[\},]/) {
+ print STDERR "no data after field at line $.\n" if $data eq '';
+ return $data;
+ } elsif (/^([^\s\},]+)(.*)/s) {
+ if ($strings->{lc($1)}) {
+ $data .= $strings->{lc($1)};
+ } else {
+ $data .= $1;
+ }
+ $_ = $2;
+ }
+
+ # got a single string, check for concatenation
+ $_ = <$fh> while ((/^\s+$/s || /^\s+%/) && !eof $fh);
+ s/^\s+//;
+ if (/^\#(.*)/s) {
+ $_ = $1;
+ } else {
+ return $data;
+ }
+ }
+}
+
+sub parse_bibtex_entry ($$$$) {
+ # uses caller's $_
+ my($fh, $name, $strings, $entries) = @_;
+ my($entryline) = $.;
+
+ $_ = <$fh> while /^\s+$/ && !eof $fh;
+ if (/^\s*\{(.*)/s) {
+ $_ = $1;
+ } else {
+ print STDERR "no open brace after \@$name starting at line $entryline\n";
+ return [];
+ }
+
+ # get prototype
+ my($prototype) = $bibtex_prototypes{$name};
+ $prototype = $bibtex_prototypes{'_'} if !defined $prototype;
+
+ # parse entry into `@v'
+ my(@v, $a, $b);
+ while (!eof $fh) {
+ $_ = <$fh> while /^\s*$/ && !eof $fh;
+ if (/^\s*\}(.*)/s) {
+ $_ = $1;
+ last;
+ } elsif ($prototype =~ /^k/) {
+ push @v, parse_bibtex_key($fh);
+ } elsif ($prototype =~ /^v/) {
+ push @v, parse_bibtex_value($fh, $strings);
+ } elsif ($prototype =~ /^p/) {
+ push @v, parse_bibtex_key($fh);
+ $_ = <$fh> while /^\s+$/ && !eof $fh;
+ s/^\s+\=?//;
+ push @v, parse_bibtex_value($fh, $strings);
+ }
+ $_ = <$fh> while /^\s*$/ && !eof $fh;
+ s/^\s*,?//;
+ $prototype = substr($prototype, 1)
+ if $prototype && $prototype !~ /^.\*/;
+ }
+ print STDERR "missing args to \@$name at line $.\n"
+ if $prototype && $prototype !~ /^.\*/;
+
+ # do something with entry
+ if ($name eq 'string') {
+ $strings->{$v[0]} = $v[1];
+ } elsif ($name eq 'preamble') {
+ # do nothing
+ } else {
+ my($key) = shift @v;
+ $entries->{$key} = {@v};
+ $entries->{$key}->{'_type'} = $name;
+ $entries->{$key}->{'_key'} = $key;
+ push @{$entries->{'_'}}, $key;
+ }
+}
+
+sub parse (*;\%) {
+ my($fh) = qualify_to_ref(shift, caller);
+ my($initial_strings) = @_;
+ my($strings) = $initial_strings;
+
+ my($curname, $garbage, %entries);
+ local($_) = '';
+ while (<$fh>) {
+
+ if (/^\s*[%\#]/ || /^\s*$/) {
+ # comment
+
+ } elsif (/^\s*\@([^\s\"\#%\'(),={}]+)(.*)/s) {
+ $curname = lc($1);
+ $_ = $2;
+ parse_bibtex_entry($fh, $curname, $strings, \%entries);
+
+ } else {
+ print STDERR "garbage at line $.\n" if !defined $garbage;
+ $garbage = 1;
+ }
+ }
+
+ \%entries;
+}
+
+sub expand ($$) {
+ my($e, $key) = @_;
+ my(%d) = %{$e->{$key}};
+ while ($d{'crossref'}) {
+ my($v) = $d{'crossref'};
+ delete $d{'crossref'};
+ %d = (%{$e->{$v}}, %d);
+ }
+ \%d;
+}
+
+
+sub split_von ($$$@) {
+ my($f, $v, $l, @x) = @_;
+ my(@pre, $t, $in_von, $tt);
+ while (@x) {
+ $t = $tt = shift @x;
+ if ($tt =~ /^\{\\/) {
+ $tt =~ s/\\[A-Za-z@]+//g;
+ $tt =~ s/\\.//g;
+ $tt =~ tr/{}//d;
+ }
+ if ($tt =~ /^[a-z]/) {
+ push @$v, $t;
+ $in_von = 1;
+ } elsif ($in_von || !ref($f)) {
+ push @$l, $t, @x;
+ return;
+ } else {
+ push @$f, $t;
+ }
+ }
+ if (!$in_von) {
+ push @$l, (pop @$f);
+ }
+}
+
+sub parse_author ($) {
+ local($_) = @_[0];
+ my(@x) = ();
+ my($pos, $pos0, $t, $bracelevel);
+
+ # move text into @x
+ while (!/^\s*$/) {
+ s/^\s+//;
+ $pos = 0;
+ while ($pos < length) {
+ $t = substr($_, $pos, 1);
+ if ($t eq '{') {
+ $bracelevel++;
+ } elsif ($t eq '}') {
+ $bracelevel--;
+ } elsif ($bracelevel <= 0) {
+ last if ($t =~ /[\s,]/);
+ }
+ $pos++;
+ }
+
+ push @x, substr($_, 0, $pos);
+ if ($t eq ',') {
+ push @x, ',';
+ $pos++;
+ }
+ $_ = substr($_, $pos);
+ }
+
+ # split @x into arrays based on `and'
+ my(@aa) = ([]);
+ foreach $t (@x) {
+ if ($t eq 'and') {
+ push @aa, [] if @{$aa[-1]} > 0;
+ } else {
+ push @{$aa[-1]}, $t;
+ }
+ }
+
+ # massage each subarray into four parts: first, von, last, jr
+ my(@aaa) = ();
+ foreach $t (@aa) {
+ my(@fvl, @vl, @v, @l, @f, @j, $cur, $commas);
+ $cur = \@fvl; $commas = 0;
+
+ # split into subarrays if possible
+ foreach $x (@$t) {
+ if ($x eq ',') {
+ if ($commas == 0) {
+ @vl = @fvl;
+ @fvl = ();
+ $cur = \@f;
+ } else {
+ push @j, @f;
+ @f = ();
+ }
+ $commas++;
+ } else {
+ push @$cur, $x;
+ }
+ }
+
+ # split out the `von' part
+ if ($commas == 0) {
+ split_von(\@f, \@v, \@l, @fvl);
+ } else {
+ split_von(0, \@v, \@l, @vl);
+ }
+
+ # store as an array of arrays
+ push @aaa, [[@f], [@v], [@l], [@j]];
+ }
+
+ @aaa;
+}
+
+1;
diff --git a/perl/PDOSBib.pm b/perl/PDOSBib.pm
new file mode 100644
index 0000000..acc7a9c
--- /dev/null
+++ b/perl/PDOSBib.pm
@@ -0,0 +1,211 @@
+package main;
+
+# maps regexps, which are applied to authors, to their home page URLs
+@author_urls =
+ ('Engler' => 'http://www.pdos.lcs.mit.edu/~engler/',
+ 'Kaashoek' => 'http://www.pdos.lcs.mit.edu/~kaashoek/',
+ 'Blake' => 'http://www.pdos.lcs.mit.edu/cb/',
+ 'Mazi&egrave;res' => 'http://www.scs.cs.nyu.edu/~dm/',
+ 'Ganger' => 'http://www.ece.cmu.edu/~ganger/',
+ 'Grimm' => 'http://www.cs.washington.edu/homes/rgrimm/',
+ 'Hsieh' => 'http://www2.cs.utah.edu/~wilson/',
+ 'Brice&ntilde;o' => 'http://mit.edu/hbriceno/www/',
+ 'Wallach' => 'http://www.pdos.lcs.mit.edu/~kerr/',
+ 'Candea' => 'http://www.cs.stanford.edu/~candea/',
+ 'Kohler' => 'http://www.pdos.lcs.mit.edu/~eddietwo/',
+ 'Kirk.*Johnson' => 'http://www.cs.colorado.edu/~tuna/',
+ 'Weihl' => 'http://www.research.digital.com/SRC/staff/weihl/',
+ 'Nygren' => 'http://www.mit.edu/people/nygren/',
+ 'Anthony.*Joseph' => 'http://www.cs.berkeley.edu/~adj/',
+ 'Poletto' => 'http://www.pdos.lcs.mit.edu/~maxp/',
+ 'Kaminsky' => 'http://www.pdos.lcs.mit.edu/~kaminsky/',
+ 'Morris' => 'http://www.pdos.lcs.mit.edu/~rtm/',
+ 'Jannotti' => 'http://www.jannotti.com/',
+ 'Benjie' => 'http://www.pdos.lcs.mit.edu/~benjie/',
+ 'Jinyang' => 'http://www.pdos.lcs.mit.edu/~jinyang/',
+ 'Douglas.*outo' => 'http://www.pdos.lcs.mit.edu/~decouto/',
+ 'Kevin.*Fu' => 'http://snafu.fooworld.org/~fubob/',
+ 'Karger' => 'http://theory.lcs.mit.edu/~karger/',
+ 'Dabek' => 'http://pdos.lcs.mit.edu/~fdabek/',
+ 'Brunskill' => 'http://pdos.lcs.mit.edu/~emma/',
+ 'Balakrishnan' => 'http://nms.lcs.mit.edu/~hari/',
+ 'Stoica' => 'http://www.cs.berkeley.edu/~istoica/',
+ 'Andersen' => 'http://nms.lcs.mit.edu/~dga/',
+ 'Snoeren' => 'http://nms.lcs.mit.edu/~snoeren/',
+ 'Freedman' => 'http://www.pdos.lcs.mit.edu/~mfreed/',
+ 'Emil.*Sit' => 'http://www.mit.edu/~sit/',
+ 'Nick.*Feamster' => 'http://nms.lcs.mit.edu/~feamster/',
+ );
+
+# don't print entries for these types, which are only used for crossreferences
+%dont_print =
+ ('proceedings' => 1, 'journal' => 1);
+
+%initial_strings =
+ ('jan' => 'January', 'feb' => 'February',
+ 'mar' => 'March', 'apr' => 'April',
+ 'may' => 'May', 'jun' => 'June',
+ 'jul' => 'July', 'aug' => 'August',
+ 'sep' => 'September', 'oct' => 'October',
+ 'nov' => 'November', 'dec' => 'December');
+
+
+sub dont_print ($) {
+ my($d) = @_;
+ $dont_print{$d->{'_type'}} || ($d->{'www_show'} eq 'no');
+}
+
+sub htmlize ($) {
+ my($x) = @_;
+ $x =~ s/&([^a-z0-9])/&amp;$1/g;
+ $x =~ s/\\i([^a-zA-Z@])/i$1/g;
+ $x =~ s/\\'(.)/&$1acute;/g;
+ $x =~ s/\\`(.)/&$1grave;/g;
+ $x =~ s/\\~(.)/&$1tilde;/g;
+ $x =~ s/\\\^(.)/&$1circ;/g;
+ $x =~ s/\\"(.)/&$1uml;/g;
+ $x =~ s/\\[a-zA-Z@]+//g;
+ $x =~ s/\\.//g;
+ $x =~ tr/{}//d;
+ $x =~ s/(\d)--(\d)/$1-$2/g;
+ $x;
+}
+
+sub htmlize_author ($) {
+ my($aaa) = @_;
+ my($x) = join(' ', @{$aaa->[0]}, @{$aaa->[1]}, @{$aaa->[2]});
+ if (@{$aaa->[3]}) {
+ $x .= ', ' . join(' ', @{$aaa->[3]});
+ }
+ htmlize($x);
+}
+
+sub push_availability ($$\@$) {
+ my($d, $key, $availability, $name) = @_;
+ if ($d->{$key}) {
+ my($url) = $d->{$key};
+ $url = $server_url . $url if $url =~ /^\//;
+ push @$availability, '<a href="' . $url . '">' . $name . '</a>';
+ }
+}
+
+sub htmlize_biblio_info ($) {
+ my($d) = @_;
+ my($_type) = $d->{'_type'};
+ my($x, $i);
+
+ if ($_type eq 'inproceedings') {
+ $x = "In the " . $d->{'booktitle'};
+ if ($d->{'bookurl'}) {
+ if ($x =~ /^(in the proceedings of( the)? )(.*)/i
+ || $x =~ /^(in the workshop record of( the)? )(.*)/i) {
+ $x = $1 . "<a href=\"$d->{'bookurl'}\">" . $3 . "</a>";
+ } else {
+ $x = "In the <a href=\"$d->{'bookurl'}\">$d->{'booktitle'}</a>";
+ }
+ }
+ $x .= ", " . $d->{'edition'} if $d->{'edition'};
+ $x .= ", " . $d->{'address'} if $d->{'address'};
+ $x .= ", " . $d->{'month'} . " " . $d->{'year'}
+ if $d->{'month'} || $d->{'year'};
+ $x .= ($d->{'pages'} =~ /^\d+$/ ? ", page&nbsp;" : ", pages&nbsp;")
+ . $d->{'pages'} if $d->{'pages'};
+
+ } elsif ($_type eq 'article') {
+ $x = "In " . $d->{'journal'};
+ if ($d->{'journalurl'}) {
+ $x =~ s/^(in )(.*)$/$1<a href="$d->{'journalurl'}">$2<\/a>/;
+ }
+ $x .= " <b>" . $d->{'volume'} . "</b>" if $d->{'volume'};
+ $x .= "(" . $d->{'number'} . ")" if $d->{'number'};
+ $x .= ", " . $d->{'month'} . " " . $d->{'year'}
+ if $d->{'month'} || $d->{'year'};
+ $x .= ($d->{'pages'} =~ /^\d+$/ ? ", page&nbsp;" : ", pages&nbsp;")
+ . $d->{'pages'} if $d->{'pages'};
+
+ } elsif ($_type eq 'techreport') {
+ $x = $d->{'institution'};
+ $x .= " " . ($d->{'type'} ? $d->{'type'} : "technical report");
+ $x .= " " . $d->{'number'};
+ $x .= ", " . $d->{'month'} . " " . $d->{'year'}
+ if $d->{'month'} || $d->{'year'};
+
+ } elsif ($_type eq 'mastersthesis' || $_type eq 'phdthesis') {
+ $x = ($_type eq 'mastersthesis' ? "Master's thesis" : "Ph.D. thesis");
+ $x = $d->{'type'} if $d->{'type'};
+ $x .= ", " . $d->{'school'} if $d->{'school'};
+ $x .= ", " . $d->{'month'} . " " . $d->{'year'}
+ if $d->{'month'} || $d->{'year'};
+
+ } elsif ($_type eq 'misc') {
+ $x = $d->{'howpublished'};
+ $x .= ", " . $d->{'month'} . " " . $d->{'year'}
+ if $d->{'month'} || $d->{'year'};
+ $x .= ($d->{'pages'} =~ /^\d+$/ ? ", page&nbsp;" : ", pages&nbsp;")
+ . $d->{'pages'} if $d->{'pages'};
+
+ } else {
+ $x = "&lt;odd type $_type&gt;";
+ }
+
+ $x = '<span class="biblio">' . $x . ".</span> ";
+ $x .= "<span class=\"availability\">(<a href=\"$cgi_dir/bibtex-entry.cgi?key=";
+ $x .= $d->{'_key'} . "\">BibTeX&nbsp;entry</a>)</span>";
+ htmlize($x);
+}
+
+sub htmlize_entry ($) {
+ my($d) = @_;
+ my(@availability, @a, $a, $i, $j, $x);
+
+ # print title
+ $x .= '<li><p class="entry"><span class="title">' . htmlize($d->{'title'}) . ".</span>";
+
+ # print availability
+ @availability = ();
+ push_availability $d, 'www_abstract_url', @availability, 'abstract';
+ push_availability $d, 'www_html_url', @availability, 'HTML';
+ push_availability $d, 'www_pdf_url', @availability, 'PDF';
+ push_availability $d, 'www_ps_url', @availability, 'PS';
+ push_availability $d, 'www_ps_gz_url', @availability, 'gzipped&nbsp;PS';
+ if (@availability) {
+ $x .= ' <span class="availability">(';
+ $x .= join(',&nbsp;', @availability) . ")</span>";
+ }
+ $x .= "<br>\n";
+
+ # print authors
+ $x .= '<span class="author">by ';
+ @a = BibTeX::parse_author($d->{'author'});
+ foreach $i (0..$#a) {
+ $x .= ", " if ($i > 0 && $i < $#a);
+ $x .= " and " if ($i == $#a && $#a == 1);
+ $x .= ", and " if ($i == $#a && $#a > 1);
+ $a = htmlize_author($a[$i]);
+ for ($j = 0; $j < @author_urls; $j += 2) {
+ if ($a =~ /$author_urls[$j]/) {
+ $x .= '<a href="' . $author_urls[$j+1] . '">' . $a . '</a>';
+ undef $a;
+ last;
+ }
+ }
+ $x .= $a if defined $a;
+ }
+ $x .= "." if $a !~ /\.$/;
+ $x .= "</span><br>\n";
+
+ $x .= htmlize_biblio_info($d);
+ $x .= "</p></li>\n\n";
+
+ $x;
+}
+
+
+sub url_untranslate ($) {
+ my($x) = $_[0];
+ $x =~ s/ /+/g;
+ $x =~ s/([%<>])/sprintf("%02x", chr($1))/eg;
+ $x;
+}
+
+1;
diff --git a/perl/PDOSCGI.pm b/perl/PDOSCGI.pm
new file mode 100644
index 0000000..94eb07c
--- /dev/null
+++ b/perl/PDOSCGI.pm
@@ -0,0 +1,68 @@
+package main;
+
+#####
+# SERVER DATA
+
+$server_url = "http://www.pdos.lcs.mit.edu";
+$img_dir = "/img";
+$cgi_dir = "/cgi-bin";
+$main_dir = ""; # == top dir
+$css_dir = ""; # == top dir
+$pdos_bib_dir = "/home/am0/httpd/htdocs/pdosbib";
+
+
+#####
+# ERROR_EXIT
+# &error_exit($title, $message...) prints an HTML document summarizing the
+# error and exits.
+
+sub error_exit ($@) {
+ my($title) = $_[0];
+ my($message) = join('', @_[1..$#_]);
+ print <<"EOD;";
+Content-type: text/html
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html><head><title>PDOS CGI Error</title></head>
+<body>
+
+<h1>$title</h1>
+
+<p>$message
+
+<p><a href="$server_url">PDOS home page</a>
+
+</body>
+</html>
+EOD;
+ exit 0;
+}
+
+#####
+# HTTP_DATE
+# Given a time value (seconds since 00:00:00 UTC, Jan 1, 1970), formats an
+# HTTP date and returns it. Useful for Expires:.
+
+@PDOSCGI::weekdays = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
+@PDOSCGI::months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
+
+sub http_date ($) {
+ my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
+ gmtime($_[0]);
+ sprintf("%s, %02d %s %d %02d:%02d:%02d GMT",
+ $PDOSCGI::weekdays[$wday], $mday, $PDOSCGI::months[$mon],
+ $year, $hour, $min, $sec);
+}
+
+#####
+# URL_TRANSLATE
+
+sub url_translate ($) {
+ my($x) = $_[0];
+ $x =~ s/\+/ /g;
+ $x =~ s/%(\w\w)/pack('C', hex($1))/eg;
+ $x;
+}
+
+1;
diff --git a/perl/bibtex-entry.cgi b/perl/bibtex-entry.cgi
new file mode 100644
index 0000000..8c166fa
--- /dev/null
+++ b/perl/bibtex-entry.cgi
@@ -0,0 +1,206 @@
+#!/usr/bin/perl
+# CGI script: PDOS publication BibTeX entry
+# Eddie Kohler, June 10, 1999
+
+use lib '/home/am3/httpd/htdocs/pdosbib';
+#use lib '/u/eddietwo/www/pdos/pdosbib';
+use BibTeX;
+use PDOSCGI;
+
+%initial_strings =
+ ('jan' => 'January', 'feb' => 'February',
+ 'mar' => 'March', 'apr' => 'April',
+ 'may' => 'May', 'jun' => 'June',
+ 'jul' => 'July', 'aug' => 'August',
+ 'sep' => 'September', 'oct' => 'October',
+ 'nov' => 'November', 'dec' => 'December');
+
+open(BIB, "$pdos_bib_dir/pdos.bib")
+ || error_exit("Can't open <tt>pdos.bib</tt>!");
+$e = BibTeX::parse(*BIB, %initial_strings);
+close BIB;
+
+#####
+# PROCESS_QUERY
+
+sub process_query ($) {
+ my($q) = $_[0];
+ while ($q =~ /^\&?([^\&]+)(.*)/) {
+ $_ = url_translate($1);
+ $q = $2;
+ if (/^key=(.*)$/) {
+ $bibtex_key = $1;
+ } else {
+ error_exit('Bad Query', <<"EOD;");
+I don't understand part of your query -- specifically, the ``<tt>$_</tt>''
+part.
+EOD;
+ }
+ }
+}
+
+
+##
+# INITIALIZATION & READING
+
+$index_url = "http://$ENV{'SERVER_NAME'}$ENV{'REQUEST_URI'}";
+$index_url =~ s#/[^/]+$#/#;
+
+&process_query($ENV{'QUERY_STRING'}) if exists $ENV{'QUERY_STRING'};
+
+print <<"EOD;";
+Content-type: text/html
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+
+<!-- Generated by `bibtex-entry.cgi'
+ -- (c) Eddie Kohler 1999-2000 -->
+
+<title>PDOS Publications Search Results</title>
+
+<link rel="stylesheet" type="text/css" href="$css_dir/main.css">
+<link rel="stylesheet" type="text/css" href="$css_dir/pubs.css">
+
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#bb0000" vlink="#990099"
+alink="#ff9900" marginheight="0" marginwidth="0">
+
+<table cellspacing="0" cellpadding="0" border="0" align="center">
+
+<tr valign="top">
+<td rowspan="8" width="134"><div align="right"><a href="/"><img
+src="/img/pdostab.gif" width="134" height="61" border="0"
+alt="PDOS Home"></a></div></td>
+<td rowspan="8" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td rowspan="4" width="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+<td rowspan="6" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p>&nbsp;&nbsp;<a href="http://web.mit.edu/">MIT</a>&nbsp;&gt;&nbsp;<a href="http://www.lcs.mit.edu/">LCS</a>&nbsp;&gt;&nbsp;<a href="/">PDOS&nbsp;Home</a>&nbsp;&gt;&nbsp;</p></td>
+<td bgcolor="#ffffcc"><p><a href="$main_dir/pubs.html">Publications</a>&nbsp;&gt;&nbsp;</p></td>
+<td bgcolor="#ffffcc"><p><b>BibTeX&nbsp;entry</b></p></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+<a href="$main_dir/projects.html">Projects</a><br>
+<a href="$main_dir/people.html">People</a><br>
+<a href="$main_dir/software.html">Software</a></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+<a href="$main_dir/pubs.html">By subject</a><br>
+<a href="/cgi-bin/pubs-date.cgi">By date</a><br>
+</p></td>
+</tr>
+
+<tr valign="top">
+<td colspan="2" height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="1" height="8" alt=""></td>
+<td height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="100" height="8" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="4" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td rowspan="2" colspan="3" bgcolor="#ccffff"><form action="/cgi-bin/pubs-date.cgi"
+method="get"><strong>&nbsp;Publication
+search:</strong><small>&nbsp;&nbsp;<input type=entry
+name=match size=15> <input type=submit
+value="Go"><br></small></form></td>
+
+<td width="8" bgcolor="#ccffff"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+</tr>
+
+<tr valign="bottom">
+<td rowspan="2" colspan="2" width="9" height="9" bgcolor="#ccffff" background="/img/nineborder.gif"><img src="/img/whitecorner.gif" width="9" height="9" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="3" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+</table>
+
+
+<table cellspacing="0" cellpadding="0" border="0" width="100%">
+
+<tr valign="top">
+<td width="15%" height="24"><br></td>
+</tr>
+
+<tr valign="top">
+<td></td>
+
+<td width="70%">
+
+EOD;
+
+$type = ($bibtex_key ? "<tt>`$bibtex_key'</tt>" : "all entries");
+print "<h1>BibTeX entry server: results for $type</h1>\n";
+
+sub break_lines ($$) {
+ my($t, $l) = @_;
+ my($s, $f, $p, $x) = (0, 0, 0, "");
+ while ($p < length $t) {
+ if (substr($t, $p, 1) =~ /\s/) {
+ $s = $p;
+ } elsif ($f + $l <= $p && $s > $f) {
+ $x .= substr($t, $f, $s - $f) . "\n";
+ $s = $f = $s + 1;
+ }
+ $p++;
+ }
+ $x .= substr($t, $f);
+ $x;
+}
+
+if ($bibtex_key && $e->{$bibtex_key}) {
+ $d = BibTeX::expand($e, $bibtex_key);
+ $k = "\@" . $d->{'_type'} . "{" . $bibtex_key . ",\n";
+ foreach $i ('title', 'author', 'journal', 'booktitle', 'school', 'institution', 'organization', 'volume', 'number', 'year', 'month', 'address', 'chapter', 'edition', 'pages', 'editor', 'howpublished', 'key', 'publisher', 'type', 'note') {
+ if (exists $d->{$i}) {
+ $k .= break_lines(" " . $i . " = {" . $d->{$i} . "},\n", 80);
+ }
+ }
+ $k .= "}\n";
+} elsif ($bibtex_key) {
+ print "<p>There is no PDOS paper with key `<tt>$bibtex_key</tt>'.\n";
+ undef $k;
+} else {
+ $k = `cat pdos.bib`;
+}
+if (defined $k) {
+ $k =~ s/&/&amp;/g;
+ $k =~ s/</&lt;/g;
+ $k =~ s/>/&gt;/g;
+ print "<p><pre>$k</pre>\n";
+}
+
+
+print <<"EOD;";
+</td>
+
+<td width="15%"><br></td>
+
+</tr>
+</table>
+
+</body>
+</html>
+EOD;
diff --git a/perl/mkpdospubs.pl b/perl/mkpdospubs.pl
new file mode 100644
index 0000000..c500b42
--- /dev/null
+++ b/perl/mkpdospubs.pl
@@ -0,0 +1,235 @@
+v#!/usr/local/bin/perl
+# ***
+# *** CGI script: static PDOS publication list
+# *** Eddie Kohler, June 10, 1999
+# ***
+# *** Take a look at PDOSBib.pm
+# *** to change things like people's URLs
+# *** and how different bibliography entries are generated
+# ***
+# *** Take a look at PDOSCGI.pm
+# *** to change where files are located
+# ***
+
+use lib '/home/am0/httpd/htdocs/pdosbib';
+use BibTeX;
+use PDOSBib;
+use PDOSCGI;
+
+sub do_entries () {
+ my($section, $key, $d);
+ foreach $section (@sections) {
+ # print section header
+ print '<h2><a name="', url_untranslate($section), '">';
+ print $section, "</a></h2>\n";
+ print "<ul class=\"expand\">\n";
+
+ # print all papers in that section
+ foreach $key (@{$e->{'_'}}) {
+ $d = BibTeX::expand($e, $key);
+ next if dont_print($d) || $d->{'www_section'} ne $section;
+ print htmlize_entry $d;
+ }
+
+ print "</ul>\n";
+ }
+}
+
+
+sub do_sections () {
+ foreach $section (@sections) {
+ print '<p class="l2"><a href="#', url_untranslate($section);
+ print '">', $section, "</a></p>\n";
+ }
+}
+
+
+# main program
+if (@ARGV > 0) {
+ open(BIB, $ARGV[0]) || die "can't open $ARGV[0]";
+} else {
+ open(BIB, "<&STDIN");
+}
+$e = BibTeX::parse(*BIB, %initial_strings);
+close BIB;
+
+if (@ARGV > 1) {
+ open(STDOUT, ">$ARGV[1]") || die "can't open $ARGV[1]";
+}
+
+# make sections
+@sections = ();
+foreach $key (@{$e->{'_'}}) {
+ next if dont_print($e->{$key});
+ $section = $e->{$key}->{'www_section'};
+ $e->{$key}->{'www_section'} = $section = "Miscellaneous" if $section eq '';
+ if (!exists $sections{$section}) {
+ push @sections, $section if $section ne '';
+ $sections{$section} = 1;
+ }
+}
+push @sections, 'Miscellaneous'
+ if $sections{''} && !$sections{'Miscellaneous'};
+
+## PRINT STUFF!
+$argv_string = join(' ', 'mkpdospubs.pl', @ARGV);
+print <<"EOD;";
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+
+<!-- *** I AM MACHINE GENERATED! DO NOT EDIT ME!
+ -- *** EDIT THE .bib FILE INSTEAD!
+ --
+ -- Generated by `$argv_string'
+ -- (c) Eddie Kohler 1999-2000 -->
+
+<title>PDOS Publications</title>
+
+<link rel="stylesheet" type="text/css" href="main.css">
+<link rel="stylesheet" type="text/css" href="pubs.css">
+
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#bb0000" vlink="#990099"
+alink="#ff9900" marginheight="0" marginwidth="0">
+
+<table cellspacing="0" cellpadding="0" border="0" align="center">
+
+<tr valign="top">
+<td rowspan="5" width="134"><div align="right"><a href="/"><img
+src="/img/pdostab.gif" width="134" height="61" border="0"
+alt="PDOS Home"></a></div></td>
+<td rowspan="5" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td rowspan="3" width="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+<td rowspan="3" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p>&nbsp;&nbsp;<a href="http://web.mit.edu/">MIT</a>&nbsp;&gt;&nbsp;<a href="http://www.lcs.mit.edu/">LCS</a>&nbsp;&gt;&nbsp;<a href="/">PDOS&nbsp;Home</a>&nbsp;&gt;&nbsp;</p></td>
+<td bgcolor="#ffffcc"><p><b>Publications</b>&nbsp;&gt;&nbsp;</p></td>
+<td bgcolor="#ffffcc"><p><b>By&nbsp;subject</b></p></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+<a href="projects.html">Projects</a><br>
+<a href="people.html">People</a><br>
+<a href="software.html">Software</a></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+<a href="/cgi-bin/pubs-date.cgi">By date</a></p></td>
+</tr>
+
+<tr valign="top">
+<td colspan="2" height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="1" height="8" alt=""></td>
+<td colspan="1" height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="100" height="8" alt=""></td>
+<td colspan="2" rowspan="2" width="9" height="9" bgcolor="#ffffcc"><img
+src="/img/whitecorner.gif" width="9" height="9" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="3" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+</table>
+
+
+<table cellspacing="0" cellpadding="0" border="0" width="100%">
+
+<tr valign="top">
+<td width="10%" height="24"><br></td>
+</tr>
+
+<tr valign="top">
+<td><div align="right">
+<table cellspacing="0" cellpadding="0" border="0" width="161">
+
+<tr valign="top">
+<td rowspan="6" width="8"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+<td colspan="4" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td rowspan="5" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+
+<td bgcolor="#ccffff"><p class="l1"><br><form action="/cgi-bin/pubs-date.cgi"
+method="get"><strong>Publication search:</strong><br>
+<small><input type=entry name=match size=15> <input type=submit
+value="Go"><br></small></form></p></td>
+
+<td width="8" bgcolor="#ccffff"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+<td rowspan="3" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+<td rowspan="3" width="12"><img src="/img/emptydot.gif"
+width="12" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="2" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ccffff"><p class="l1"><br><form action="/cgi-bin/pubs-date.cgi"
+method="get"><strong>Subjects:</strong><br>
+EOD;
+
+## PRINT SECTIONS
+do_sections;
+
+print <<"EOD;";
+</p></td>
+
+<td width="8" bgcolor="#ccffff"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td height="8" bgcolor="#ccffff"><img src="/img/emptydot.gif"
+width="1" height="8" alt=""></td>
+<td colspan="2" rowspan="2" width="9" height="9" bgcolor="#ccffff"><img
+src="/img/whitecorner.gif" width="9" height="9" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+</table>
+</div></td>
+
+<td width="75%">
+
+<h1>Publications by subject</h1>
+
+EOD;
+
+## PRINT ENTRIES
+do_entries;
+
+print <<"EOD;";
+</td>
+
+<td width="15%"><br></td>
+
+</tr>
+</table>
+
+</body>
+</html>
+EOD;
diff --git a/perl/pubs-date.cgi b/perl/pubs-date.cgi
new file mode 100644
index 0000000..aa64932
--- /dev/null
+++ b/perl/pubs-date.cgi
@@ -0,0 +1,274 @@
+#!/usr/local/bin/perl
+# CGI script: PDOS publications by date
+# Eddie Kohler, June 10, 1999
+
+use lib '/home/am0/httpd/htdocs/pdosbib';
+#use lib '/u/eddietwo/www/pdos/pdosbib';
+use BibTeX;
+use PDOSBib;
+use PDOSCGI;
+
+%date_back =
+ ('January' => 1, 'February' => 2,
+ 'March' => 3, 'April' => 4,
+ 'May' => 5, 'June' => 6,
+ 'July' => 7, 'August' => 8,
+ 'September' => 9, 'October' => 10,
+ 'November' => 11, 'December' => 12);
+
+sub do_entries () {
+ my($key, $d, @x, @d, @date, @permute, $x, $y, $i, $ever);
+ my($current_year) = (gmtime())[5] + 1900;
+
+ foreach $key (@{$e->{'_'}}) {
+ $d = BibTeX::expand($e, $key);
+ next if dont_print($d);
+ $x = $y = htmlize_entry $d;
+ if (defined $match) {
+ $y =~ s/&([\w])\w+;/$1/g;
+ $y =~ s/<.*?>//g;
+ next if !&matcher($y);
+ }
+ push @x, $x;
+ push @d, $d;
+ if ($d->{'year'} =~ /to appear/i) {
+ push @date, 12*$current_year + 12;
+ $d->{'_show_year'} = $current_year;
+ } else {
+ push @date, 12*$d->{'year'} + $date_back{$d->{'month'}};
+ $d->{'_show_year'} = ($d->{'year'} ? $d->{'year'} : 'unknown');
+ }
+ push @permute, $#x;
+ }
+
+ # permute the list, sort by date
+ @permute = reverse sort { $date[$a] <=> $date[$b] } @permute;
+ undef $y;
+
+ # print entries
+ foreach $i (@permute) {
+ $d = $d[$i];
+ if ($d->{'_show_year'} ne $y || !$ever) {
+ print "</ul>\n" if $ever;
+ $y = $d->{'_show_year'};
+ $ever = 1;
+ print "<h2>$y</h2>\n<ul class=\"expand\">\n";
+ }
+ print $x[$i];
+ }
+
+ print "</ul>\n" if $ever;
+ print "No matches.\n" if !$ever;
+}
+
+#####
+# PROCESS_QUERY
+
+sub process_query ($) {
+ my($q) = $_[0];
+ while ($q =~ /^\&?([^\&]+)(.*)/) {
+ $_ = url_translate($1);
+ $q = $2;
+ if (/^match=(.*)$/) {
+ $match = $1;
+ $match =~ s/\///g;
+ # my name gets mangled a lot... decouto
+ $match =~ s/decouto/De Couto/i;
+ } else {
+ error_exit('Bad Query', <<"EOD;");
+I don't understand part of your query -- specifically, the ``<tt>$_</tt>''
+part.
+EOD;
+ }
+ }
+}
+
+##
+# INITIALIZATION & READING
+
+$index_url = "http://$ENV{'SERVER_NAME'}$ENV{'REQUEST_URI'}";
+$index_url =~ s#/[^/]+$#/#;
+
+&process_query($ENV{'QUERY_STRING'}) if exists $ENV{'QUERY_STRING'};
+
+## PRINT DATA
+
+$| = 1;
+print <<"EOD;";
+Content-type: text/html
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+
+<!-- Generated by `pubs-date.cgi'
+ -- (c) Eddie Kohler 1999-2000 -->
+
+<title>PDOS Publications Search Results</title>
+
+<link rel="stylesheet" type="text/css" href="$css_dir/main.css">
+<link rel="stylesheet" type="text/css" href="$css_dir/pubs.css">
+
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#bb0000" vlink="#990099"
+alink="#ff9900" marginheight="0" marginwidth="0">
+
+<table cellspacing="0" cellpadding="0" border="0" align="center">
+
+<tr valign="top">
+<td rowspan="8" width="134"><div align="right"><a href="/"><img
+src="/img/pdostab.gif" width="134" height="61" border="0"
+alt="PDOS Home"></a></div></td>
+<td rowspan="8" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td rowspan="4" width="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+<td rowspan="6" width="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p>&nbsp;&nbsp;<a href="http://web.mit.edu/">MIT</a>&nbsp;&gt;&nbsp;<a href="http://www.lcs.mit.edu/">LCS</a>&nbsp;&gt;&nbsp;<a href="/">PDOS&nbsp;Home</a>&nbsp;&gt;&nbsp;</p></td>
+<td bgcolor="#ffffcc"><p><a href="$main_dir/pubs.html">Publications</a>&nbsp;&gt;&nbsp;</p></td>
+EOD;
+
+if (defined($match)) {
+ print '<td bgcolor="#ffffcc"><p><b>Search&nbsp;results</b></p></td>', "\n";
+} else {
+ print '<td bgcolor="#ffffcc"><p><b>By&nbsp;date</b></p></td>', "\n";
+}
+
+print <<"EOD;";
+</tr>
+
+<tr valign="top">
+<td bgcolor="#ffffcc"><p><br></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+<a href="$main_dir/projects.html">Projects</a><br>
+<a href="$main_dir/people.html">People</a><br>
+<a href="$main_dir/software.html">Software</a></p></td>
+<td bgcolor="#ffffcc"><p class="crumbbreadth">
+EOD;
+
+if (defined($match)) {
+ print '<a href="', $main_dir, '/pubs.html">All&nbsp;by&nbsp;subject</a><br>', "\n";
+ print '<a href="/cgi-bin/pubs-date.cgi">All&nbsp;by&nbsp;date</a><br>', "\n";
+} else {
+ print '<a href="', $main_dir, '/pubs.html">By&nbsp;subject</a><br>', "\n";
+}
+
+print <<"EOD;";
+</p></td>
+</tr>
+
+<tr valign="top">
+<td colspan="2" height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="1" height="8" alt=""></td>
+<td height="8" bgcolor="#ffffcc"><img src="/img/emptydot.gif"
+width="100" height="8" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="4" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td rowspan="2" colspan="3" bgcolor="#ccffff"><form action="/cgi-bin/pubs-date.cgi"
+method="get"><strong>&nbsp;Publication
+search:</strong><small>&nbsp;&nbsp;<input type="entry"
+name="match" size="15" value="$match"> <input type="submit"
+value="Go"><br></small></form></td>
+
+<td width="8" bgcolor="#ccffff"><img src="/img/emptydot.gif"
+width="8" height="1" alt=""></td>
+</tr>
+
+<tr valign="bottom">
+<td rowspan="2" colspan="2" width="9" height="9" bgcolor="#ccffff" background="/img/nineborder.gif"><img src="/img/whitecorner.gif" width="9" height="9" alt=""></td>
+</tr>
+
+<tr valign="top">
+<td colspan="3" height="1" bgcolor="#92a6a4"><img src="/img/emptydot.gif"
+width="1" height="1" alt=""></td>
+</tr>
+
+</table>
+
+
+<table cellspacing="0" cellpadding="0" border="0" width="100%">
+
+<tr valign="top">
+<td width="15%" height="24"><br></td>
+</tr>
+
+<tr valign="top">
+<td></td>
+
+<td width="70%">
+
+EOD;
+
+if (defined($match)) {
+ print "<h1>Publications matching `<tt>$match</tt>'</h1>\n";
+} else {
+ print "<h1>Publications by date</h1>\n";
+}
+
+$| = 0;
+
+open(BIB, "$pdos_bib_dir/pdos.bib")
+ || error_exit("Can't open <tt>pdos.bib</tt>!");
+$e = BibTeX::parse(*BIB, %initial_strings);
+close BIB;
+
+# make sections
+foreach $key (@{$e->{'_'}}) {
+ next if dont_print($e->{$key});
+ $e->{$key}->{'www_section'} = "Miscellaneous"
+ if $e->{$key}->{'www_section'} eq '';
+}
+
+if (defined($match)) {
+ $sub = 'sub main::matcher ($) { 1';
+ if ($match =~ /[\.\^\$\[\](){}*|]/) {
+ $sub .= " && \$_[0] =~ /$match/oi";
+ } elsif ($match eq ':abstract:') {
+ $sub .= " && \$_[0] =~ /\\(abstract\\b/oi";
+ } else {
+ $_ = $match;
+ s/\+//;
+ while ($_ ne '') {
+ s/^\s+//;
+ if (/^\"([^\"]+)(.*)/) {
+ $sub .= " && \$_[0] =~ /$1/oi";
+ $_ = $2;
+ $_ =~ s/^\"//;
+ } elsif (/^\"\"(.*)/) {
+ $_ = $2;
+ } elsif (/^(\S+)(.*)/) {
+ $sub .= " && \$_[0] =~ /$1/oi";
+ $_ = $2;
+ }
+ }
+ }
+ eval "$sub; }";
+}
+
+do_entries;
+
+print <<"EOD;";
+</td>
+
+<td width="15%"><br></td>
+
+</tr>
+</table>
+
+</body>
+</html>
+EOD;
diff --git a/testbib/pdos.bib b/testbib/pdos.bib
new file mode 100644
index 0000000..65b24b7
--- /dev/null
+++ b/testbib/pdos.bib
@@ -0,0 +1,1742 @@
+%% ***
+%% *** ASK YOURSELF:
+%% ***
+%% *** Did I put it in the right section?
+%% *** Did I include a `www_section' tag?
+%% *** Did I include the page numbers?
+%% *** Did I include the location of the conference (in the `address' tag)?
+%% ***
+%% *** When you are done editing this file, run this command:
+%% *** ./mkpdospubs.pl pdos.bib ../pubs.html
+%% ***
+
+@string{MIT = "Massachusetts Institute of Technology"}
+@string{MIT-LCS = "{MIT} Laboratory for Computer Science"}
+@string{ACMabbr = "{ACM}"}
+@string{SOSP = ACMabbr # " {S}ymposium on {O}perating {S}ystems {P}rinciples"}
+@string{IEEEabbr = "{IEEE}"}
+@string{IEEECompSoc = IEEEabbr # " {C}omputer {S}ociety"}
+@string{OSDI = "{USENIX} {S}ymposium on {O}perating {S}ystems {D}esign and {I}mplementation"}
+
+@string{PDOSWWW = "http://www.pdos.lcs.mit.edu"}
+
+%% P2P PAPERS
+
+@string{p2p = "Peer-to-peer Computing"}
+
+@inproceedings{ivy:osdi02,
+ title = "Ivy: A Read/Write Peer-to-peer File System",
+ author = "Athicha Muthitacharoen and Robert Morris and Thomer Gil and Benjie Chen",
+ crossref = osdi5,
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/ivy/osdi02.html",
+ www_ps_url = PDOSWWW # "/ivy/osdi02.ps",
+ www_ps_gz_url = PDOSWWW # "/ivy/osdi02.ps.gz",
+ www_pdf_url = PDOSWWW # "/ivy/osdi02.pdf"
+}
+
+@inproceedings{trie:iptps02,
+ title = "Efficient Peer-To-Peer Lookup Based on a Distributed Trie",
+ author = "Michael J. Freedman and Radek Vingralek",
+ crossref = "iptps02",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/trie:iptps02/index.html",
+ www_ps_url = PDOSWWW # "/papers/trie:iptps02/trie:iptps02.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/trie:iptps02/trie:iptps02.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/trie:iptps02/trie:iptps02.pdf"
+}
+
+@inproceedings{chord:dns02,
+ title = "Serving DNS using Chord",
+ author = "Russ Cox and Athicha Muthitacharoen and Robert Morris",
+ crossref = "iptps02",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/chord:dns02/index.html",
+ www_ps_url = PDOSWWW # "/papers/chord:dns02/chord:dns02.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:dns02/chord:dns02.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/chord:dns02/chord:dns02.pdf"
+}
+
+@inproceedings{chord:security02,
+ title = "Security Considerations for Peer-to-Peer Distributed Hash Tables",
+ author = "Emil Sit and Robert Morris",
+ crossref = "iptps02",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/chord:security02/index.html",
+ www_ps_url = PDOSWWW # "/papers/chord:security02/chord:security02.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:security02/chord:security02.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/chord:security02/chord:security02.pdf"
+}
+
+@inproceedings{cfs:sosp01,
+ title = "Wide-area cooperative storage with {CFS}",
+ author = "Frank Dabek and M. Frans Kaashoek and David Karger and Robert Morris and Ion Stoica",
+ crossref = "sosp18",
+ pages = "",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/cfs:sosp01/",
+ www_ps_url = PDOSWWW # "/papers/cfs:sosp01/cfs_sosp.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/cfs:sosp01/cfs_sosp.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/cfs:sosp01/cfs_sosp.pdf",
+}
+
+@inproceedings{chord:sigcomm01,
+ title = "Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications",
+ author = "Ion Stoica and Robert Morris and David Karger and M. Frans Kaashoek and Hari Balakrishnan",
+ crossref = "sigcomm01",
+ pages = "",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/chord:sigcomm01/",
+ www_ps_url = PDOSWWW # "/papers/chord:sigcomm01/chord_sigcomm.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:sigcomm01/chord_sigcomm.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/chord:sigcomm01/chord_sigcomm.pdf",
+}
+
+@inproceedings{chord:hotos,
+ title = "Building Peer-to-Peer Systems With Chord, a Distributed Lookup Service",
+ author = "Frank Dabek and Emma Brunskill and M. Frans Kaashoek and David Karger and Robert Morris and Ion Stoica and Hari Balakrishnan",
+ crossref = "hotos8",
+ pages = "",
+ www_section = p2p,
+ www_abstract_url = PDOSWWW # "/papers/chord:hotos01/",
+ www_ps_url = PDOSWWW # "/papers/chord:hotos01/hotos8.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:hotos01/hotos8.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/chord:hotos01/hotos8.pdf",
+}
+
+
+%% NETWORKING PAPERS
+
+@string{networking = "Networking and Communication"}
+
+@inproceedings{click:asplos02,
+ title = "Programming Language Optimizations for Modular Router Configurations",
+ author = "Eddie Kohler and Robert Morris and Benjie Chen",
+ booktitle = "Proceedings of the 10th Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS)",
+ location = "San Jose, CA",
+ month = oct,
+ year = 2002,
+ www_section = networking,
+ www_pdf_url = PDOSWWW # "/papers/click:asplos02.pdf"
+}
+
+@inproceedings{grid:hotnets02,
+ title = "Performance of Multihop Wireless Networks: Shortest Path is Not Enough",
+ author = "Douglas S. J. {De Couto} and Daniel Aguayo and Benjamin A. Chambers and Robert Morris",
+ crossref = "hotnets1",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:hotnets02/",
+ www_ps_url = PDOSWWW # "/papers/grid:hotnets02/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:hotnets02/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/grid:hotnets02/paper.pdf"
+}
+
+@techreport{grid:losstr01,
+ title = "Effects of Loss Rate on Ad Hoc Wireless Routing",
+ author = "Douglas S. J. {De Couto} and Daniel Aguayo and Benjamin A. Chambers and Robert Morris",
+ institution = MIT-LCS,
+ year = 2002, month = mar,
+ number = "MIT-LCS-TR-836",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:losstr02/",
+ www_ps_url = PDOSWWW # "/papers/grid:losstr02/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:losstr02/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/grid:losstr02/paper.pdf"
+}
+
+
+@article{span:wireless01,
+ title = "Span: An Energy-Efficient Coordination Algorithm for Topology Maintenance in Ad Hoc Wireless Networks",
+ author = "Benjie Chen and Kyle Jamieson and Hari Balakrishnan and Robert Morris",
+ crossref = "journal:winet",
+ volume = 8,
+ number = "5",
+ year = 2002,
+ month = sep,
+ pages = "",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/span:wireless01/",
+ www_ps_url = PDOSWWW # "/papers/span:wireless01/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/span:wireless01/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/span:wireless01/paper.pdf"
+}
+
+@inproceedings{dnscache:sigcommimw01,
+ title = "DNS Performance and the Effectiveness of Caching",
+ author = "Jaeyeon Jung, Emil Sit, Hari Balakrishnan and Robert Morris",
+ crossref = "sigcommimw01",
+ www_section = networking,
+ www_abstract_url = "http://nms.lcs.mit.edu/papers/dns-imw2001.html",
+ www_ps_url = "http://nms.lcs.mit.edu/papers/dns-imw2001.ps",
+ www_ps_gz_url = "http://nms.lcs.mit.edu/papers/dns-imw2001.ps.gz",
+ www_pdf_url = "http://nms.lcs.mit.edu/papers/dns-imw2001.pdf"
+}
+
+@inproceedings{ron:sosp01,
+ title = "Resilient Overlay Networks",
+ author = "David Andersen and Hari Balakrishnan and M. Frans Kaashoek and Robert Morris",
+ crossref = "sosp18",
+ pages = "",
+ www_section = networking,
+ www_abstract_url = "http://nms.lcs.mit.edu/papers/ron-sosp2001.html",
+ www_ps_url = "http://nms.lcs.mit.edu/papers/ron-sosp2001.ps",
+ www_ps_gz_url = "http://nms.lcs.mit.edu/papers/ron-sosp2001.ps.gz",
+ www_pdf_url = "http://nms.lcs.mit.edu/papers/ron-sosp2001.pdf",
+}
+
+@techreport{grid:proxytr01,
+ title = "Location Proxies and Intermediate Node Forwarding for Practical Geographic Forwarding",
+ author = "Douglas S. J. {De Couto} and Robert Morris",
+ institution = MIT-LCS,
+ year = 2001, month = jun,
+ number = "MIT-LCS-TR-824",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:proxytr01/",
+ www_ps_url = PDOSWWW # "/papers/grid:proxytr01/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:proxytr01/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/grid:proxytr01/paper.pdf",
+}
+
+@inproceedings{span:mobicom01,
+ title = "Span: An Energy-Efficient Coordination Algorithm for Topology Maintenance in Ad Hoc Wireless Networks",
+ author = "Benjie Chen and Kyle Jamieson and Hari Balakrishnan and Robert Morris",
+ crossref = "mobicom01",
+ pages = "85--96",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/span:mobicom01/",
+ www_ps_url = PDOSWWW # "/papers/span:mobicom01/span.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/span:mobicom01/span.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/span:mobicom01/span.pdf"
+}
+
+@inproceedings{grid:mobicom01,
+ title = "Capacity of Ad Hoc Wireless Networks",
+ author = "Jinyang Li and Charles Blake and Douglas S. J. {De Couto} and Hu Imm Lee and Robert Morris",
+ crossref = "mobicom01",
+ pages = "61--69",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:mobicom01/",
+ www_ps_url = PDOSWWW # "/papers/grid:mobicom01/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:mobicom01/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/grid:mobicom01/paper.pdf"
+}
+
+@inproceedings{click:usenix01,
+ title = "Flexible Control of Parallelism in a Multiprocessor PC Router",
+ author = "Benjie Chen and Robert Morris",
+ crossref = "usenix01",
+ pages = "333--346",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/click:usenix01/",
+ www_ps_url = PDOSWWW # "/papers/click:usenix01/usenix01.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/click:usenix01/usenix01.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click:usenix01/usenix01.pdf",
+}
+
+@inproceedings{ron:hotos8,
+ title = "Resilient Overlay Networks",
+ author = "David Andersen and Hari Balakrishnan and M. Frans Kaashoek and Robert Morris",
+ crossref = "hotos8",
+ www_section = networking,
+ www_abstract_url = "http://nms.lcs.mit.edu/papers/ron-hotos2001.html",
+ www_ps_url = "http://nms.lcs.mit.edu/papers/ron-hotos2001.ps",
+ www_ps_gz_url = "http://nms.lcs.mit.edu/papers/ron-hotos2001.ps.gz",
+ www_pdf_url = "http://nms.lcs.mit.edu/papers/ron-hotos2001.pdf",
+}
+
+@techreport{click:rewritertr,
+ title = "Modular components for network address translation",
+ author = "Eddie Kohler and Robert Morris and Massimiliano Poletto",
+ institution = "MIT LCS Click Project",
+ year = 2000, month = dec,
+ note = "http://www.pdos.lcs.mit.edu/papers/click-rewriter/",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/click-rewriter/",
+ www_ps_url = PDOSWWW # "/papers/click-rewriter/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/click-rewriter/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click-rewriter/paper.pdf",
+}
+
+@inproceedings{grid:sigops-euro9,
+ title = "{C}ar{N}et: A Scalable Ad Hoc Wireless Network System",
+ author = "Robert Morris and John Jannotti and Frans Kaashoek and Jinyang Li and Douglas S. J. {De Couto}",
+ crossref = "sigops-euro9",
+ pages = "",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:sigops-euro9/",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:sigops-euro9/paper.ps.gz",
+ www_ps_url = PDOSWWW # "/papers/grid:sigops-euro9/paper.ps",
+ www_pdf_url = PDOSWWW # "/papers/grid:sigops-euro9/paper.pdf",
+ note = "The published version incorrectly lists Douglas De Couto's name"
+}
+
+@inproceedings{grid:mobicom00,
+ title = "A Scalable Location Service for Geographic Ad Hoc Routing",
+ author = "Jinyang Li and John Jannotti and Douglas S. J. {De Couto} and David R. Karger and Robert Morris",
+ crossref = "mobicom00",
+ pages = "120--130",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/grid:mobicom00/",
+ www_ps_url = PDOSWWW # "/papers/grid:mobicom00/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:mobicom00/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/grid:mobicom00/paper.pdf"
+}
+
+@techreport{click:lcstr00,
+ title = "Programming language techniques for modular router configurations",
+ author = "Eddie Kohler and Benjie Chen and M. Frans Kaashoek and Robert Morris and Massimiliano Poletto",
+ institution = MIT-LCS,
+ year = 2000, month = aug,
+ number = "MIT-LCS-TR-812",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/click:lcstr00/",
+ www_ps_url = PDOSWWW # "/papers/click:lcstr00/tr.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/click:lcstr00/tr.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click:lcstr00/tr.pdf",
+}
+
+@article{click:tocs00,
+ title = "The Click modular router",
+ author = "Eddie Kohler and Robert Morris and Benjie Chen and John Jannotti and M. Frans Kaashoek",
+ crossref = "journal:tocs",
+ volume = 18, number = 3,
+ year = 2000, month = aug,
+ pages = "263--297",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/click:tocs00/",
+ www_ps_url = PDOSWWW # "/papers/click:tocs00/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/click:tocs00/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click:tocs00/paper.pdf"
+}
+
+@inproceedings{click:sosp99,
+ title = "The {C}lick modular router",
+ author = "Robert Morris and Eddie Kohler and John Jannotti and M. Frans Kaashoek",
+ crossref = "sosp17",
+ pages = "217--231",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/click:sosp99/",
+ www_ps_url = PDOSWWW # "/papers/click:sosp99/paper.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/click:sosp99/paper.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click:sosp99/paper.pdf"
+}
+
+@inproceedings{prolac:sigcomm99,
+ title = "A readable {TCP} in the {Prolac} protocol language",
+ author = "Eddie Kohler and M. Frans Kaashoek and David R. Montgomery",
+ crossref = "sigcomm99",
+ pages = "3--13",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/prolac:sigcomm99/",
+ www_ps_url = PDOSWWW # "/papers/prolac:sigcomm99/paper.ps",
+ www_pdf_url = PDOSWWW # "/papers/prolac:sigcomm99/paper.pdf"
+}
+
+@inproceedings{ash:sigcomm96,
+ title = "{ASHs}: application-specific handlers for high-performance messaging",
+ author = "Deborah A. Wallach and Dawson R. Engler and M. Frans Kaashoek",
+ crossref = "sigcomm96",
+ pages = "40--52",
+ www_section = networking,
+ www_ps_url = PDOSWWW # "/papers/ash-sigcomm96.ps"
+}
+
+@inproceedings{dpf:sigcomm96,
+ title = "{DPF}: fast, flexible message demultiplexing using dynamic code generation",
+ author = "Dawson R. Engler and M. Frans Kaashoek",
+ crossref = "sigcomm96",
+ pages = "53--59",
+ www_section = networking,
+ www_ps_url = PDOSWWW # "/papers/dpf.ps"
+}
+
+@inproceedings{oam:ppopp95,
+ title = "Optimistic active messages: a mechanism for scheduling communication with computation",
+ author = "Deborah A. Wallach and Wilson C. Hsieh and Kirk Johnson and M. Frans Kaashoek and William E. Weihl",
+ crossref = "ppopp95",
+ pages = "217--226",
+ www_section = networking,
+ www_ps_url = PDOSWWW # "/papers/oam.ps"
+}
+
+@techreport{user-level-comm:tr,
+ title = "Efficient implementation of high-level languages on user-level communication architectures",
+ author = "Wilson C. Hsieh and Kirk L. Johnson and M. Frans Kaashoek and Deborah A. Wallach and William E. Weihl",
+ institution = MIT-LCS,
+ year = 1994, month = may,
+ number = "MIT-LCS-TR-616",
+ www_section = networking,
+ www_ps_url = PDOSWWW # "/papers/UserLevelCommunication.ps",
+}
+
+@inproceedings{ipc-persistent-relevance:wwos4,
+ title = "The persistent relevance of IPC performance",
+ author = "Wilson C. Hsieh and M. Frans Kaashoek and William E. Weihl",
+ crossref = "wwos4",
+ pages = "186--190",
+ www_section = networking,
+ www_ps_url = PDOSWWW # "/papers/RelevanceOfIPC.ps",
+}
+
+@inproceedings{pan:openarch99,
+ title = "{PAN}: a high-performance active network node supporting multiple mobile code systems",
+ author = "Erik L. Nygren and Stephen J. Garland and M. Frans Kaashoek",
+ crossref = "openarch99",
+ pages = "78--89",
+ www_section = networking,
+ www_abstract_url = PDOSWWW # "/papers/pan-openarch99/",
+ www_ps_url = PDOSWWW # "/papers/pan-openarch99/pan-openarch99.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/pan-openarch99/pan-openarch99.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/pan-openarch99/pan-openarch99.pdf",
+}
+
+%% DISTRIBUTED COMPUTING
+
+@string{distribcomp = "Distributed Computing"}
+
+@inproceedings{lbfs:sosp01,
+ title = "A Low-bandwidth Network File System",
+ author = "Athicha Muthitacharoen and Benjie Chen and David Mazi{\`e}res",
+ crossref = "sosp18",
+ pages = "174--187",
+ www_section = distribcomp,
+ www_abstract_url = PDOSWWW # "/papers/lbfs:sosp01/",
+ www_ps_url = PDOSWWW # "/papers/lbfs:sosp01/lbfs.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/lbfs:sosp01/lbfs.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/lbfs:sosp01/lbfs.pdf",
+}
+
+@inproceedings{server-os:sigops-euro,
+ title = "Server operating systems",
+ author = "M. Frans Kaashoek and Dawson R. Engler and Gregory R. Ganger and Deborah A. Wallach",
+ crossref = "sigops-euro7",
+ pages = "141--148",
+ www_section = distribcomp,
+ www_html_url = PDOSWWW # "/papers/serverOS.html"
+}
+
+@inproceedings{amoeba-eval:dcs16,
+ title = "An evaluation of the {Amoeba} group communication system",
+ author = "M. Frans Kaashoek and Andrew S. Tanenbaum",
+ crossref = "dcs16",
+ pages = "436--448",
+ www_section = distribcomp,
+ www_ps_url = PDOSWWW # "/papers/group-dcs16.ps"
+}
+
+
+%% SECURITY AND PRIVACY
+
+@string{security = "Security and Privacy"}
+
+@techreport{sfs:rex,
+ title = "REX: Secure, modular remote execution through file descriptor passing",
+ author = "Michael Kaminsky and Eric Peterson and Kevin Fu and David Mazi{\`e}res and M. Frans Kaashoek",
+ institution = "MIT-LCS",
+ year = 2003, month = jan,
+ number = "MIT-LCS-TR-884",
+ note = "http://www.pdos.lcs.mit.edu/papers/sfs:rex/",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/sfs:rex/",
+ www_ps_url = PDOSWWW # "/papers/sfs:rex/MIT-LCS-TR-884.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:rex/MIT-LCS-TR-884.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/sfs:rex/MIT-LCS-TR-884.pdf",
+}
+
+@inproceedings{tarzan:ccs9,
+ title = "Tarzan: A Peer-to-Peer Anonymizing Network Layer",
+ author = "Michael J. Freedman and Robert Morris",
+ crossref = "ccs9",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/tarzan:ccs9/index.html",
+ www_ps_url = PDOSWWW # "/papers/tarzan:ccs9/tarzan:ccs9.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/tarzan:ccs9/tarzan:ccs9.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/tarzan:ccs9/tarzan:ccs9.pdf"
+}
+
+@inproceedings{tarzan:iptps02,
+ title = "Introducing Tarzan, a Peer-to-Peer Anonymizing Network Layer",
+ author = "Michael J. Freedman and Emil Sit and Josh Cates and Robert Morris",
+ crossref = "iptps02",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/tarzan:iptps02/index.html",
+ www_ps_url = PDOSWWW # "/papers/tarzan:iptps02/tarzan:iptps02.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/tarzan:iptps02/tarzan:iptps02.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/tarzan:iptps02/tarzan:iptps02.pdf"
+}
+
+@article{sfsro:tocs2002,
+ title = "{F}ast and secure distributed read-only file system",
+ author = "Kevin Fu and M. Frans Kaashoek and David Mazi{\`e}res",
+ crossref = "journal:tocs",
+ volume = 20, number = 1,
+ year = 2002, month = feb,
+ pages = "1--24",
+ www_section = security,
+ www_abstract_url = "http://portal.acm.org/citation.cfm?doid=505452.505453"
+}
+
+
+@inproceedings{webauth:sec10,
+ title = "{D}os and Don'ts of Client Authentication on the Web",
+ author = "Kevin Fu and Emil Sit and Kendra Smith and Nick Feamster",
+ crossref = "sec10",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/webauth.html",
+ www_ps_url = PDOSWWW # "/papers/webauth:sec10.ps",
+ www_pdf_url = PDOSWWW # "/papers/webauth:sec10.pdf",
+ www_ps_gz_url = PDOSWWW # "/papers/webauth:sec10.ps.gz",
+ note = "An extended version is available as MIT-LCS-TR-818",
+}
+
+@techreport{webauth:tr,
+ title = "{D}os and Don'ts of Client Authentication on the Web",
+ author = "Kevin Fu and Emil Sit and Kendra Smith and Nick Feamster",
+ institution = MIT-LCS,
+ year = 2001, month = may,
+ number = "MIT-LCS-TR-818",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/webauth.html",
+ www_ps_url = PDOSWWW # "/papers/webauth:tr.ps",
+ www_pdf_url = PDOSWWW # "/papers/webauth:tr.pdf",
+ www_ps_gz_url = PDOSWWW # "/papers/webauth:tr.ps.gz",
+}
+
+@inproceedings{sfsro:osdi2000,
+ title = "{F}ast and secure distributed read-only file system",
+ author = "Kevin Fu and M. Frans Kaashoek and David Mazi{\`e}res",
+ crossref = "osdi4",
+ pages = "181-196",
+ www_section = security,
+ www_abstract_url = PDOSWWW # "/papers/sfsro.html",
+ www_ps_url = PDOSWWW # "/papers/sfsro:osdi2000.ps",
+ www_pdf_url = PDOSWWW # "/papers/sfsro:osdi2000.pdf",
+ www_ps_gz_url = PDOSWWW # "/papers/sfsro:osdi2000.ps.gz",
+}
+
+@inproceedings{sfs:sosp99,
+ title = "{S}eparating key management from file system security",
+ author = "David Mazi{\`e}res and Michael Kaminsky and M. Frans Kaashoek and Emmett Witchel",
+ crossref = "sosp17",
+ pages = "",
+ www_section = security,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:sosp99.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/sfs:sosp99.pdf",
+}
+
+@inproceedings{nymserver:ccs5,
+ title = "The design, implementation and operation of an email pseudonym server",
+ author = "David Mazi{\`e}res and M. Frans Kaashoek",
+ crossref = "ccs5",
+ pages = "27--36",
+ www_section = security,
+ www_ps_gz_url = PDOSWWW # "/papers/nymserver:ccs5.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/nymserver:ccs5.pdf",
+}
+
+@inproceedings{sfs:sigops-euro8,
+ title = "Escaping the evils of centralized control with self-certifying pathnames",
+ author = "David Mazi{\`e}res and M. Frans Kaashoek",
+ crossref = "sigops-euro8",
+ pages = "",
+ www_section = security,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:sigops-euro8.ps.gz"
+}
+
+@inproceedings{secure-apps:hotos6,
+ title = "Secure applications need flexible operating systems",
+ author = "David Mazi{\`e}res and M. Frans Kaashoek",
+ pages = "56--61",
+ crossref = "hotos6",
+ www_section = security,
+ www_ps_gz_url = PDOSWWW # "/papers/mazieres:hotos6.ps.gz",
+}
+
+
+%% MOBILE COMPUTING
+
+@string{mobilecomp = "Mobile Computing"}
+
+@inproceedings{migrate:hotos8,
+ title = "Reconsidering Internet Mobility",
+ author = "Alex C. Snoeren and Hari Balakrishnan and M. Frans Kaashoek",
+ crossref = "hotos8",
+ www_section = mobilecomp,
+ www_abstract_url = "http://nms.lcs.mit.edu/papers/migrate-hotOS.html",
+ www_ps_url = "http://nms.lcs.mit.edu/papers/migrate-hotOS.ps",
+ www_pdf_url = "http://nms.lcs.mit.edu/papers/migrate-hotOS.pdf",
+}
+
+@misc{rover:rfs-wip,
+ title = "{RFS}: a mobile-transparent file system for the {Rover} toolkit",
+ author = "Anthony D. Joseph and George M. Candea and M. Frans Kaashoek",
+ howpublished = "Works-in-progress poster, the 16th " # SOSP,
+ crossref = "sosp16",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/RFS_SOSP_WIP.ps"
+ www_show = no,
+}
+
+@article{rover:winet,
+ title = "Building reliable mobile-aware applications using the {Rover} toolkit",
+ author = "Anthony D. Joseph and M. Frans Kaashoek",
+ crossref = "journal:winet",
+ volume = 3, number = 5,
+ year = 1997,
+ pages = "405--419",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/winet.ps"
+ www_ps_gz_url = PDOSWWW # "/papers/winet.ps.gz"
+}
+
+@article{rover:ieee-toc,
+ title = "Mobile computing with the {Rover} toolkit",
+ author = "Anthony D. Joseph and Joshua A. Tauber and M. Frans Kaashoek",
+ crossref = "journal:ieee-toc",
+ volume = 46, number = 3,
+ year = 1997, month = mar,
+ pages = "337--352",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/toc.ps"
+ www_ps_gz_url = PDOSWWW # "/papers/toc.ps.gz"
+}
+
+@inproceedings{rover:mobicom,
+ title = "Building reliable mobile-aware applications using the {Rover} toolkit",
+ author = "Anthony D. Joseph and Joshua A. Tauber and M. Frans Kaashoek",
+ crossref = "mobicom96",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/mobicom96.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/mobicom96.ps.gz",
+}
+
+@inproceedings{rover:sosp95,
+ title = "{Rover}: a toolkit for mobile information access",
+ author = "Anthony D. Joseph and {deLespinasse}, Alan F. and Joshua A. Tauber and David K. Gifford and M. Frans Kaashoek",
+ crossref = "sosp15",
+ pages = "156--171",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/rover-sosp95.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/rover-sosp95.ps.gz",
+}
+
+@inproceedings{dynamic-documents:wmcsa,
+ title = "Dynamic documents: mobile wireless access to the {WWW}",
+ author = "M. Frans Kaashoek and Tom Pinckney and Joshua A. Tauber",
+ crossref = "wmcsa94",
+ pages = "179--184",
+ www_section = mobilecomp,
+ www_abstract_url = PDOSWWW # "/papers/wmcsa94.abstract.html",
+ www_ps_url = PDOSWWW # "/papers/wmcsa94.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/wmcsa94.ps.gz",
+}
+
+@inproceedings{mobile-storage-alt:osdi1,
+ title = "Storage alternatives for mobile computers",
+ author = "Fred Douglis and Ram&oacute;n C&aacute;ceres and M. Frans Kaashoek and Kai Li and Brian Marsh and Joshua A. Tauber",
+ crossref = "osdi1",
+ pages = "25--37",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/storage-alternatives.ps"
+}
+
+@inproceedings{dynamic-documents:www94,
+ title = "Dynamic documents: extensibility and adaptability in the {WWW}",
+ author = "M. Frans Kaashoek and Tom Pinckney and Joshua A. Tauber",
+ crossref = "www94",
+ edition = "developers' day track",
+ www_section = mobilecomp,
+ www_ps_url = PDOSWWW # "/papers/www94.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/www94.ps.gz",
+ www_html_url = PDOSWWW # "/papers/www94.html",
+}
+
+
+%% STORAGE MANAGEMENT
+
+@string{storage = "Storage Management"}
+
+@inproceedings{cffs:usenix97,
+ title = "Embedded inodes and explicit grouping: exploiting disk bandwidth for small files",
+ author = "Gregory R. Ganger and M. Frans Kaashoek",
+ crossref = "usenix97",
+ pages = "1--17",
+ www_section = storage,
+ www_abstract_url = PDOSWWW # "/papers/cffs.html",
+ www_ps_url = PDOSWWW # "/papers/cffs-usenix97.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/cffs-usenix97.ps.gz",
+}
+
+@inproceedings{arus:dcs16,
+ title = "Atomic recovery units: failure atomicity for logical disks",
+ author = "Robert Grimm and Wilson C. Hsieh and Wiebren de Jonge and M. Frans Kaashoek",
+ crossref = "dcs16",
+ pages = "26--37",
+ www_section = storage,
+ www_ps_url = PDOSWWW # "/papers/arus.ps",
+}
+
+@inproceedings{logicaldisk:sosp14,
+ title = "The logical disk: a new approach to improving file systems",
+ author = "Wiebren de Jonge and M. Frans Kaashoek and Wilson C. Hsieh",
+ crossref = "sosp14",
+ pages = "15--28",
+ www_section = storage,
+ www_ps_url = PDOSWWW # "/papers/LogicalDisk.ps"
+}
+
+
+%% EXOKERNEL PAPERS
+
+@string{exokernels = "Exokernels"}
+
+@article{exo:tocs2002,
+ title = "{F}ast and flexible Application-Level Networking on Exokernel Systems",
+ author = "Gregory R. Ganger and Dawson R. Engler and M. Frans Kaashoek and Hector M. Briceno and Russell Hunt and Thomas Pinckney",
+ crossref = "journal:tocs",
+ volume = 20,
+ number = 1,
+ year = 2002,
+ month = feb,
+ pages = "49--83",
+ www_section = exokernels,
+ www_abstract_url = PDOSWWW # "papers/exo:tocs.html",
+ www_pdf_url = PDOSWWW # "papers/exo:tocs.pdf",
+ www_ps_url = PDOSWWW # "papers/exo:tocs.ps",
+ www_ps_gz_url = PDOSWWW # "papers/exo:tocs.ps.gz"
+}
+
+@inproceedings{exo:sosp97,
+ title = "Application performance and flexibility on exokernel systems",
+ author = "M. Frans Kaashoek and Dawson R. Engler and Gregory R. Ganger and H{\'e}ctor M. Brice{\~n}o and Russell Hunt and David Mazi{\`e}res and Thomas Pinckney and Robert Grimm and John Jannotti and Kenneth Mackenzie",
+ pages = "52--65",
+ crossref = "sosp16",
+ www_section = exokernels,
+ www_abstract_url = PDOSWWW # "/papers/exo-sosp97.html",
+ www_html_url = PDOSWWW # "/papers/exo-sosp97/exo-sosp97.html",
+ www_ps_url = PDOSWWW # "/papers/exo-sosp97/exo-sosp97.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/exo-sosp97/exo-sosp97.ps.gz",
+}
+
+@inproceedings{exo:sosp95,
+ title = "{E}xokernel: an operating system architecture for application-level resource management",
+ author = "Dawson R. Engler and M. Frans Kaashoek and James {O'Toole Jr.}",
+ pages = "251--266",
+ crossref = "sosp15",
+ www_section = exokernels,
+ www_ps_url = PDOSWWW # "/papers/exokernel-sosp95.ps",
+}
+
+@inproceedings{exo:osdi1,
+ title = "The exokernel approach to extensibility (panel statement)",
+ author = "Dawson R. Engler and M. Frans Kaashoek and {O'Toole Jr.}, James W.",
+ pages = "198",
+ crossref = "osdi1",
+ www_section = exokernels,
+ www_ps_url = PDOSWWW # "/papers/exo-abstract.ps",
+}
+
+@inproceedings{exo:hotos5,
+ title = "Exterminate all operating system abstractions",
+ author = "Dawson R. Engler and M. Frans Kaashoek",
+ pages = "78--83",
+ crossref = "hotos5",
+ www_section = exokernels,
+ www_ps_url = PDOSWWW # "/papers/hotos-jeremiad.ps",
+}
+
+@article{exo:osr,
+ title = "The operating system kernel as a secure programmable machine",
+ author = "Dawson R. Engler and M. Frans Kaashoek and {O'Toole Jr.}, James W.",
+ crossref = "journal:osr",
+ year = 1995, month = jan,
+ volume = 29, number = 1,
+ pages = "78--82",
+ www_section = exokernels,
+ www_ps_url = PDOSWWW # "/papers/osr-exo.ps",
+}
+
+@inproceedings{exo:sigops-euro,
+ title = "The operating system kernel as a secure programmable machine",
+ author = "Dawson R. Engler and M. Frans Kaashoek and {O'Toole Jr.}, James W.",
+ crossref = "sigops-euro6",
+ pages = "62--67",
+ www_section = exokernels,
+ www_ps_url = PDOSWWW # "/papers/xsigops.ps",
+}
+
+
+%% DYNAMIC CODE GENERATION
+
+@string{dcg = "Dynamic Code Generation"}
+
+@article{tickc:toplas,
+ title = "{`C} and {tcc}: A language and compiler for dynamic code generation"
+ author = "Massimiliano Poletto and Wilson C. Hsieh and Dawson R. Engler and M. Frans Kaashoek",
+ crossref = "journal:toplas",
+ volume = 21, number = 2,
+ year = 1999, month = mar,
+ pages = "324--369",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/tickc-toplas.ps",
+}
+
+@article{linearscan,
+ title = "Linear scan register allocation",
+ author = "Massimiliano Poletto and Vivek Sarkar",
+ crossref = "journal:toplas",
+ volume = 21, number = 5,
+ year = 1999, month = sep,
+ pages = "895--913",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/toplas-linearscan.ps",
+}
+
+@inproceedings{tickc:pldi97,
+ title = "tcc: a system for fast, flexible, and high-level dynamic code generation",
+ author = "Massimiliano Poletto and Dawson R. Engler and M. Frans Kaashoek",
+ crossref = "pldi97",
+ pages = "109--121",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/tcc-pldi97.ps",
+}
+
+@inproceedings{tickc:popl96,
+ title = "{`C}: A language for efficient, machine-independent dynamic code generation",
+ author = "Dawson R. Engler and Wilson C. Hsieh and M. Frans Kaashoek",
+ crossref = "popl96",
+ pages = "131--144",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/popl96.ps",
+ note = "An earlier version is available as MIT-LCS-TM-526",
+}
+
+@inproceedings{tickc:wcsss96,
+ title = "tcc: a template-based compiler for {`C}",
+ author = "Massimiliano Poletto and Dawson R. Engler and M. Frans Kaashoek",
+ crossref = "wcsss96",
+ pages = "1--7",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/tcc-wcsss96.ps"
+}
+
+@inproceedings{vcode:pldi96,
+ title = "{VCODE}: a retargetable, extensible, very fast dynamic code generation system",
+ author = "Dawson R. Engler",
+ crossref = "pldi96",
+ pages = "160--170",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/vcode-pldi96.ps",
+}
+
+@inproceedings{dcg:asplos6,
+ title = "{DCG}: an efficient, retargetable dynamic code generation system",
+ author = "Dawson R. Engler and Todd A. Proebsting",
+ crossref = "asplos6",
+ pages = "263--272",
+ www_section = dcg,
+ www_ps_url = PDOSWWW # "/papers/dcg.ps",
+}
+
+
+%% PROGRAMMING LANGUAGES
+
+@string{proglang = "Programming Languages"}
+
+@inproceedings{pct:usenix02,
+ title = "Simple and General Statistical Profiling with PCT",
+ author = "Charles Blake and Steve Bauer",
+ crossref = "usenix02",
+ pages = "333--346"
+ www_section = proglang,
+ www_abstract_url = PDOSWWW # "/papers/pct:usenix02/",
+ www_ps_url = PDOSWWW # "/papers/pct:usenix02/blake02:pct.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/pct:usenix02/blake02:pct.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/pct:usenix02/blake02:pct.pdf",
+}
+
+@inproceedings{evolving-software:wcsss99,
+ title = "Evolving software with an application-specific language",
+ author = "Eddie Kohler and Massimiliano Poletto and David R. Montgomery",
+ crossref = "wcsss99",
+ pages = "94--102",
+ www_section = proglang,
+ www_abstract_url = PDOSWWW # "/papers/evolving-software:wcsss99/",
+ www_ps_url = PDOSWWW # "/papers/evolving-software:wcsss99/paper.ps",
+ www_pdf_url = PDOSWWW # "/papers/evolving-software:wcsss99/paper.pdf",
+}
+
+
+%% STORAGE MANAGEMENT
+
+@string{storage = "Storage Management"}
+
+@inproceedings{cffs:usenix97,
+ title = "Embedded inodes and explicit grouping: exploiting disk bandwidth for small files",
+ author = "Gregory R. Ganger and M. Frans Kaashoek",
+ crossref = "usenix97",
+ pages = "1--17",
+ www_section = storage,
+ www_abstract_url = PDOSWWW # "/papers/cffs.html",
+ www_ps_url = PDOSWWW # "/papers/cffs-usenix97.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/cffs-usenix97.ps.gz",
+}
+
+@inproceedings{arus:dcs16,
+ title = "Atomic recovery units: failure atomicity for logical disks",
+ author = "Robert Grimm and Wilson C. Hsieh and Wiebren de Jonge and M. Frans Kaashoek",
+ crossref = "dcs16",
+ pages = "26--37",
+ www_section = storage,
+ www_ps_url = PDOSWWW # "/papers/arus.ps",
+}
+
+@inproceedings{logicaldisk:sosp14,
+ title = "The logical disk: a new approach to improving file systems",
+ author = "Wiebren de Jonge and M. Frans Kaashoek and Wilson C. Hsieh",
+ crossref = "sosp14",
+ pages = "15--28",
+ www_section = storage,
+ www_ps_url = PDOSWWW # "/papers/LogicalDisk.ps"
+}
+
+
+%% VIRTUAL MEMORY
+
+@string{vm = "Virtual Memory"}
+
+@inproceedings{avm:hotos5,
+ title = "{AVM}: application-level virtual memory",
+ author = "Dawson R. Engler and Sandeep K. Gupta and M. Frans Kaashoek",
+ crossref = "hotos5",
+ pages = "72--77",
+ www_section = vm,
+ www_ps_url = PDOSWWW # "/papers/hotos-uvm.ps",
+}
+
+@inproceedings{software-tlb-prefetch:osdi1,
+ title = "Software prefetching and caching for translation lookaside buffers",
+ author = "Kavita Bala and M. Frans Kaashoek and William Weihl",
+ crossref = "osdi1",
+ pages = "243--253",
+ www_section = vm,
+ www_ps_url = PDOSWWW # "/papers/tlb.ps",
+}
+
+
+
+
+%% DISTRIBUTED SHARED MEMORY AND PARALLEL COMPUTING
+
+@string{dsm/parallel = "Distributed Shared Memory and Parallel Computing"}
+
+@inproceedings{dynamic-migration:supercomp96,
+ title = "Dynamic computation migration in distributed
+shared memory systems",
+ author = "Wilson C. Hsieh and M. Frans Kaashoek and William E. Weihl",
+ crossref = "supercomp96",
+ www_section = dsm/parallel,
+ www_ps_url = PDOSWWW # "/papers/mcrl.ps"
+}
+
+@inproceedings{crl:sosp95,
+ title = "{CRL}: high-performance all-software distributed shared memory",
+ author = "Kirk L. Johnson and M. Frans Kaashoek and Deborah A. Wallach",
+ crossref = "sosp15",
+ pages = "213--226",
+ www_section = dsm/parallel,
+ www_ps_url = PDOSWWW # "/papers/crl-sosp95.ps"
+ note = "An earlier version of this work appeared as Technical Report MIT-LCS-TM-517, MIT Laboratory for Computer Science, March 1995",
+}
+
+@inproceedings{formal-sequential-consistent:dcs15,
+ title = "Implementing sequentially consistent shared objects using broadcast and point-to-point communication",
+ author = "Alan Fekete and M. Frans Kaashoek and Nancy Lynch",
+ crossref = "dcs15",
+ pages = "439--449",
+ www_section = dsm/parallel,
+ www_ps_url = PDOSWWW # "/papers/formal.ps"
+}
+
+@techreport{formal-sequential-consistent:tr,
+ title = "Implementing sequentially consistent shared objects using broadcast and point-to-point communication",
+ author = "Alan Fekete and M. Frans Kaashoek and Nancy Lynch",
+ institution = MIT-LCS,
+ year = 1995, month = jun,
+ number = "MIT-LCS-TR-518",
+ www_section = dsm/parallel,
+ www_ps_url = PDOSWWW # "/papers/formaltr.ps"
+}
+
+%@inproceedings{triangle-puzzle:dimacs94,
+% title = "A case study of shared-memory and
+%message-passing implementations of parallel breadth-first search: The
+%triangle puzzle",
+% author = "Kevin Lew and Kirk Johnson and M. Frans Kaashoek",
+% crossref = "dimacs94",
+% www_section = dsm/parallel,
+% www_ps_url = PDOSWWW # "/papers/dimacs94.ps"
+%}
+
+
+%% PHD THESES
+
+@string{phdtheses = "Ph.D. Theses"}
+
+@phdthesis{snoeren-phd,
+ title = "A Session-Based Architecture for Internet Mobility",
+ author = "Alex C. Snoeren",
+ school = MIT,
+ year = 2002, month = dec,
+ www_section = phdtheses,
+ www_ps_url = "http://nms.lcs.mit.edu/~snoeren/papers/thesis/thesis.ps",
+ www_ps_gz_url = "http://nms.lcs.mit.edu/~snoeren/papers/thesis/thesis.ps.gz"
+ www_pdf_url = "http://nms.lcs.mit.edu/~snoeren/papers/thesis/thesis.pdf",
+}
+
+@phdthesis{jannotti-phd,
+ title = "Network Layer Support for Overlay Networks",
+ author = "John Jannotti",
+ school = MIT,
+ year = 2002, month = aug,
+ www_section = phdtheses,
+ www_ps_url = PDOSWWW # "/papers/jannotti-phd.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/jannotti-phd.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/jannotti-phd.pdf"
+}
+
+@phdthesis{click:kohler-phd,
+ title = "The Click modular router",
+ author = "Eddie Kohler",
+ school = MIT,
+ year = 2000, month = nov,
+ www_section = phdtheses,
+ www_ps_gz_url = PDOSWWW # "/papers/click:kohler-phd/thesis.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/click:kohler-phd/thesis.pdf"
+}
+
+@phdthesis{sfs:mazieres-phd,
+ title = "Self-certifying File System",
+ author = "David Mazieres",
+ school = MIT,
+ year = 2000, month = may,
+ www_section = phdtheses,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:mazieres-phd.ps.gz"
+}
+
+@phdthesis{tickc:poletto-phd,
+ title = "Language and compiler support for dynamic code generation",
+ author = "Massimiliano Poletto",
+ school = MIT,
+ year = 1999, month = jun,
+ www_section = phdtheses,
+ www_ps_url = PDOSWWW # "/papers/tickc-poletto-phd.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/tickc-poletto-phd.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/tickc-poletto-phd.pdf"
+}
+
+@phdthesis{exo:engler-phd,
+ title = "The exokernel operating system architecture",
+ author = "Dawson R. Engler",
+ school = MIT,
+ year = 1998, month = oct,
+ www_section = phdtheses,
+ www_ps_url = PDOSWWW # "/exo/theses/engler/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/engler/thesis.ps.gz",
+}
+
+@phdthesis{fugu:mackenzie-phd,
+ title = "An efficient virtual network interface in the {FUGU} scalable workstation",
+ author = "Kenneth M. Mackenzie",
+ school = MIT,
+ year = 1998, month = feb,
+ www_section = phdtheses,
+ www_ps_gz_url = PDOSWWW # "/exo/theses/kenmac/thesis.ps.gz",
+}
+
+@phdthesis{app-specific-networking:wallach-phd,
+ title = "High-performance application-specific networking",
+ author = "Deborah Anne Wallach",
+ school = MIT,
+ year = 1997, month = jan,
+ www_section = phdtheses,
+ www_ps_url = PDOSWWW # "/exo/theses/kerr/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/kerr/thesis.ps.gz",
+}
+
+@phdthesis{crl:johnson-phd,
+ title = "High-performance all-software distributed shared memory",
+ author = "Kirk L. Johnson",
+ school = MIT,
+ year = 1995, month = dec,
+ www_section = phdtheses,
+ www_ps_gz_url = PDOSWWW # "/papers/crl:johnson-phd.ps.gz",
+ www_abstract_url = "http://www.cag.lcs.mit.edu/~tuna/papers/thesis.html",
+}
+
+@phdthesis{dyn-comp-migration:hsieh-phd,
+ title = "Dynamic computation migration in distributed shared memory systems",
+ author = "Wilson C. Hsieh",
+ school = MIT,
+ year = 1995, month = sep,
+ www_section = phdtheses,
+ www_pdf_url = PDOSWWW # "/papers/dyn-comp-migration:hsieh-phd.pdf",
+ note = "Also available as MIT LCS tech report MIT-LCS-TR-665."
+}
+
+
+%% MASTERS THESES
+
+@string{masterstheses = "Master's Theses"}
+
+@mastersthesis{sfs:savvides-meng,
+ title = "Access Control Lists for the Self-Certifying Filesystem"
+ author = "George Savvides",
+ school = MIT,
+ year = 2002, month = Aug,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/sfs:savvides-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/sfs:savvides-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:savvides-meng.ps.gz",
+}
+
+@mastersthesis{sfs:euresti-meng,
+ title = "Self-Certifying Filesystem Implementation for Windows"
+ author = "David Euresti",
+ school = MIT,
+ year = 2002, month = Aug,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/sfs:euresti-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/sfs:euresti-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:euresti-meng.ps.gz",
+}
+
+@mastersthesis{sfs:zeldovich-meng,
+ title = "Concurrency Control for Multi-Processor Event-Driven Systems"
+ author = "Nickolai Zeldovich",
+ school = MIT,
+ year = 2002, month = May,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/sfs:zeldovich-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/sfs:zeldovich-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:zeldovich-meng.ps.gz",
+}
+
+@mastersthesis{chord:om_p-meng,
+ title = "A Keyword Set Search System for Peer-to-Peer Networks"
+ author = "Omprakash D Gnawali",
+ school = MIT,
+ year = 2002, month = Jun,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/chord:om_p-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/chord:om_p-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:om_p-meng.ps.gz",
+}
+
+@mastersthesis{grid:bac-meng,
+ title = "The Grid Roofnet: a Rooftop Ad Hoc Wireless Network"
+ author = "Benjamin A. Chambers",
+ school = MIT,
+ year = 2002, month = May,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/grid:bac-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/grid:bac-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/grid:bac-meng.ps.gz",
+}
+
+@mastersthesis{tarzan:freedman-meng,
+ title = "A Peer-to-Peer Anonymizing Network Layer"
+ author = "Michael J. Freedman",
+ school = MIT,
+ year = 2002, month = May,
+ www_section = masterstheses,
+ www_abstract_url = PDOSWWW # "/papers/tarzan:freedman-meng/index.html",
+ www_pdf_url = PDOSWWW # "/papers/tarzan:freedman-meng/tarzan:freedman-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/tarzan:freedman-meng/tarzan:freedman-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/tarzan:freedman-meng/tarzan:freedman-meng.ps.gz",
+}
+
+
+@mastersthesis{chord:tburkard-meng,
+ title = "Herodotus: A Peer-to-Peer Web Archival System"
+ author = "Timo Burkard",
+ school = MIT,
+ year = 2002, month = May,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/chord:tburkard-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/chord:tburkard-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:tburkard-meng.ps.gz",
+}
+
+@mastersthesis{cfs:dabek-meng,
+ title = "A Cooperative File System"
+ author = "Frank Dabek",
+ school = MIT,
+ year = 2001, month = September,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/chord:dabek_thesis/dabek.pdf",
+ www_ps_url = PDOSWWW # "/papers/chord:dabek_thesis/dabek.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:dabek_thesis/tyan-meng.ps.gz",
+}
+
+@mastersthesis{chord:tyan-meng,
+ title = "A Case Study of Server Selection",
+ author = "Tina Tyan",
+ school = MIT,
+ year = 2001, month = September,
+ www_section = masterstheses,
+ www_pdf_url = PDOSWWW # "/papers/chord:tyan-meng.pdf",
+ www_ps_url = PDOSWWW # "/papers/chord:tyan-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/chord:tyan-meng.ps.gz",
+}
+
+@mastersthesis{click:gil-ms,
+ title = "MULTOPS: a data structure for denial-of-service attack detection",
+ author = "Thomer M. Gil",
+ school = "Vrije Universiteit",
+ year = 2000, month = August,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/click:gil-ms.ps.gz",
+}
+
+@mastersthesis{click:sit-ms,
+ title = "A Study of Caching in the Internet Domain Name System",
+ author = "Emil Sit",
+ school = MIT,
+ year = 2000, month = may,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/click:sit-ms.ps.gz",
+}
+
+
+@mastersthesis{sfs:kaminsky-ms,
+ title = "Flexible Key Management with SFS Agents",
+ author = "Michael Kaminsky",
+ school = MIT,
+ year = 2000, month = may,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:kaminsky-ms.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/sfs:kaminsky-ms.pdf",
+}
+
+@mastersthesis{sfs:almeida-ms,
+ title = "Framework for Implementing File Systems in Windows NT",
+ author = "Danilo Almeida",
+ school = MIT,
+ year = 1998, month = may,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:almeida-ms.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/sfs:almeida-ms.pdf",
+}
+
+@mastersthesis{sfs:rimer-ms,
+ title = "The Secure File System under Windows NT",
+ author = "Matthew Rimer",
+ school = MIT,
+ year = 1999, month = June,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:rimer-ms.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/sfs:rimer-ms.pdf",
+}
+
+@mastersthesis{prolac:montgomery-meng,
+ title = "A fast {Prolac} {TCP} for the real world",
+ author = "Montgomery, Jr., David Rogers",
+ school = MIT,
+ year = 1999, month = may,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/prolac:montgomery-meng.ps.gz",
+}
+
+@mastersthesis{exo:coffing-meng,
+ title = "An x86 Protected Mode Virtual Machine Monitor for the MIT Exokernel",
+ author = "Charles L. Coffing",
+ school = MIT,
+ year = 1999, month = May,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/exo:coffing-meng.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/exo:coffing-meng.ps.gz",
+}
+
+@mastersthesis{exo:chen-meng,
+ title = "Multiprocessing with the Exokernel Operating System",
+ author = "Benjie Chen",
+ school = MIT,
+ year = 2000, month = February,
+ www_section = masterstheses,
+ www_html_url = PDOSWWW # "/papers/exo:chen-meng.html",
+ www_ps_url = PDOSWWW # "/papers/exo:chen-meng.ps",
+ www_pdf_url = PDOSWWW # "/papers/exo:chen-meng.pdf",
+ www_ps_gz_url = PDOSWWW # "/papers/exo:chen-meng.ps.gz",
+}
+
+@mastersthesis{exo:candea-meng,
+ title = "Flexible and efficient sharing of protected abstractions",
+ author = "George M. Candea",
+ school = MIT,
+ year = 1998, month = may,
+ www_section = masterstheses,
+ www_abstract_url = PDOSWWW # "/papers/candea-meng.html",
+ www_ps_url = PDOSWWW # "/papers/ProtAbs.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/ProtAbs.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/ProtAbs.pdf",
+}
+
+@mastersthesis{exo-os:jj-meng,
+ title = "Applying Exokernel Principles to Conventional Operating Systems",
+ author = "John Jannotti",
+ school = MIT,
+ year = 1998, month = feb,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/jj-meng-exo-feb98.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/jj-meng-exo-feb98.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/jj-meng-exo-feb98.pdf",
+}
+
+@mastersthesis{pan:nygren-meng,
+ title = "The design and implementation of a high-performance active network node",
+ author = "Erik L. Nygren",
+ school = MIT,
+ year = 1998, month = feb,
+ www_section = masterstheses,
+ www_abstract_url = PDOSWWW # "/papers/nygren-mengthesis-pan-feb98.html",
+ www_ps_url = PDOSWWW # "/papers/nygren-mengthesis-pan-feb98.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/nygren-mengthesis-pan-feb98.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/nygren-mengthesis-pan-feb98.pdf",
+}
+
+@mastersthesis{exo:wyatt-meng,
+ title = "Shared libraries in an exokernel operating system",
+ author = "Douglas Karl Wyatt",
+ school = MIT,
+ year = 1997, month = sep,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/exo/theses/dwyatt/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/dwyatt/thesis.ps.gz",
+}
+
+@mastersthesis{prolac:kohler-ms,
+ title = "Prolac: a language for protocol compilation",
+ author = "Eddie Kohler",
+ school = MIT,
+ year = 1997, month = sep,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/prolac:kohler-ms.ps.gz",
+ www_pdf_url = PDOSWWW # "/papers/prolac:kohler-ms.pdf",
+}
+
+@mastersthesis{sfs:mazieres-ms,
+ title = "Security and decentralized control in the {SFS} global file system",
+ author = "David Mazi{\`e}res",
+ school = MIT,
+ year = 1997, month = aug,
+ www_section = masterstheses,
+ www_ps_gz_url = PDOSWWW # "/papers/sfs:mazieres-ms.ps.gz"
+}
+
+@mastersthesis{exo:pinckney-meng,
+ title = "Operating system extensibility through event capture",
+ author = "Thomas {Pinckney III}",
+ school = MIT,
+ year = 1997, month = feb,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/exo/theses/pinckney/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/pinckney/thesis.ps.gz",
+}
+
+@mastersthesis{exo:briceno-meng,
+ title = "Decentralizing {UNIX} abstractions in the exokernel architecture",
+ author = "H{\'e}ctor Manuel {Brice{\~n}o Pulido}",
+ school = MIT,
+ year = 1997, month = feb,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/exo/theses/hbriceno/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/hbriceno/thesis.ps.gz",
+}
+
+@mastersthesis{rover:nntp,
+ title = "The {Rover} {NNTP} proxy",
+ author = "Constantine Cristakos",
+ school = MIT,
+ year = 1996, month = jun,
+ type = "Advanced Undergraduate Project",
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/DeanAUP.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/DeanAUP.ps.gz",
+}
+
+@mastersthesis{exo:grimm-ms,
+ title = "Exodisk: maximizing application control over storage management",
+ author = "Robert Grimm",
+ school = MIT,
+ year = 1996, month = may,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/exo/theses/rgrimm/thesis.ps",
+ www_ps_gz_url = PDOSWWW # "/exo/theses/rgrimm/thesis.ps.gz",
+}
+
+@mastersthesis{rover:tauber-ms,
+ title = "Issues in building mobile-aware applications with the {Rover} toolkit",
+ author = "Joshua A. Tauber",
+ school = MIT,
+ year = 1996, month = may,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/JoshThesis.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/JoshThesis.ps.gz",
+}
+
+@mastersthesis{rover-mosaic:delespinasse-thesis,
+ title = "{Rover} {Mosaic}: e-mail communication for a full-function {Web} browser",
+ author = "Alan F. {deLespinasse}",
+ school = MIT,
+ year = 1995, month = jun,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/RoverMosaicThesis.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/RoverMosaicThesis.ps.gz",
+}
+
+@mastersthesis{r2over-mosaic:delespinasse-thesis,
+ title = {{Rover} {Mosaic}: e-mail communication for a full-function {Web} browser},
+ author = "Alan F. {deLespinasse}",
+ school = MIT,
+ year = 1995, month = jun,
+ www_section = masterstheses,
+ www_ps_url = PDOSWWW # "/papers/RoverMosaicThesis.ps",
+ www_ps_gz_url = PDOSWWW # "/papers/RoverMosaicThesis.ps.gz",
+}
+
+
+%% PROCEEDINGS
+
+@proceedings{asplos6,
+ booktitle = "Proceedings of the 6th International Conference on Architectural Support for Programming Languages and Operating Systems ({ASPLOS-VI})",
+ year = 1994, month = oct,
+ address = "San Jose, California"
+}
+
+@proceedings{ccs5,
+ booktitle = "Proceedings of the 5th {ACM} Conference on Computer and Communications Security ({CCS-5})",
+ year = 1998, month = nov,
+ address = "San Francisco, California",
+ bookurl = "http://www.bell-labs.com/user/reiter/ccs5/"
+}
+
+@proceedings{ccs9,
+ booktitle = "Proceedings of the 9th {ACM} Conference on Computer and Communications Security ({CCS-9})",
+ year = 2002, month = nov,
+ address = "Washington, D.C.",
+ bookurl = "http://www.acm.org/sigs/sigsac/ccs/"
+}
+
+@proceedings{dcs16,
+ booktitle = "Proceedings of the 16th International Conference on Distributed Computing Systems",
+ organization = IEEECompSoc,
+ year = 1996, month = may,
+ address = "Hong Kong",
+}
+
+@proceedings{dcs15,
+ booktitle = "Proceedings of the 15th International Conference on Distributed Computing Systems",
+ organization = IEEECompSoc,
+ year = 1995, month = jun,
+ address = "Vancouver, British Columbia",
+}
+
+@proceedings{hotnets1,
+ booktitle = "Proceedings of the First {W}orkshop on {H}ot {T}opics in {N}etworks ({HotNets-I})",
+ year = 2002, month = oct,
+ organization = "{ACM SIGCOMM}",
+ address = "Princeton, New Jersey",
+ bookurl = "http://www.cs.washington.edu/hotnets/",
+}
+
+@proceedings{hotos8,
+ booktitle = "Proceedings of the 8th {W}orkshop on {H}ot {T}opics in {O}perating {S}ystems ({HotOS-VIII})",
+ year = 2001, month = may,
+ organization = IEEECompSoc,
+ address = "Schloss Elmau, Germany",
+ bookurl = "http://i30www.ira.uka.de/conferences/HotOS/",
+}
+
+@proceedings{hotos6,
+ booktitle = "Proceedings of the 6th {W}orkshop on {H}ot {T}opics in {O}perating {S}ystems ({HotOS-VI})",
+ year = 1997, month = may,
+ organization = IEEECompSoc,
+ address = "Chatham, Cape Cod, Massachusetts",
+ bookurl = "http://www.eecs.harvard.edu/hotos",
+}
+
+@proceedings{hotos5,
+ booktitle = "Proceedings of the 5th {W}orkshop on {H}ot {T}opics in {O}perating {S}ystems ({HotOS-V})",
+ year = 1995, month = may,
+ organization = IEEECompSoc,
+ address = "Orcas Island, Washington",
+ bookurl = "http://www.research.microsoft.com/research/os/HotOs/",
+}
+
+@proceedings{mobicom96,
+ booktitle = "Proceedings of the 2nd {ACM} International Conference on Mobile Computing and Networking ({MobiCom} '96)",
+ year = 1996, month = nov,
+ address = "Rye, New York",
+ bookurl = "http://www.acm.org/sigmobile/conf/mobicom96/",
+}
+
+@proceedings{usenix02,
+ booktitle = "Proceedings of the 2002 USENIX Annual Technical Conference (USENIX '02)",
+ year = 2002, month = jun,
+ address = "Monterey, California",
+ bookurl = "http://www.usenix.org/events/usenix02/",
+}
+
+@proceedings{usenix01,
+ booktitle = "Proceedings of the 2001 USENIX Annual Technical Conference (USENIX '01)",
+ year = 2001, month = jun,
+ address = "Boston, Massachusetts",
+ bookurl = "http://www.usenix.org/events/usenix01/",
+}
+
+@proceedings{mobicom01,
+ booktitle = "Proceedings of the 7th {ACM} International Conference on Mobile Computing and Networking",
+ year = 2001, month = jul,
+ address = "Rome, Italy",
+ bookurl = "http://www.research.ibm.com/acm_sigmobile_conf_2001/"
+}
+
+@proceedings{mobicom00,
+ booktitle = "Proceedings of the 6th {ACM} International Conference on Mobile Computing and Networking ({MobiCom} '00)",
+ year = 2000, month = aug,
+ address = "Boston, Massachusetts",
+ bookurl = "http://www.argreenhouse.com/mobicom2000/",
+}
+
+@proceedings{openarch99,
+ booktitle = "Proceedings of the 2nd {IEEE} Conference on Open Architectures and Network Programming ({OpenArch} '99)",
+ year = 1999, month = mar,
+ address = "New York, New York",
+ bookurl = "http://www.ctr.columbia.edu/comet/activities/openarch99/",
+}
+
+@proceedings{osdi5,
+ booktitle = "Proceedings of the 5th {USENIX} {S}ymposium on {O}perating {S}ystems {D}esign and {I}mplementation ({OSDI} '02)",
+ year = 2002, month = dec,
+ address = "Boston, Massachusetts",
+}
+
+@proceedings{osdi1,
+ booktitle = "Proceedings of the 1st {USENIX} {S}ymposium on {O}perating {S}ystems {D}esign and {I}mplementation ({OSDI} '94)",
+ year = 1994, month = nov,
+ address = "Monterey, California",
+ bookurl = "http://www2.cs.utah.edu/~lepreau/osdi94/",
+}
+
+@proceedings{osdi4,
+ booktitle = "Proceedings of the 4th {USENIX} {S}ymposium on {O}perating {S}ystems {D}esign and {I}mplementation ({OSDI} 2000)",
+ year = 2000, month = oct,
+ address = "San Diego, California",
+ bookurl = "http://www.usenix.org/events/osdi2000/",
+}
+
+@proceedings{pldi97,
+ booktitle = "Proceedings of the {ACM} {SIGPLAN} '97 Conference on Programming Design and Implementation ({PLDI} '97)",
+ year = 1997, month = jun,
+ address = "Las Vegas, Nevada",
+ bookurl = "http://cs-www.bu.edu/pub/pldi97/",
+}
+
+@proceedings{pldi96,
+ booktitle = "Proceedings of the {ACM} {SIGPLAN} '96 Conference on Programming Design and Implementation ({PLDI} '96)",
+ year = 1996, month = may,
+ address = "Philadelphia, Pennsylvania",
+}
+
+@proceedings{popl96,
+ booktitle = "Proceedings of the 23rd {ACM} {SIGPLAN}-{SIGACT} Symposium on Principles of Programming Languages ({POPL} '96)",
+ year = 1996, month = jan,
+ address = "St. Petersburg Beach, Florida",
+ bookurl = "ftp://parcftp.xerox.com/pub/popl96/popl96.html"
+}
+
+@proceedings{ppopp95,
+ booktitle = "Proceedings of the 5th {ACM} {SIGPLAN} Symposium on Principles and Practice of Parallel Programming ({PPoPP} '95)",
+ year = 1995, month = jul,
+ address = "Santa Barbara, California",
+ bookurl = "http://www.cs.ucsb.edu/Conferences/PPOPP95/",
+}
+
+@proceedings{sigcomm99,
+ booktitle = "Proceedings of the {ACM} {SIGCOMM} '99 Conference: Applications, Technologies, Architectures, and Protocols for Computer Communication",
+ year = 1999, month = aug,
+ address = "Cambridge, Massachusetts",
+ bookurl = "http://www.acm.org/sigcomm/sigcomm99/",
+}
+
+@proceedings{sigcomm96,
+ booktitle = "Proceedings of the {ACM} {SIGCOMM} '96 Conference: Applications, Technologies, Architectures, and Protocols for Computer Communication",
+ year = 1996, month = aug,
+ address = "Stanford, California",
+ bookurl = "http://www.acm.org/sigcomm/sigcomm96/",
+}
+
+@proceedings{sigcommimw01,
+ booktitle = "Proceedings of the {ACM} {SIGCOMM} Internet Measurement Workshop '01",
+ year = 2001, month = nov,
+ address = "San Francisco, California",
+ bookurl = "http://www.acm.org/sigcomm/measworkshop2001.html"
+}
+
+@proceedings{sigcomm01,
+ booktitle = "Proceedings of the {ACM} {SIGCOMM} '01 Conference",
+ year = 2001, month = aug,
+ address = "San Diego, California",
+ bookurl = "http://www.acm.org/sigcomm/sigcomm2001/",
+}
+
+@proceedings{iptps02,
+ booktitle = "Proceedings of the 1st International Workshop on Peer-to-Peer Systems (IPTPS)",
+ year = 2002, month = mar,
+ address = "Cambridge, MA",
+ bookurl = "http://www.cs.rice.edu/Conferences/IPTPS02/"
+}
+
+@proceedings{sigops-euro9,
+ booktitle = "Proceedings of the 9th {ACM} {SIGOPS} {E}uropean workshop: Beyond the {PC}: New Challenges for the Operating System",
+ year = 2000, month = sep,
+ address = "Kolding, Denmark",
+ bookurl = "http://www.diku.dk/ew2000/",
+}
+
+@proceedings{sigops-euro8,
+ booktitle = "Proceedings of the 8th {ACM} {SIGOPS} {E}uropean workshop: Support for composing distributed applications",
+ year = 1998, month = sep,
+ address = "Sintra, Portugal",
+ bookurl = "http://www.dsg.cs.tcd.ie/~vjcahill/sigops98/",
+}
+
+@proceedings{sigops-euro7,
+ booktitle = "Proceedings of the 7th {ACM} {SIGOPS} {E}uropean workshop: Systems support for worldwide applications",
+ year = 1996, month = sep,
+ address = "Connemara, Ireland",
+ bookurl = "http://mosquitonet.stanford.edu/sigops96/",
+}
+
+@proceedings{sigops-euro6,
+ booktitle = "Proceedings of the 6th {ACM} {SIGOPS} {E}uropean workshop: Matching operating systems to application needs",
+ year = 1994, month = sep,
+ address = "Dagstuhl Castle, Wadern, Germany",
+}
+
+@proceedings{sosp18,
+ booktitle = "Proceedings of the 18th " # SOSP # " ({SOSP} '01)",
+ year = 2001, month = oct,
+ address = "Chateau Lake Louise, Banff, Canada",
+ bookurl = "http://www.cs.ucsd.edu/sosp01/",
+}
+
+@proceedings{sosp17,
+ booktitle = "Proceedings of the 17th " # SOSP # " ({SOSP} '99)",
+ year = 1999, month = dec,
+ address = "Kiawah Island, South Carolina",
+ bookurl = "http://www.diku.dk/sosp99/",
+}
+
+@proceedings{sosp16,
+ booktitle = "Proceedings of the 16th " # SOSP # " ({SOSP} '97)",
+ year = 1997, month = oct,
+ address = "Saint-Mal{\^o}, France",
+ bookurl = "http://www.cs.washington.edu/sosp16",
+}
+
+@proceedings{sosp15,
+ booktitle = "Proceedings of the 15th " # SOSP # " ({SOSP} '95)",
+ year = 1995, month = dec,
+ address = "Copper Mountain Resort, Colorado",
+}
+
+@proceedings{sosp14,
+ booktitle = "Proceedings of the 14th " # SOSP # " ({SOSP} '93)",
+ year = 1993, month = dec,
+ address = "Asheville, North Carolina",
+}
+
+@proceedings{supercomp96,
+ booktitle = "Supercomputing '96 Conference Proceedings: The international conference on high performance computing and communications",
+ organization = ACMabbr,
+ year = 1996, month = nov,
+ address = "Pittsburgh, Pennsylvania",
+ bookurl = "http://www.supercomp.org/sc96/",
+}
+
+@proceedings{usenix97,
+ booktitle = "Proceedings of the {USENIX} 1997 Annual Technical Conference",
+ year = 1997, month = jan,
+ address = "Anaheim, California",
+ bookurl = "http://www.usenix.org/ana97/",
+}
+
+@proceedings{wcsss96,
+ booktitle = "Workshop Record of {WCSSS} '96: The Inaugural Workshop on Compiler Support for Systems Software",
+ organization = "{ACM} {SIGPLAN}",
+ year = 1996, month = feb,
+ address = "Tuscon, Arizona",
+ bookurl = "http://www.cs.arizona.edu/wcsss96/"
+}
+
+@proceedings{wcsss99,
+ booktitle = "Workshop Record of {WCSSS} '99: The 2nd {ACM} {SIGPLAN} Workshop on Compiler Support for Systems Software",
+ year = 1999, month = may,
+ address = "Atlanta, Georgia",
+ bookurl = "http://www.irisa.fr/compose/wcsss99/"
+}
+
+@proceedings{wmcsa94,
+ booktitle = "Proceedings of the Workshop on Mobile Computing Systems and Applications ({WMCSA} '94)",
+ organization = IEEECompSoc,
+ year = 1994, month = dec,
+ address = "Santa Cruz, California",
+}
+
+@proceedings{wwos4,
+ booktitle = "Proceedings of the 4th Workshop on Workstation Operating Systems",
+ organization = IEEECompSoc,
+ year = 1993, month = oct,
+ address = "Napa, California"
+}
+
+@proceedings{www94,
+ booktitle = "Proceedings of the 2nd International {WWW} Conference: Mosaic and the Web",
+ year = 1994, month = oct,
+ address = "Chicago, Illinois",
+ bookurl = "http://www.ncsa.uiuc.edu/SDG/IT94/IT94Info-old.html",
+}
+
+@proceedings{sec10,
+ booktitle = "Proceedings of the 10th {USENIX} {S}ecurity {S}ymposium",
+ year = 2001, month = aug,
+ address = "Washington, D.C.",
+ bookurl = "http://www.usenix.org/events/sec01/",
+}
+
+
+%% JOURNALS
+
+@journal{journal:ieee-toc,
+ journal = IEEEabbr # " Transactions on Computers",
+}
+
+@journal{journal:osr,
+ journal = "Operating Systems Review",
+ organization = ACM,
+}
+
+@journal{journal:toplas,
+ journal = ACMabbr # " Transactions on Programming Languages and Systems",
+}
+
+@journal{journal:tocs,
+ journal = ACMabbr # " Transactions on Computer Systems",
+}
+
+@journal{journal:winet,
+ journal = ACMabbr # " Wireless Networks",
+}
+
diff --git a/writeHTML.py b/writeHTML.py
new file mode 100644
index 0000000..c246820
--- /dev/null
+++ b/writeHTML.py
@@ -0,0 +1,5 @@
+#!/usr/bin/python
+
+import BiBTeX
+
+