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

Diff for /mandoc/cgi.c between version 1.96 and 1.97

version 1.96, 2014/08/26 11:21:40 version 1.97, 2014/09/14 19:44:28
Line 954  pg_search(const struct req *req)
Line 954  pg_search(const struct req *req)
         struct mansearch          search;          struct mansearch          search;
         struct manpaths           paths;          struct manpaths           paths;
         struct manpage           *res;          struct manpage           *res;
         char                    **cp;          char                    **argv;
         const char               *ep, *start;          char                     *query, *rp, *wp;
         size_t                    ressz;          size_t                    ressz;
         int                       i, sz;          int                       argc;
   
         /*          /*
          * Begin by chdir()ing into the root of the manpath.           * Begin by chdir()ing into the root of the manpath.
Line 982  pg_search(const struct req *req)
Line 982  pg_search(const struct req *req)
         paths.paths[0] = mandoc_strdup(".");          paths.paths[0] = mandoc_strdup(".");
   
         /*          /*
          * Poor man's tokenisation: just break apart by spaces.           * Break apart at spaces with backslash-escaping.
          * Yes, this is half-ass.  But it works for now.  
          */           */
   
         ep = req->q.query;          argc = 0;
         while (ep && isspace((unsigned char)*ep))          argv = NULL;
                 ep++;          rp = query = mandoc_strdup(req->q.query);
           for (;;) {
         sz = 0;                  while (isspace((unsigned char)*rp))
         cp = NULL;                          rp++;
         while (ep && '\0' != *ep) {                  if (*rp == '\0')
                 cp = mandoc_reallocarray(cp, sz + 1, sizeof(char *));                          break;
                 start = ep;                  argv = mandoc_reallocarray(argv, argc + 1, sizeof(char *));
                 while ('\0' != *ep && ! isspace((unsigned char)*ep))                  argv[argc++] = wp = rp;
                         ep++;                  for (;;) {
                 cp[sz] = mandoc_malloc((ep - start) + 1);                          if (isspace((unsigned char)*rp)) {
                 memcpy(cp[sz], start, ep - start);                                  *wp = '\0';
                 cp[sz++][ep - start] = '\0';                                  rp++;
                 while (isspace((unsigned char)*ep))                                  break;
                         ep++;                          }
                           if (rp[0] == '\\' && rp[1] != '\0')
                                   rp++;
                           if (wp != rp)
                                   *wp = *rp;
                           if (*rp == '\0')
                                   break;
                           wp++;
                           rp++;
                   }
         }          }
   
         if (0 == mansearch(&search, &paths, sz, cp, &res, &ressz))          if (0 == mansearch(&search, &paths, argc, argv, &res, &ressz))
                 pg_noresult(req, "You entered an invalid query.");                  pg_noresult(req, "You entered an invalid query.");
         else if (0 == ressz)          else if (0 == ressz)
                 pg_noresult(req, "No results found.");                  pg_noresult(req, "No results found.");
         else          else
                 pg_searchres(req, res, ressz);                  pg_searchres(req, res, ressz);
   
         for (i = 0; i < sz; i++)          free(query);
                 free(cp[i]);          mansearch_free(res, ressz);
         free(cp);  
   
         for (i = 0; i < (int)ressz; i++) {  
                 free(res[i].file);  
                 free(res[i].names);  
                 free(res[i].output);  
         }  
         free(res);  
   
         free(paths.paths[0]);          free(paths.paths[0]);
         free(paths.paths);          free(paths.paths);
 }  }

Legend:
Removed from v.1.96  
changed lines
  Added in v.1.97

CVSweb