[BACK]Return to cgi.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/cgi.c between version 1.10 and 1.19

version 1.10, 2011/12/07 00:23:04 version 1.19, 2011/12/08 22:47:09
Line 67  struct req {
Line 67  struct req {
   
 static  int              atou(const char *, unsigned *);  static  int              atou(const char *, unsigned *);
 static  void             catman(const char *);  static  void             catman(const char *);
   static  int              cmp(const void *, const void *);
 static  void             format(const char *);  static  void             format(const char *);
 static  void             html_print(const char *);  static  void             html_print(const char *);
 static  void             html_putchar(char);  static  void             html_putchar(char);
Line 295  resp_begin_html(int code, const char *msg)
Line 296  resp_begin_html(int code, const char *msg)
              " \"http://www.w3.org/TR/html4/strict.dtd\">"      "\n"               " \"http://www.w3.org/TR/html4/strict.dtd\">"      "\n"
              "<HTML>"                                           "\n"               "<HTML>"                                           "\n"
              " <HEAD>"                                          "\n"               " <HEAD>"                                          "\n"
              "   <META HTTP-EQUIV=\"Content-Type\" "            "\n"               "  <META HTTP-EQUIV=\"Content-Type\" "             "\n"
              "         CONTENT=\"text/html; charset=utf-8\">"   "\n"               "        CONTENT=\"text/html; charset=utf-8\">"    "\n"
                "  <LINK REL=\"stylesheet\" HREF=\"/man.cgi.css\"" "\n"
                "        TYPE=\"text/css\" media=\"all\">"         "\n"
              "  <TITLE>System Manpage Reference</TITLE>"        "\n"               "  <TITLE>System Manpage Reference</TITLE>"        "\n"
              " </HEAD>"                                         "\n"               " </HEAD>"                                         "\n"
              " <BODY>"                                          "\n"               " <BODY>"                                          "\n"
Line 321  resp_searchform(const struct req *req)
Line 324  resp_searchform(const struct req *req)
         for (i = 0; i < (int)req->fieldsz; i++)          for (i = 0; i < (int)req->fieldsz; i++)
                 if (0 == strcmp(req->fields[i].key, "expr"))                  if (0 == strcmp(req->fields[i].key, "expr"))
                         expr = req->fields[i].val;                          expr = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "query"))
                           expr = req->fields[i].val;
                 else if (0 == strcmp(req->fields[i].key, "sec"))                  else if (0 == strcmp(req->fields[i].key, "sec"))
                         sec = req->fields[i].val;                          sec = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "sektion"))
                           sec = req->fields[i].val;
                 else if (0 == strcmp(req->fields[i].key, "arch"))                  else if (0 == strcmp(req->fields[i].key, "arch"))
                         arch = req->fields[i].val;                          arch = req->fields[i].val;
   
           if (NULL != sec && 0 == strcmp(sec, "0"))
                   sec = NULL;
   
         puts("<!-- Begin search form. //-->");          puts("<!-- Begin search form. //-->");
         printf("<FORM ACTION=\"");          printf("<FORM ACTION=\"");
         html_print(progname);          html_print(progname);
         printf("/search.html\" METHOD=\"get\">\n");          printf("/search.html\" METHOD=\"get\">\n");
         puts(" <FIELDSET>\n"          printf("<FIELDSET>\n"
              "  <INPUT TYPE=\"submit\" VALUE=\"Search:\">");                 "<LEGEND>Search Parameters</LEGEND>\n"
         printf("  Terms: <INPUT TYPE=\"text\" "                 "<INPUT TYPE=\"submit\" NAME=\"op\" "
                         "SIZE=\"60\" NAME=\"expr\" VALUE=\"");                  "VALUE=\"Whatis\"> or \n"
                  "<INPUT TYPE=\"submit\" NAME=\"op\" "
                   "VALUE=\"apropos\"> for manuals satisfying \n"
                  "<INPUT TYPE=\"text\" NAME=\"expr\" VALUE=\"");
         html_print(expr);          html_print(expr);
         puts("\">");          printf("\">, section "
         printf("  Section: <INPUT TYPE=\"text\" "                 "<INPUT TYPE=\"text\" "
                         "SIZE=\"4\" NAME=\"sec\" VALUE=\"");                  "SIZE=\"4\" NAME=\"sec\" VALUE=\"");
         html_print(sec);          html_print(sec);
         puts("\">");          printf("\">, arch "
         printf("  Arch: <INPUT TYPE=\"text\" "                 "<INPUT TYPE=\"text\" "
                         "SIZE=\"8\" NAME=\"arch\" VALUE=\"");                  "SIZE=\"8\" NAME=\"arch\" VALUE=\"");
         html_print(arch);          html_print(arch);
         puts("\">");          puts("\">.\n"
         puts(" </FIELDSET>\n</FORM>\n<!-- End search form. //-->");               "<INPUT TYPE=\"reset\" VALUE=\"Reset\">\n"
                "</FIELDSET>\n"
                "</FORM>\n"
                "<!-- End search form. //-->");
 }  }
   
 static void  static void
