[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 06/16] search actually working :D


MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

From: arf20 <aruizfernandez05@xxxxxxxxx>

---
 index.c        |  21 +++++++++++++++++----
 index.h        |   3 ++-
 index.htm.tmpl |  20 ++++++++++++++++----
 main.c         |  37 ++++++++++++++++++++++++++++---------
 search         | Bin 46312 -> 47088 bytes
 5 files changed, 63 insertions(+), 18 deletions(-)

diff --git a/index.c b/index.c
index 44864bb..57c05d7 100644
--- a/index.c
+++ b/index.c
@@ -115,6 +115,13 @@ results_insert(results_t *results, const node_data_t *result)
     results->results[results->size++] = result;
 }
 
+void
+results_destroy(results_t *results)
+{
+    free(results->results);
+    free(results);
+}
+
 int
 index_init()
 {
@@ -138,7 +145,7 @@ index_deinit()
 }
 
 map_t *
-index_new(size_t icapacity, const char *dir, int examine)
+index_recurse(size_t size, const char *dir, int examine, size_t rootlen)
 {
     DIR *dirp = opendir(dir);
     if (!dirp) {
@@ -147,7 +154,7 @@ index_new(size_t icapacity, const char *dir, int examine)
         return NULL;
     }
 
-    map_t *map = map_new(icapacity);
+    map_t *map = map_new(size);
 
     char path[4096];
     struct dirent *de = NULL;
@@ -165,6 +172,7 @@ index_new(size_t icapacity, const char *dir, int examine)
         /* stat it */
         node_data_t *data = malloc(sizeof(node_data_t));
         data->name = strdup(de->d_name);
+        data->path = strdup(&path[rootlen]);
         if (stat(path, &data->stat) < 0) {
             fprintf(stderr, "[index] error stat() %s: %s\n", path,
                 strerror(errno));
@@ -183,7 +191,7 @@ index_new(size_t icapacity, const char *dir, int examine)
         /* recurse */
         map_t *child = NULL;
         if (de->d_type == DT_DIR) {
-            index_new(icapacity, path, examine);
+            child = index_recurse(size, path, examine, rootlen);
         }
 
         map_insert(map, de->d_name, data, child);
@@ -192,6 +200,11 @@ index_new(size_t icapacity, const char *dir, int examine)
     return map;
 }
 
+map_t *
+index_new(size_t size, const char *dir, int examine) {
+    return index_recurse(size, dir, examine, strlen(dir) + 1);
+}
+
 void
 index_lookup_substr(map_t *index, const char *query,
     results_t *results)
@@ -200,7 +213,7 @@ index_lookup_substr(map_t *index, const char *query,
         if (!index->map[i].data)
             continue;
 
-        for (struct node_s *node = &index->map[i]; node->next; node = node->next) {
+        for (struct node_s *node = &index->map[i]; node; node = node->next) {
             if (strstr(node->data->name, query))
                 results_insert(results, node->data);
             if (node->child)
diff --git a/index.h b/index.h
index d31fd9b..187de94 100644
--- a/index.h
+++ b/index.h
@@ -33,7 +33,7 @@ typedef enum {
 } lookup_type_t;
 
 typedef struct {
-    char *name;
+    const char *name, *path;
     struct stat stat;
     const char *mime;
 } node_data_t;
@@ -50,6 +50,7 @@ void index_deinit();
 index_t index_new(size_t icapacity, const char *root, int examine);
 results_t *index_lookup(index_t index, lookup_type_t type, const char *query);
 void index_destroy(index_t index);
+void results_destroy(results_t *results);
 
 #endif /* _INDEX_H */
 
diff --git a/index.htm.tmpl b/index.htm.tmpl
index 1443aa0..fd21578 100644
--- a/index.htm.tmpl
+++ b/index.htm.tmpl
@@ -13,19 +13,16 @@
     display: block;
 }
 
-/* Style the form - display items horizontally */
 .form-inline {
     display: flex;
     flex-flow: row wrap;
     align-items: center;
 }
 
-/* Add some margins for each label */
 .form-inline label {
 
 }
 
-/* Style the input fields */
 .form-inline input {
     flex-grow: 1;
     vertical-align: middle;
@@ -37,6 +34,20 @@
     border: none;
 }
 
+.result {
+    margin-left: 1em;
+    margin-bottom: 1em;
+}
+
+.name {
+    font-weight: bold;
+    font-size: 16pt;
+    margin: 0;
+}
+
+.path {
+    
+}
 </style>
     </head>
 
@@ -50,10 +61,11 @@
             <p>Search all of the ARFNET content fast</p>
             <div class="box">
                 <form class="form-inline" action="/query" method="get">
-                    <input class="input" type="text" name="query">
+                    <input class="input" type="text" name="query" value="%s">
                     <button type="submit">Search</button>
                 </form>
             </div>
+            %s
         </main>
     </body>
 </html>
diff --git a/main.c b/main.c
index 19d7730..9aa7e76 100644
--- a/main.c
+++ b/main.c
@@ -41,6 +41,27 @@ static char *index_format_template = NULL;
 
 static index_t g_index = NULL;
 
+static const char *result_html_template = 
+    "<div class=\"result\"><p class=\"name\">%s</p><a class=\"path\">%s</a></div>\n";
+
+
+static const char *
+generate_results_html(results_t *results)
+{
+    static char buff[65535];
+
+    char *pos = buff;
+  
+    for (int i = 0; i < results->size; i++) {
+        pos += snprintf(pos, 65535 - (pos - buff),
+            result_html_template,
+            results->results[i]->name,
+            results->results[i]->path
+        );
+    }
+
+    return buff;
+}
 
 enum MHD_Result answer_to_connection(
     void *cls, struct MHD_Connection *connection,
@@ -69,8 +90,7 @@ enum MHD_Result answer_to_connection(
     int ret;
 
     if (strcmp(method, "GET") == 0 && strcmp(url, "/") == 0) {
-        snprintf(buff, BUFF_SIZE,
-            index_format_template);
+        snprintf(buff, BUFF_SIZE, index_format_template, "", "");
 
         response = MHD_create_response_from_buffer(strlen(buff), (void*)buff,
             MHD_RESPMEM_PERSISTENT);
@@ -80,20 +100,19 @@ enum MHD_Result answer_to_connection(
         MHD_destroy_response(response);
     }
     else if (strcmp(method, "GET") == 0 && strcmp(url, "/query") == 0) {
-        snprintf(buff, BUFF_SIZE,
-            index_format_template);
-
         const char *query = MHD_lookup_connection_value(connection,
             MHD_GET_ARGUMENT_KIND, "query");
 
         results_t *results = index_lookup(g_index, LOOKUP_SUBSTR, query);
-        printf("results\n");
-        for (size_t i = 0; i < results->size; i++)
-            printf("\t%s\n", results->results[i]->name);
+
+        snprintf(buff, BUFF_SIZE, index_format_template, query,
+            generate_results_html(results));
 
         response = MHD_create_response_from_buffer(strlen(buff), (void*)buff,
             MHD_RESPMEM_PERSISTENT);
 
+        results_destroy(results);
+
         printf("%d\n", 200);
         ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
         MHD_destroy_response(response);
@@ -123,7 +142,7 @@ int main() {
     fseek(tf, 0, SEEK_END);
     size_t tfs = ftell(tf);
     rewind(tf);
-    index_format_template = malloc(tfs);
+    index_format_template = malloc(tfs + 1);
     fread(index_format_template, 1, tfs, tf);
     fclose(tf);
     index_format_template[tfs] = '\0';
diff --git a/search b/search
index 9f8c51c0a823e751ee1e388c8928f161ac1a920e..e7e95765ddd82b1bffa504818b574659b8a45fe1 100755
GIT binary patch
delta 15096
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
b?%JuR1%j37H7^y~i~nRmw{rd7T^;`)H{PCs

delta 13942
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
L;xXfmody2~%mi_M

-- 
2.47.3


References:
[arfnet2-search PATCH 00/16] Pre-release deploymentarf20 <arf20@xxxxxxxxx>