+
+#define DEF_EDITOR "vi"
+
+/*
+ * Invoke an editor on the given file. Which editor to use might change
+ * installation to installation. For now, we use "vi". In any event,
+ * the environment variable "EDITOR" overrides any default.
+ */
+
+public edit(filename)
+String filename;
+{
+ extern String getenv();
+ String ed, src, s;
+ Symbol f;
+ Address addr;
+ char lineno[10];
+
+ ed = getenv("EDITOR");
+ if (ed == nil) {
+ ed = DEF_EDITOR;
+ }
+ src = findsource((filename != nil) ? filename : cursource);
+ if (src == nil) {
+ f = which(identname(filename, true));
+ if (not isblock(f)) {
+ error("can't read \"%s\"", filename);
+ }
+ addr = firstline(f);
+ if (addr == NOADDR) {
+ error("no source for \"%s\"", filename);
+ }
+ src = srcfilename(addr);
+ s = findsource(src);
+ if (s != nil) {
+ src = s;
+ }
+ sprintf(lineno, "+%d", srcline(addr));
+ } else {
+ sprintf(lineno, "+1");
+ }
+ call(ed, stdin, stdout, lineno, src, nil);
+}