Line 361  resp_error400(void)
Line 377  resp_error400(void)
 {  {
   
         resp_begin_html(400, "Query Malformed");          resp_begin_html(400, "Query Malformed");
         puts("<H1>Malformed Query</H1>\n"          printf("<H1>Malformed Query</H1>\n"
              "<P>\n"                 "<P>\n"
              "  The query your entered was malformed.\n"                 "  The query your entered was malformed.\n"
              "  Try again from the\n"                 "  Try again from the\n"
              "  <A HREF=\"/index.html\">main page</A>\n"                 "  <A HREF=\"%s/index.html\">main page</A>\n"
              "</P>");                 "</P>", progname);
         resp_end_html();          resp_end_html();
 }  }
   
Line 380  resp_error404(const char *page)
Line 396  resp_error404(const char *page)
              "  The page you're looking for, ");               "  The page you're looking for, ");
         printf("  <B>");          printf("  <B>");
         html_print(page);          html_print(page);
         puts("</B>,\n"          printf("</B>,\n"
              "  could not be found.\n"                 "  could not be found.\n"
              "  Try searching from the\n"                 "  Try searching from the\n"
              "  <A HREF=\"/index.html\">main page</A>\n"                 "  <A HREF=\"%s/index.html\">main page</A>\n"
              "</P>");                 "</P>", progname);
         resp_end_html();          resp_end_html();
 }  }
   
