add a real primitive new handler for mrk

This commit is contained in:
Carsten Haitzler 2014-10-02 12:59:32 +09:00
parent ae0277944b
commit a765645b45
1 changed files with 163 additions and 5 deletions

168
mrk.c
View File

@ -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 <bob@bob.com>\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"))
{