gwenhywfar 5.12.0
c_dist.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Mon Feb 08 2021
3 copyright : (C) 2021 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14
15#include "c_dist.h"
16#include "utils.h"
17#include "gwenbuild/filenames.h"
18
19#include <gwenhywfar/debug.h>
20#include <gwenhywfar/directory.h>
21
22#include <unistd.h>
23#include <sys/types.h>
24#include <sys/stat.h>
25#include <time.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <errno.h>
29
30
31
32static int _writeDistFiles(const char *initialSourceDir, const GWB_FILE_LIST2 *fileList, const char *folder);
33
34
35
36
38{
39 GWB_FILE_LIST2 *projectFileList;
40 GWEN_XMLNODE *xmlProjectInfo;
41 GWEN_BUFFER *nameBuf;
42 const char *initialSourceDir;
43 const char *projectName;
44 int versionMajor;
45 int versionMinor;
46 int versionPatchlevel;
47 int versionBuild;
48 const char *versionTag;
49 int rv;
50
52 if (projectFileList==NULL) {
53 DBG_ERROR(NULL, "No file list read.");
54 return GWEN_ERROR_GENERIC;
55 }
56
58 if (xmlProjectInfo==NULL) {
59 DBG_ERROR(NULL, "Error reading project info.");
60 GWB_File_List2_free(projectFileList);
61 return GWEN_ERROR_GENERIC;
62 }
63
64 initialSourceDir=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "initialSourceDir", NULL);
65 projectName=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "projectName", NULL);
66 versionMajor=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionMajor", 0);
67 versionMinor=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionMinor", 0);
68 versionPatchlevel=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionPatchlevel", 0);
69 versionBuild=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionBuild", 0);
70 versionTag=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "versionTag", NULL);
71 if (!(projectName && *projectName)) {
72 DBG_ERROR(NULL, "Missing project name in project info file");
73 GWEN_XMLNode_free(xmlProjectInfo);
74 GWB_File_List2_free(projectFileList);
75 return GWEN_ERROR_GENERIC;
76 }
77
78 nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
79 if (versionBuild>0)
81 "%s-%d.%d.%d.%d%s",
82 projectName,
83 versionMajor, versionMinor, versionPatchlevel, versionBuild,
84 versionTag?versionTag:"");
85 else
87 "%s-%d.%d.%d%s",
88 projectName,
89 versionMajor, versionMinor, versionPatchlevel,
90 versionTag?versionTag:"");
91
92 rv=_writeDistFiles(initialSourceDir, projectFileList, GWEN_Buffer_GetStart(nameBuf));
93 if (rv<0) {
94 DBG_ERROR(NULL, "Error copying files into dist folder \"%s\"",
95 GWEN_Buffer_GetStart(nameBuf));
96 GWEN_Buffer_free(nameBuf);
97 GWEN_XMLNode_free(xmlProjectInfo);
98 GWB_File_List2_free(projectFileList);
99 return rv;
100 }
101 GWEN_Buffer_free(nameBuf);
102 GWEN_XMLNode_free(xmlProjectInfo);
103 GWB_File_List2_free(projectFileList);
104
105
106 return 0;
107}
108
109
110
111int _writeDistFiles(const char *initialSourceDir,
112 const GWB_FILE_LIST2 *fileList,
113 const char *folder)
114{
115 GWB_FILE_LIST2_ITERATOR *it;
116
117 it=GWB_File_List2_First(fileList);
118 if (it) {
119 GWB_FILE *file;
120 GWEN_BUFFER *sourceNameBuf;
121 GWEN_BUFFER *destNameBuf;
122
123 sourceNameBuf=GWEN_Buffer_new(0, 256, 0, 1);
124 destNameBuf=GWEN_Buffer_new(0, 256, 0, 1);
125 file=GWB_File_List2Iterator_Data(it);
126 while(file) {
127 uint32_t flags;
128 const char *s;
129
130 flags=GWB_File_GetFlags(file);
131 if (flags & GWB_FILE_FLAGS_DIST) {
132 int rv;
133
134 /* generate source path */
135 if (!(flags & GWB_FILE_FLAGS_GENERATED)) {
136 GWEN_Buffer_AppendString(sourceNameBuf, initialSourceDir);
138 }
139 s=GWB_File_GetFolder(file);
140 if (s && *s) {
141 GWEN_Buffer_AppendString(sourceNameBuf, s);
143 }
144 GWEN_Buffer_AppendString(sourceNameBuf, GWB_File_GetName(file));
145
146 /* generate target path */
147 GWEN_Buffer_AppendString(destNameBuf, folder);
149 if (s && *s) {
150 GWEN_Buffer_AppendString(destNameBuf, s);
152 }
153 GWEN_Buffer_AppendString(destNameBuf, GWB_File_GetName(file));
154
155 fprintf(stdout, "Moving file '%s' into dist folder\n", GWEN_Buffer_GetStart(sourceNameBuf));
156 rv=GWB_Utils_CopyFile(GWEN_Buffer_GetStart(sourceNameBuf), GWEN_Buffer_GetStart(destNameBuf));
157 if (rv<0) {
158 DBG_ERROR(NULL, "Error copying \"%s\" into dist folder (%d)",
159 GWEN_Buffer_GetStart(sourceNameBuf), rv);
160 GWEN_Buffer_free(sourceNameBuf);
161 GWEN_Buffer_free(destNameBuf);
162 return rv;
163 }
164
165 GWEN_Buffer_Reset(sourceNameBuf);
166 GWEN_Buffer_Reset(destNameBuf);
167 }
168
169 file=GWB_File_List2Iterator_Next(it);
170 }
171 GWEN_Buffer_free(sourceNameBuf);
172 GWEN_Buffer_free(destNameBuf);
173 GWB_File_List2Iterator_free(it);
174 }
175
176 return 0;
177
178}
179
180
181
182
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition buffer.c:1087
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition buffer.c:653
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
static int _writeDistFiles(const char *initialSourceDir, const GWB_FILE_LIST2 *fileList, const char *folder)
Definition c_dist.c:111
int GWB_MkDist()
Definition c_dist.c:37
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_GENERIC
Definition error.h:62
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition file.c:127
const char * GWB_File_GetName(const GWB_FILE *f)
Definition file.c:146
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition file.c:99
struct GWB_FILE GWB_FILE
Definition file.h:18
#define GWB_FILE_FLAGS_GENERATED
Definition file.h:23
#define GWB_FILE_FLAGS_DIST
Definition file.h:21
#define GWBUILD_FILE_PROJECTINFO
Definition filenames.h:17
#define GWBUILD_FILE_FILES
Definition filenames.h:16
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_DIR_SEPARATOR_S
GWB_FILE_LIST2 * GWB_Utils_ReadFileList2(const char *fileName)
Definition utils.c:73
GWEN_XMLNODE * GWB_Utils_ReadProjectInfoFromFile(const char *fileName)
Definition utils.c:632
int GWB_Utils_CopyFile(const char *sSrcPath, const char *sDestPath)
Definition utils.c:462
int GWEN_XMLNode_GetIntValue(const GWEN_XMLNODE *n, const char *name, int defValue)
Definition xml.c:923
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition xml.c:812
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156