Line 408  resp_baddb(void)
Line 424  resp_baddb(void)
 static void  static void
 resp_search(struct res *r, size_t sz, void *arg)  resp_search(struct res *r, size_t sz, void *arg)
 {  {
         int              i;          int              i, whatis;
           const char      *ep, *sec, *arch;
           const struct req *req;
   
           whatis = 1;
           ep = sec = arch = NULL;
   
         if (1 == sz) {          if (1 == sz) {
                 /*                  /*
                  * If we have just one result, then jump there now                   * If we have just one result, then jump there now
Line 423  resp_search(struct res *r, size_t sz, void *arg)
Line 444  resp_search(struct res *r, size_t sz, void *arg)
                 return;                  return;
         }          }
   
           req = (const struct req *)arg;
   
           for (i = 0; i < (int)req->fieldsz; i++)
                   if (0 == strcmp(req->fields[i].key, "expr"))
                           ep = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "query"))
                           ep = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "sec"))
                           sec = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "sektion"))
                           sec = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "arch"))
                           arch = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "apropos"))
                           whatis = 0 == strcmp
                                   (req->fields[i].val, "0");
                   else if (0 == strcmp(req->fields[i].key, "op"))
                           whatis = 0 == strcasecmp
                                   (req->fields[i].val, "whatis");
   
           qsort(r, sz, sizeof(struct res), cmp);
   
         resp_begin_html(200, NULL);          resp_begin_html(200, NULL);
         resp_searchform((const struct req *)arg);          resp_searchform(req);
   
         if (0 == sz)          if (0 == sz) {
                 puts("<P>No results found.</P>");                  puts("<P>\n"
                        "No results found.");
                   if (whatis) {
                           printf("(Try <A HREF=\"");
                           html_print(progname);
                           printf("/search.html?op=apropos&amp;expr=");
                           html_print(ep ? ep : "");
                           printf("&amp;sec=");
                           html_print(sec ? sec : "");
                           printf("&amp;arch=");
                           html_print(arch ? arch : "");
                           puts("\">apropos</A>?)");
                   }
                   puts("</P>");
                   resp_end_html();
                   return;
           }
   
           puts("<P></P>\n"
                "<TABLE>");
   
         for (i = 0; i < (int)sz; i++) {          for (i = 0; i < (int)sz; i++) {
                 printf("<P><A HREF=\"");                  printf("<TR><TD CLASS=\"title\"><A HREF=\"");
                 html_print(progname);                  html_print(progname);
                 printf("/show/%u/%u.html\">", r[i].volume, r[i].rec);                  printf("/show/%u/%u.html\">", r[i].volume, r[i].rec);
                 html_print(r[i].title);                  html_print(r[i].title);
Line 440  resp_search(struct res *r, size_t sz, void *arg)
Line 502  resp_search(struct res *r, size_t sz, void *arg)
                         putchar('/');                          putchar('/');
                         html_print(r[i].arch);                          html_print(r[i].arch);
                 }                  }
                 printf(")</A> ");                  printf(")</A></TD><TD CLASS=\"desc\">");
                 html_print(r[i].desc);                  html_print(r[i].desc);
                 puts("</P>");                  puts("</TD></TR>");
         }          }
   
           puts("</TABLE>");
   
         resp_end_html();          resp_end_html();
 }  }
   
Line 470  catman(const char *file)
Line 534  catman(const char *file)
                 return;                  return;
         }          }
   
         resp_begin_html(200, NULL);          resp_begin_http(200, NULL);
           puts("<!DOCTYPE HTML PUBLIC "                           "\n"
                " \"-//W3C//DTD HTML 4.01//EN\""                   "\n"
                " \"http://www.w3.org/TR/html4/strict.dtd\">"      "\n"
                "<HTML>"                                           "\n"
                " <HEAD>"                                          "\n"
                "  <META HTTP-EQUIV=\"Content-Type\" "             "\n"
                "        CONTENT=\"text/html; charset=utf-8\">"    "\n"
                "  <LINK REL=\"stylesheet\" HREF=\"/catman.css\""  "\n"
                "        TYPE=\"text/css\" media=\"all\">"         "\n"
                "  <TITLE>System Manpage Reference</TITLE>"        "\n"
                " </HEAD>"                                         "\n"
                " <BODY>"                                          "\n"
                "<!-- Begin page content. //-->");
   
         puts("<PRE>");          puts("<PRE>");
         while (NULL != (p = fgetln(f, &len))) {          while (NULL != (p = fgetln(f, &len))) {
Line 614  format(const char *file)
Line 691  format(const char *file)
                 return;                  return;
         }          }
   
         snprintf(opts, sizeof(opts), "style=/style.css,"          snprintf(opts, sizeof(opts), "style=/man.css,"
                         "man=%s/search.html?sec=%%S&expr=%%N,"                          "man=%s/search.html?sec=%%S&expr=%%N,"
                         "includes=/cgi-bin/man.cgi/usr/include/%%I",                          /*"includes=/cgi-bin/man.cgi/usr/include/%%I"*/,
                         progname);                          progname);
   
         mparse_result(mp, &mdoc, &man);          mparse_result(mp, &mdoc, &man);
Line 691  pg_show(const struct manpaths *ps, const struct req *r
Line 768  pg_show(const struct manpaths *ps, const struct req *r
         else if (NULL == memchr(fn, '\0', val.size - (fn - cp)))          else if (NULL == memchr(fn, '\0', val.size - (fn - cp)))
                 resp_baddb();                  resp_baddb();
         else {          else {
                 strlcpy(file, ps->paths[vol], MAXPATHLEN);                  strlcpy(file, cache, MAXPATHLEN);
                 strlcat(file, "/", MAXPATHLEN);                  strlcat(file, "/", MAXPATHLEN);
                 strlcat(file, fn, MAXPATHLEN);                  strlcat(file, fn, MAXPATHLEN);
                 if (0 == strcmp(cp, "cat"))                  if (0 == strcmp(cp, "cat"))
Line 707  static void
Line 784  static void
 pg_search(const struct manpaths *ps, const struct req *req, char *path)  pg_search(const struct manpaths *ps, const struct req *req, char *path)
 {  {
         size_t            tt;          size_t            tt;
         int               i, sz, rc;          int               i, sz, rc, whatis;
         const char       *ep, *start;          const char       *ep, *start;
         char            **cp;          char            **cp;
         struct opts       opt;          struct opts       opt;
Line 717  pg_search(const struct manpaths *ps, const struct req 
Line 794  pg_search(const struct manpaths *ps, const struct req 
         cp = NULL;          cp = NULL;
         ep = NULL;          ep = NULL;
         sz = 0;          sz = 0;
           whatis = 1;
   
         memset(&opt, 0, sizeof(struct opts));          memset(&opt, 0, sizeof(struct opts));
   
         for (sz = i = 0; i < (int)req->fieldsz; i++)          for (sz = i = 0; i < (int)req->fieldsz; i++)
                 if (0 == strcmp(req->fields[i].key, "expr"))                  if (0 == strcmp(req->fields[i].key, "expr"))
                         ep = req->fields[i].val;                          ep = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "query"))
                           ep = req->fields[i].val;
                 else if (0 == strcmp(req->fields[i].key, "sec"))                  else if (0 == strcmp(req->fields[i].key, "sec"))
                         opt.cat = req->fields[i].val;                          opt.cat = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "sektion"))
                           opt.cat = req->fields[i].val;
                 else if (0 == strcmp(req->fields[i].key, "arch"))                  else if (0 == strcmp(req->fields[i].key, "arch"))
                         opt.arch = req->fields[i].val;                          opt.arch = req->fields[i].val;
                   else if (0 == strcmp(req->fields[i].key, "apropos"))
                           whatis = 0 == strcmp
                                   (req->fields[i].val, "0");
                   else if (0 == strcmp(req->fields[i].key, "op"))
                           whatis = 0 == strcasecmp
                                   (req->fields[i].val, "whatis");
   
           if (NULL != opt.cat && 0 == strcmp(opt.cat, "0"))
                   opt.cat = NULL;
   
         /*          /*
          * Poor man's tokenisation.           * Poor man's tokenisation.
          * Just break apart by spaces.           * Just break apart by spaces.
Line 756  pg_search(const struct manpaths *ps, const struct req 
Line 847  pg_search(const struct manpaths *ps, const struct req 
          * The resp_search() function is called with the results.           * The resp_search() function is called with the results.
          */           */
   
         if (NULL != (expr = exprcomp(sz, cp, &tt)))          expr = whatis ? termcomp(sz, cp, &tt) :
                           exprcomp(sz, cp, &tt);
   
           if (NULL != expr)
                 rc = apropos_search                  rc = apropos_search
                         (ps->sz, ps->paths, &opt,                          (ps->sz, ps->paths, &opt,
                          expr, tt, (void *)req, resp_search);                           expr, tt, (void *)req, resp_search);
Line 865  main(void)
Line 959  main(void)
   
         return(EXIT_SUCCESS);          return(EXIT_SUCCESS);
 }  }
   
   static int
   cmp(const void *p1, const void *p2)
   {
   
           return(strcasecmp(((const struct res *)p1)->title,
                                   ((const struct res *)p2)->title));
   }
   

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.19

CVSweb