From a765645b458735ad77fe606f42e9d49c33055b97 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 2 Oct 2014 12:59:32 +0900 Subject: [PATCH] add a real primitive new handler for mrk --- mrk.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 163 insertions(+), 5 deletions(-) diff --git a/mrk.c b/mrk.c index b6fbc59..23b4595 100644 --- a/mrk.c +++ b/mrk.c @@ -1420,6 +1420,163 @@ package_qry(int op, const char *opdat) return 1; } +static int +package_file_isbin(const char *file) +{ + const char *p; + + p = strchr(file, '.'); + if (p) + { + if (!strcasecmp(p, ".png")) return 1; + if (!strcasecmp(p, ".jpg")) return 1; + if (!strcasecmp(p, ".edj")) return 1; + if (!strcasecmp(p, ".gif")) return 1; + if (!strcasecmp(p, ".bmp")) return 1; + } + return 0; +} + +static Eina_Bool +string_rep(const Eina_Hash *hash, const void *key, void *data, void *fdata) +{ + eina_strbuf_replace_all(fdata, key, data); + return EINA_TRUE; +} + +static int +package_dir_dup(const char *src, const char *dst, Eina_Hash *vars) +{ + char tmp[4096]; + char tmp2[4096]; + Eina_Strbuf *dstsbuf; + + dstsbuf = eina_strbuf_new(); + if (!dstsbuf) return 0; + eina_strbuf_append(dstsbuf, dst); + eina_hash_foreach(vars, string_rep, dstsbuf); + if (ecore_file_is_dir(src)) + { + Eina_List *files; + char *s; + + ecore_file_mkdir(eina_strbuf_string_get(dstsbuf)); + files = ecore_file_ls(src); + EINA_LIST_FREE(files, s) + { + if (s[0] != '.') + { + snprintf(tmp, sizeof(tmp), "%s/%s", src, s); + snprintf(tmp2, sizeof(tmp2), "%s/%s", eina_strbuf_string_get(dstsbuf), s); + package_dir_dup(tmp, tmp2, vars); + } + free(s); + } + } + else + { + if (package_file_isbin(src)) + ecore_file_cp(src, eina_strbuf_string_get(dstsbuf)); + else + { + FILE *fsrc, *fdst; + + fsrc = fopen(src, "rb"); + fdst = fopen(eina_strbuf_string_get(dstsbuf), "wb"); + if ((fsrc) && (fdst)) + { + long size; + + fseek(fsrc, 0, SEEK_END); + size = ftell(fsrc); + fseek(fsrc, 0, SEEK_SET); + if (size > 0) + { + char *buf = malloc(size + 1); + + if (buf) + { + Eina_Strbuf *tmpsbuf; + + tmpsbuf = eina_strbuf_new(); + if (tmpsbuf) + { + fread(buf, size, 1, fsrc); + buf[size] = 0; + eina_strbuf_append(tmpsbuf, buf); + eina_hash_foreach(vars, string_rep, tmpsbuf); + fwrite(eina_strbuf_string_get(tmpsbuf), + eina_strbuf_length_get(tmpsbuf), + 1, fdst); + eina_strbuf_free(tmpsbuf); + } + free(buf); + } + } + } + if (fsrc) fclose(fsrc); + if (fdst) fclose(fdst); + } + } + eina_strbuf_free(dstsbuf); + return 1; +} + +static int +package_gen(const char *tmpldir, const char *tmpl, Eina_Hash *vars) +{ + char tmp[4096]; + char tmp2[4096]; + const char *domain; + + domain = eina_hash_find(vars, "@APPDOM@"); + ecore_file_mkdir(domain); + snprintf(tmp, sizeof(tmp), "%s/apps/%s", tmpldir, tmpl); + package_dir_dup(tmp, domain, vars); + snprintf(tmp, sizeof(tmp), "%s/licenses/%s", + tmpldir, eina_hash_find(vars, "@APPCOPY@")); + snprintf(tmp2, sizeof(tmp2), "%s/COPYING", domain); + ecore_file_cp(tmp, tmp2); +} + +static int +package_new(void) +{ + Eina_Hash *vars = eina_hash_string_superfast_new(NULL); + char tmp[4096]; + + if (!vars) return 0; + printf("App Name: (e.g. Hello)\n"); + if (scanf("%500s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPNAME@", eina_stringshare_add(tmp)); + printf("App Domain: (e.g. hello)\n"); + if (scanf("%500s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPDOM@", eina_stringshare_add(tmp)); + printf("App Version: (e.g. 1.0.0)\n"); + if (scanf("%150s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPVER@", eina_stringshare_add(tmp)); + printf("App License: (e.g. BSD-2 | GPL2 | APACHE | GPL3)\n"); + if (scanf("%20s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPCOPY@", eina_stringshare_add(tmp)); + printf("App Brief Description: (1 line)\n"); + if (scanf("%400s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPDESC@", eina_stringshare_add(tmp)); + printf("App Categories: (e.g. media)\n"); + if (scanf("%1000s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPCATEGORIES@", eina_stringshare_add(tmp)); + printf("App Tags: (e.g. video audio media film movies music player)\n"); + if (scanf("%4000s", tmp) <= 0) return 0; + eina_hash_add(vars, "@APPTAGS@", eina_stringshare_add(tmp)); + printf("Developer Name + E-Mail: Bob Jones \n"); + if (scanf("%1000s", tmp) <= 0) return 0; + eina_hash_add(vars, "@DEVMAIL@", eina_stringshare_add(tmp)); + printf("App EFL Minimum Version: (e.g. 1.11)\n"); + if (scanf("%50s", tmp) <= 0) return 0; + eina_hash_add(vars, "@EFLVER@", eina_stringshare_add(tmp)); + package_gen("/home/raster/C/marrakesh/tmpl", "default", vars); + return 1; +} + int main(int argc, char **argv) { @@ -1432,21 +1589,21 @@ main(int argc, char **argv) if (argc < 2) { printf("sub commands:\n" + " new\n" " build\n" - " src\n" " bin\n" + " check\n" + " src\n" " extract FILE\n" " inst FILE\n" - " clean\n" " rm PKGNAME\n" " rel [FILE]\n" " down PKGNAME\n" " get PKGNAME\n" + " getsrc PKGNAME\n" + " clean\n" " list [CATEGORY]\n" " search KEY1 [KEY2] [KEY3] [...]\n" -// " new\n" -// " getsrc\n" - " check\n" "\n"); return -1; } @@ -1562,6 +1719,7 @@ main(int argc, char **argv) } else if (!strcmp(argv[1], "new")) { + package_new(); } else if (!strcmp(argv[1], "getsrc")) {