- various improvements in SE drivers
This commit is contained in:
21
arrobj.c
21
arrobj.c
@ -31,6 +31,7 @@ static ParClass arrayObjClass = { "array", sizeof(ArrayObj) };
|
||||
|
||||
typedef struct WrtObjContext {
|
||||
FILE *file;
|
||||
int pos;
|
||||
char filename[PATH_MAX];
|
||||
} WrtObjContext;
|
||||
|
||||
@ -38,9 +39,17 @@ typedef struct WrtObjContext {
|
||||
int WrtObjOpen(WrtObjContext *ctx, char *fileName) {
|
||||
|
||||
int iret;
|
||||
|
||||
char *slashpos;
|
||||
|
||||
/* create a temporary file first */
|
||||
iret = snprintf(ctx->filename, sizeof(ctx->filename), ".%s", fileName);
|
||||
slashpos = strrchr(fileName, '/');
|
||||
if (slashpos == NULL) {
|
||||
ctx->pos = 0;
|
||||
} else {
|
||||
ctx->pos = slashpos - fileName + 1;
|
||||
}
|
||||
iret = snprintf(ctx->filename, sizeof(ctx->filename), "%.*s.%s"
|
||||
, ctx->pos, fileName, fileName + ctx->pos);
|
||||
if (iret < 0 || iret >= sizeof(ctx->filename)) {
|
||||
return 0;
|
||||
}
|
||||
@ -66,9 +75,13 @@ void WrtObj(WrtObjContext *ctx, char *objectName) {
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void WrtObjClose(WrtObjContext *ctx) {
|
||||
char finalName[PATH_MAX];
|
||||
|
||||
if (ctx) {
|
||||
fclose(ctx->file);
|
||||
rename(ctx->filename, ctx->filename+1);
|
||||
snprintf(finalName, sizeof finalName, "%.*s%s"
|
||||
, ctx->pos, ctx->filename, ctx->filename + ctx->pos + 1);
|
||||
rename(ctx->filename, finalName);
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -277,5 +290,5 @@ static int ArrayObjInit(SConnection *con, int argc, char *argv[], int dynamic) {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void ArrayObjStartup(void) {
|
||||
ParMakeClass(&arrayObjClass, NULL);
|
||||
MakeDriver("array", ArrayObjInit, 0);
|
||||
MakeDriver("array", ArrayObjInit, 0, "String Array Object");
|
||||
}
|
||||
|
Reference in New Issue
Block a user