diff options
Diffstat (limited to 'app/bin/cblock.c')
-rw-r--r-- | app/bin/cblock.c | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/app/bin/cblock.c b/app/bin/cblock.c index c4f6795..4c4895c 100644 --- a/app/bin/cblock.c +++ b/app/bin/cblock.c @@ -102,8 +102,8 @@ static char blockScript[STR_LONG_SIZE]; static long blockElementCount; static paramData_t blockPLs[] = { -/*0*/ { PD_STRING, blockName, "name", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)200, N_("Name"), 0, (void *)sizeof( blockName ) }, -/*1*/ { PD_STRING, blockScript, "script", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)350, N_("Script"), 0, (void *)sizeof( blockScript) } +/*0*/ { PD_STRING, blockName, "name", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)200, N_("Name"), 0, 0, sizeof( blockName )}, +/*1*/ { PD_STRING, blockScript, "script", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)350, N_("Script"), 0, 0, sizeof( blockScript)} }; static paramGroup_t blockPG = { "block", 0, blockPLs, sizeof blockPLs/sizeof blockPLs[0] }; static wWin_p blockW; @@ -114,8 +114,8 @@ static char blockEditSegs[STR_LONG_SIZE]; static track_p blockEditTrack; static paramData_t blockEditPLs[] = { -/*0*/ { PD_STRING, blockEditName, "name", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)200, N_("Name"), 0, (void *)sizeof(blockEditName) }, -/*1*/ { PD_STRING, blockEditScript, "script", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)350, N_("Script"), 0, (void *)sizeof(blockEditScript) }, +/*0*/ { PD_STRING, blockEditName, "name", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)200, N_("Name"), 0, 0, sizeof(blockEditName)}, +/*1*/ { PD_STRING, blockEditScript, "script", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)350, N_("Script"), 0, 0, sizeof(blockEditScript)}, /*2*/ { PD_STRING, blockEditSegs, "segments", PDO_NOPREF, (void*)350, N_("Segments"), BO_READONLY }, }; static paramGroup_t blockEditPG = { "block", 0, blockEditPLs, sizeof blockEditPLs/sizeof blockEditPLs[0] }; @@ -157,8 +157,8 @@ static struct { typedef enum { NM, SC, LN, E0, E1 } blockDesc_e; static descData_t blockDesc[] = { -/*NM*/ { DESC_STRING, N_("Name"), &blockData.name }, -/*SC*/ { DESC_STRING, N_("Script"), &blockData.script }, +/*NM*/ { DESC_STRING, N_("Name"), &blockData.name, sizeof(blockData.name) }, +/*SC*/ { DESC_STRING, N_("Script"), &blockData.script, sizeof(blockData.script) }, /*LN*/ { DESC_DIM, N_("Length"), &blockData.length }, /*E0*/ { DESC_POS, N_("End Pt 1: X,Y"), &blockData.endPt[0] }, /*E1*/ { DESC_POS, N_("End Pt 2: X,Y"), &blockData.endPt[1] }, @@ -170,30 +170,45 @@ static void UpdateBlock (track_p trk, int inx, descData_p descUpd, BOOL_T needUn const char * thename, *thescript; char *newName, *newScript; BOOL_T changed, nChanged, sChanged; + size_t max_str; LOG( log_block, 1, ("*** UpdateBlock(): needUndoStart = %d\n",needUndoStart)) if ( inx == -1 ) { nChanged = sChanged = changed = FALSE; thename = wStringGetValue( (wString_p)blockDesc[NM].control0 ); - if ( strcmp( thename, xx->name ) != 0 ) { + + if ( !xx->name || strcmp( thename, xx->name ) != 0 ) { nChanged = changed = TRUE; - newName = MyStrdup(thename); + max_str = blockDesc[NM].max_string; + if (max_str && strlen(thename)>max_str-1) { + newName = MyMalloc(max_str); + strncpy(newName, thename, max_str - 1); + newName[max_str-1] = '\0'; + NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_str-1); + } else newName = MyStrdup(thename); } + thescript = wStringGetValue( (wString_p)blockDesc[SC].control0 ); - if ( strcmp( thescript, xx->script ) != 0 ) { + if ( !xx->script || strcmp( thescript, xx->script ) != 0 ) { sChanged = changed = TRUE; - newScript = MyStrdup(thescript); + max_str = blockDesc[SC].max_string; + if (max_str && strlen(thescript)>max_str-1) { + newScript = MyMalloc(max_str); + strncpy(newScript, thescript, max_str - 1); + newScript[max_str-1] = '\0'; + NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_str-1); + } else newScript = MyStrdup(thescript); } if ( ! changed ) return; if ( needUndoStart ) UndoStart( _("Change block"), "Change block" ); UndoModify( trk ); if (nChanged) { - MyFree(xx->name); + if (xx->name) MyFree(xx->name); xx->name = newName; } if (sChanged) { - MyFree(xx->script); + if (xx->script) MyFree(xx->script); xx->script = newScript; } return; @@ -239,10 +254,10 @@ static void DescribeBlock (track_p trk, char * str, CSIZE_T len ) } sprintf( str, _("(%d): Layer=%d %s"), GetTrkIndex(trk), GetTrkLayer(trk)+1, message ); - strncpy(blockData.name,xx->name,STR_SHORT_SIZE-1); - blockData.name[STR_SHORT_SIZE-1] = '\0'; - strncpy(blockData.script,xx->script,STR_LONG_SIZE-1); - blockData.script[STR_LONG_SIZE-1] = '\0'; + blockData.name[0] = '\0'; + strncat(blockData.name,xx->name,STR_SHORT_SIZE-1); + blockData.script[0] = '\0'; + strncat(blockData.script,xx->script,STR_LONG_SIZE-1); blockData.length = 0; if (xx->numTracks > 0) { blockData.endPt[0] = GetTrkEndPos((&(xx->trackList))[0].t,0); @@ -736,9 +751,10 @@ static void EditBlock (track_p trk) wIndex_t iTrack; BOOL_T needComma = FALSE; char temp[32]; - - strncpy(blockEditName,xx->name,STR_SHORT_SIZE); - strncpy(blockEditScript,xx->script,STR_LONG_SIZE); + strncpy(blockEditName, xx->name, STR_SHORT_SIZE - 1); + blockEditName[STR_SHORT_SIZE-1] = '\0'; + strncpy(blockEditScript, xx->script, STR_LONG_SIZE - 1); + blockEditScript[STR_LONG_SIZE-1] = '\0'; blockEditSegs[0] = '\0'; for (iTrack = 0; iTrack < xx->numTracks ; iTrack++) { if ((&(xx->trackList))[iTrack].t == NULL) continue; |