From f3e6a74f6b7eb3f52978a22e0998321126225f57 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Thu, 7 May 2020 09:32:00 +0000 Subject: [PATCH] upload Backy by JohnXenox, trying to Autobuild git-svn-id: svn://kolibrios.org@7883 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/backy/Backy-lib.h | 63 ++++++ programs/develop/backy/Backy.c | 352 +++++++++++++++++++++++++++++ programs/develop/backy/Backy.png | Bin 0 -> 6548 bytes programs/develop/backy/Build.sh | 3 + programs/develop/backy/Tupfile.lua | 6 + programs/develop/backy/backy | Bin 0 -> 35253 bytes 6 files changed, 424 insertions(+) create mode 100644 programs/develop/backy/Backy-lib.h create mode 100644 programs/develop/backy/Backy.c create mode 100644 programs/develop/backy/Backy.png create mode 100644 programs/develop/backy/Build.sh create mode 100644 programs/develop/backy/Tupfile.lua create mode 100644 programs/develop/backy/backy diff --git a/programs/develop/backy/Backy-lib.h b/programs/develop/backy/Backy-lib.h new file mode 100644 index 0000000000..9e8aee86d7 --- /dev/null +++ b/programs/develop/backy/Backy-lib.h @@ -0,0 +1,63 @@ + +#ifndef __jxl_Date_get_h__ +#define __jxl_Date_get_h__ + +typedef unsigned int uint32_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long long uint64_t; +typedef char int8_t; +typedef short int int16_t; +typedef int int32_t; +typedef long long int64_t; + +static inline uint32_t getDate(void) +{ + uint32_t date; + __asm__ __volatile__("int $0x40":"=a"(date):"a"(29)); + return date; +} + + + +static inline uint32_t getTime(void) +{ + uint32_t time; + __asm__ __volatile__("int $0x40":"=a"(time):"a"(3)); + return time; +} + + + +static inline void *openFile(uint32_t *length, const uint8_t *path) +{ + uint8_t *fd; + + __asm__ __volatile__ ("int $0x40":"=a"(fd), "=d"(*length):"a" (68), "b"(27),"c"(path)); + + return fd; +} + + + +static inline int32_t saveFile(uint32_t nbytes, uint8_t *data, uint32_t enc, uint8_t *path) +{ + int32_t val; + + uint8_t dt[28]; // basic information structure. + + (uint32_t) dt[0] = 2; // subfunction number. + (uint32_t) dt[4] = 0; // reserved. + (uint32_t) dt[8] = 0; // reserved. + (uint32_t) dt[12] = nbytes; // number of bytes to write. + (uint8_t *) dt[16] = data; // pointer to data. + (uint32_t) dt[20] = enc; // string encoding (0 = default, 1 = cp866, 2 = UTF-16LE, 3 = UTF-8). + (uint8_t *) dt[24] = path; // pointer to path. + + __asm__ __volatile__("int $0x40":"=a"(val):"a"(80), "b"(&dt)); + + return val; +} + + +#endif diff --git a/programs/develop/backy/Backy.c b/programs/develop/backy/Backy.c new file mode 100644 index 0000000000..0e862bb314 --- /dev/null +++ b/programs/develop/backy/Backy.c @@ -0,0 +1,352 @@ + +/* + Author: JohnXenox. + Description: The program for backing up a file. + + Works from command line, only! +*/ + +#define CREATION_DATE "2020.05.07" + +#include +#include +#include + +#include "Backy-lib.h" + +int date = 0; +int time = 0; + +char years = 0; +char months = 0; +char days = 0; + +char hours = 0; +char minutes = 0; +char seconds = 0; + +char *data = 0; +int length = 0; + +char path_in[4096] = {0}; +char path_out[4096] = {0}; + +char num[3] = {0}; + +char full_date[25] = {0}; +char ext[] = ".bak"; + +char flag = 0; + + + +int main(int argc, char** argv) +{ + +// ============================================================ // +// preprocessing arguments from the command line. ============= // +// +// 0 argument - name of the programme. +// 1 argument - path to the file with name that need to be backup. +// 2 argument - the key (-o). +// 3 argument - path to the output directory without the name of the file. + +// printf("Number of args: %d\n", argc); +// printf("Argv 0: %s\n", argv[0]); +// sprintf("Argv 1: %s\n\n", argv[1]); + + +// ============================================================ // +// preprocess the command line arguments. ===================== // + + if (argc > 1) + { + for (int i = 1; i < argc; i++) + { + // if found the key "-o", then copy output path into the array "path_out". + if (*argv[i] == '-') // && (*(argv[i] + 1) == 'o')) + { + // printf("Key -o is found!\n"); + + i++; + + flag = 1; + + if (i <= argc) + { + // copying of a current path into the array "path_out". + strcpy(path_out, argv[i]); + + // printf("Path output is copyed!\n"); + + i++; + + break; + } + } + + // if inut path is found, then copy it into the array "path_in". + if (*argv[i] == '/') + { + flag = 2; + + // copying of a current path into the buffer. + strcpy(path_in, argv[i]); + + if (flag != 1) + { + int idx = strlen(path_in); + while (path_in[idx] != '/') + { + idx--; + } + + strncpy(path_out, path_in, idx); + } + + // printf("Path input is copyed!\n"); + } + + // if found characters. + if ( (*argv[i] > '0') && (*argv[i] < '9') || \ + (*argv[i] > 'A') && (*argv[i] < 'Z') || \ + (*argv[i] > 'a') && (*argv[i] < 'z') ) + { + flag = 3; + + strcpy(path_in, argv[0]); + // printf("Arg 0 is copyed!\n"); + + int idx = strlen(path_in); + + while (path_in[idx] != '/') + { + path_in[idx] = 0; + idx--; + } + + idx++; + strcpy(path_out, path_in); + strcpy(&path_in[idx], argv[1]); + // printf("Arg 1 is added!\n"); + + } + } + + // if not found the flag, then copy path from "path_in" into "path_out". + if ((flag == 0) && (flag != 2) && (flag != 3)) + { + // copying the input path into the output path, + strcpy(path_out, path_in); + //printf("Path input is copyed into the path output!\n"); + } + } + else + { + //con_init_console_dll_param(-1, 23, -1, 23, "Backy"); + + printf("\n Name: Backy"); + printf("\n Date: %s", CREATION_DATE); + printf("\n Description: The programme for backing up a file.\n"); + printf("\n Author: JohnXenox\n"); + + printf("\n Usage: backy <-o path2>\n"); + printf(" path1 - path to a file to be backuped.\n"); + printf(" -o path2 - path to the output directory without the name of a file.\n\n"); + + printf(" Examples:\n"); + printf(" backy test.c\n"); + printf(" backy test.c -o /tmp0/1/\n"); + printf(" backy /hd0/1/test.c\n"); + printf(" backy /hd0/1/test.c -o /tmp0/1/\n"); + + exit(0); + return 1; + } + + //printf("Path_in: %s\n", path_in); + //printf("Path_out: %s\n", path_out); + + +// ============================================================ // +// getting the time in BCD. =================================== // + + time = getTime(); // time = 0x00SSMMHH. + + hours = (char)time; + minutes = (char)(time >> 8); + seconds = (char)(time >> 16); + +// ============================================================ // +// getting the date in BCD. =================================== // + + date = getDate(); // date = 0x00DDMMYY. + + years = (char)date; + months = (char)(date >> 8); + days = (char)(date >> 16); + +// ============================================================ // +// fills the array with the date in ASCII. ==================== // + + char ofs = 0; + char *dta = 0; + + for (char i = 0; i < 3; i++) + { + if (i == 0) + { + dta = &years; + full_date[ofs] = '2'; + ofs++; + full_date[ofs] = '0'; + ofs++; + } + if (i == 1) + { + dta = &months; + } + if (i == 2) + { + dta = &days; + } + + + itoab(*dta, num, 16); + + if (num[1] == 0) + { + full_date[ofs] = '0'; + ofs++; + full_date[ofs] = num[0]; + } + else + { + full_date[ofs] = num[0]; + ofs++; + full_date[ofs] = num[1]; + } + + ofs++; + + if (i != 2) + { + full_date[ofs] = '.'; + ofs++; + } + } + + full_date[ofs] = '_'; + ofs++; + +// ============================================================ // +// fills the array with the time in ASCII. ==================== // + + ofs = 11; + dta = 0; + + for (char i = 0; i < 3; i++) + { + if (i == 0) + dta = &hours; + if (i == 1) + dta = &minutes; + if (i == 2) + dta = &seconds; + + itoab(*dta, num, 16); + + if (num[1] == 0) + { + full_date[ofs] = '0'; + ofs++; + full_date[ofs] = num[0]; + } + else + { + full_date[ofs] = num[0]; + ofs++; + full_date[ofs] = num[1]; + } + + ofs++; + + if (i < 2) + { + full_date[ofs] = '.'; + } + //else + //{ + // full_date[ofs] = '_'; + //} + + ofs++; + } + +// ============================================================ // +// adding the name of the input file to the output path. ====== // + + // searching the end of the path string. + int i = 0; + int y = 0; + + // searching for zero terminator in the input path. + while (path_in[i] != 0) + { + i++; + } + + // searching for slash in the input path. + while (path_in[i] != '/') + { + i--; + } + + // searching for zero terminator in the output path. + while (path_out[y] != 0) + { + y++; + } + + // searching for slash in the output path. + if (path_out[y - 1] == '/') + { + y--; + } + + // copying the input name of the file into the output path, + strcpy(&path_out[y], &path_in[i]); + +// ============================================================ // +// adding the extension and full date to the path. ============ // + + i = 0; + + // searching for zero terminator in the output path. + while (path_out[i] != 0) + { + i++; + } + + path_out[i] = '_'; + i++; + + // adding full date. + strcpy(&path_out[i], full_date); + + i += strlen(full_date); + + // adding the extension to path. + strncpy(&path_out[i], ext, 4); + + //printf("Path_in: %s\n", path_in); + //printf("Path_out: %s\n", path_out); + + data = openFile(&length, path_in); + + saveFile(length, data, 0, path_out); + + + return 0; +} + diff --git a/programs/develop/backy/Backy.png b/programs/develop/backy/Backy.png new file mode 100644 index 0000000000000000000000000000000000000000..635353c1b68e28553eab81f855c0e6193a7203b3 GIT binary patch literal 6548 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 literal 0 HcmV?d00001 diff --git a/programs/develop/backy/Build.sh b/programs/develop/backy/Build.sh new file mode 100644 index 0000000000..44240a11ce --- /dev/null +++ b/programs/develop/backy/Build.sh @@ -0,0 +1,3 @@ +#SHS +tcc Backy.c -o Backy -lck +exit diff --git a/programs/develop/backy/Tupfile.lua b/programs/develop/backy/Tupfile.lua new file mode 100644 index 0000000000..adfb2ed158 --- /dev/null +++ b/programs/develop/backy/Tupfile.lua @@ -0,0 +1,6 @@ +if tup.getconfig('NO_GCC') ~= "" then return end +HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR") +tup.include(HELPERDIR .. "/use_gcc.lua") +tup.include(HELPERDIR .. "/use_menuetlibc.lua") +compile_gcc{"Backy.c"} +link_gcc("Backy") \ No newline at end of file diff --git a/programs/develop/backy/backy b/programs/develop/backy/backy new file mode 100644 index 0000000000000000000000000000000000000000..a9d0b82dd678e14cbe0931c34e63d8949c2c82ca GIT binary patch literal 35253 zcmeHv4}4VhmG2B>aKPY%E!C)~S4&hXe*%htOKqrL*R~8h2vc>{Y6t`5nSV_t6>QPO z$zZORQMPNI`ifn3b=U6NXZzXi^P;RWNNaSlMx~EX6A4J)=Uyhe#wC@Z&C2_p^ZWho z+?fRM&v40%F4Mu{7uK_AKQFB>oM_JlJxnO zwB!9+RJ?RL9&c8?79b4zdvY2c$sO@27U8UEUpQxcYhcZ5zBzv5=XMNrFBARTceeTQ z{#?h7_@a(?TF+ms#gBBpvG}6+>7D zrM`K*^RmvvnVsv>Z9d=e`P8yaLeAZB{hL+C@t66Hc^*L%ztdVK8&^Eecr4+oQRCO` zgBp-cJ($S)Ll15rhn|ouhCX8A|8Q_ocPMompbm8nAR}Fcy39emrU%BE;ZlFv^oL#! zCXUStC6{_}m``Wmzu(1lg4IJ`6c{mb>z6xS~1+7d(0ntFB{!Tjma%l<@mPN-ut3z#+1i5V<>_pBXP_+y$p#g$-2*IB!21BSp8_u<(8~4nRFxZZkQ|$P zJV2Mty#QJyWv70GzYTp*mNTK3^-Ll=K9srv^Vul{5<%caI`vHEps2;DSE0h97C{Q& zk!@SVwW@yP+6+`HE%}iA9x(MoUbpBAb%>C7h(qF`%>DudH<$o{gUKNZ zCIj0j-pP35@)%$q1H@zCdM^gzooEFZ%miX67HIE94qiLqPG`a|B7Q2NS(Y&x$`_Uq zEMYgG5FN>pS~LkG%k7@e3Eo_^KjBh|89wAs8{tD9bT|^Y-5&~~&#^$I(p4LmfF#&r(feXomDg&MHV!{f~=k)VvKq)<0jB^fi497OaL zB2z;U_aS=`xZ$iZ$c|y$o+x@GBI2EyI%vzEHvcl;O1szF5H*FuY#Ds}%eKhJQ=JuT}8V7;Y%|^$PxB zi1d(B@TCgAm*Ib|;1LCXh2hHqm!`@?9hgOdTqYtS9q~NvNkBq6;t;OK!p(pVKJ0D@ zL(GCEyqSS7abmET8q-JEOMjj)y6>jh^%%e+J-CK|Hxn+5I%2mW#p2w$9ObF_l;Kl~ zPY^SXZ0vZCNcy>9@2rz{OY<&8)=rB8rjxPYB?g8J zJ!l5HKt`U8Ur=jKehd(-Yc@@U1OONT0+@lv=@}0CyAAOgaG=(l>>cflK4OArKWY}G zLmk&Ks3c(rAmd2H`ez!5RB|0U9kI{5iu<67zs1tRngQ1qv2Fob#5$AS?XP3hkavKb zGUFiR0pt5Pd51P2AK;k&MtH<&f$>lo(Yd2RERPh;jCA5yD75J(L=pIj=*SFogkRC; z@CZ3;Ql>eXgg4MomWab6iFAoM1^u4!hEc}AQU;cqQ)HQ_6X~ER3uzL^Ac9vss@Jmy z76m|n7h?pnP3A~|G`a``M<_jOuy&nIEbxyYu!wH~dX>7E%)*z=c-s(fQWGB5QW$ER zn=Lb@KBT{$3M9jdG-0>=dU(6%} zUGt>*Bw$A18B$B&hxBApGEy!vO~gL102)lLCZ_yk8(|~5l6xvmG#IfiBdbd#dq&7a z?*Q{+%Yj!5MMa+

?(1-|L+(&^UrKHweDP@muBBn`ta*t_IC5mQ> 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 literal 0 HcmV?d00001