+
+#ifdef STR_DEBUG
+char *
+str_alloc(l)
+int l;
+{
+ register struct string *s;
+
+ s = (struct string *) malloc((unsigned)l + str_offset);
+ if (s == 0)
+ return 0;
+ if (str_head.s_forw == 0)
+ str_head.s_forw = str_head.s_back = &str_head;
+ s->s_forw = str_head.s_forw;
+ s->s_back = &str_head;
+ str_head.s_forw = s;
+ s->s_forw->s_back = s;
+ return s->s_data;
+}
+
+str_free(str)
+char *str;
+{
+ register struct string *s;
+
+ for (s = str_head.s_forw; s != &str_head && s->s_data != str;
+ s = s->s_forw)
+ ;
+ if (s == &str_head)
+ abort();
+ s->s_back->s_forw = s->s_forw;
+ s->s_forw->s_back = s->s_back;
+ free((char *)s);
+}
+#endif