summaryrefslogtreecommitdiff
path: root/app/bin/compound.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/compound.c')
-rw-r--r--app/bin/compound.c84
1 files changed, 61 insertions, 23 deletions
diff --git a/app/bin/compound.c b/app/bin/compound.c
index dad7dda..d1a16f5 100644
--- a/app/bin/compound.c
+++ b/app/bin/compound.c
@@ -31,11 +31,13 @@
#include "common.h"
#include "compound.h"
#include "cundo.h"
+#include "dynstring.h"
#include "fileio.h"
#include "i18n.h"
#include "shrtpath.h"
#include "track.h"
#include "utility.h"
+#include "messages.h"
/*****************************************************************************
*
@@ -515,9 +517,9 @@ static descData_t compoundDesc[] = {
/*GR*/ { DESC_FLOAT, N_("Grade"), &compoundData.grade },
/*OR*/ { DESC_POS, N_("Origin: X,Y"), &compoundData.orig },
/*AN*/ { DESC_ANGLE, N_("Angle"), &compoundData.angle },
-/*MN*/ { DESC_STRING, N_("Manufacturer"), &compoundData.manuf },
-/*NM*/ { DESC_STRING, N_("Name"), &compoundData.name },
-/*PN*/ { DESC_STRING, N_("Part No"), &compoundData.partno },
+/*MN*/ { DESC_STRING, N_("Manufacturer"), &compoundData.manuf, sizeof(compoundData.manuf)},
+/*NM*/ { DESC_STRING, N_("Name"), &compoundData.name, sizeof(compoundData.name) },
+/*PN*/ { DESC_STRING, N_("Part No"), &compoundData.partno, sizeof(compoundData.partno)},
/*EC*/ { DESC_LONG, N_("# End Pts"), &compoundData.epCnt },
/*SC*/ { DESC_LONG, N_("# Segments"), &compoundData.segCnt },
/*LY*/ { DESC_LAYER, N_("Layer"), &compoundData.layerNumber },
@@ -544,14 +546,27 @@ static void UpdateCompound( track_p trk, int inx, descData_p descUpd, BOOL_T nee
if (nP == NULL) nP = "";
if (pP == NULL) pP = "";
manufS = wStringGetValue( (wString_p)compoundDesc[MN].control0 );
- strcpy( message, manufS );
- if ( strncmp( manufS, mP, mL ) != 0 || manufS[mL] != '\0' ) {
+ size_t max_manustr = 256, max_partstr = 256, max_namestr = 256;
+ if (compoundDesc[MN].max_string)
+ max_manustr = compoundDesc[MN].max_string-1;
+ if (strlen(manufS)>max_manustr) {
+ NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_manustr-1);
+ }
+ message[0] = '\0';
+ strncat( message, manufS, max_manustr-1 );
+ if ( strncmp( manufS, mP, mL ) != 0 || mL != strlen(manufS) ) {
titleChanged = TRUE;
}
flipped = xx->flipped;
ungrouped = xx->ungrouped;
split = xx->split;
nameS = wStringGetValue( (wString_p)compoundDesc[NM].control0 );
+ max_namestr = 256;
+ if (compoundDesc[NM].max_string)
+ max_namestr = compoundDesc[NM].max_string;
+ if (strlen(nameS)>max_namestr) {
+ NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_namestr-1);
+ }
if ( strncmp( nameS, "Flipped ", 8 ) == 0 ) {
nameS += 8;
flipped = TRUE;
@@ -570,23 +585,31 @@ static void UpdateCompound( track_p trk, int inx, descData_p descUpd, BOOL_T nee
} else {
split = FALSE;
}
- if ( strncmp( nameS, nP, nL ) != 0 || nameS[nL] != '\0' ||
+ if ( strncmp( nameS, nP, nL ) != 0 || nL != strlen(nameS) ||
xx->flipped != flipped ||
xx->ungrouped != ungrouped ||
xx->split != split ) {
titleChanged = TRUE;
}
strcat( message, "\t" );
- strcat( message, nameS );
+ strncat( message, nameS, max_namestr-1 );
partnoS = wStringGetValue( (wString_p)compoundDesc[PN].control0 );
- strcat( message, "\t" );
- strcat( message, partnoS );
+ max_partstr = 256;
+ if (compoundDesc[PN].max_string)
+ max_partstr = compoundDesc[PN].max_string;
+ if (strlen(partnoS)>max_partstr) {
+ NoticeMessage2(0, MSG_ENTERED_STRING_TRUNCATED, _("Ok"), NULL, max_partstr-1);
+ }
+ strcat( message, "\t");
+ strncat( message, partnoS, max_partstr-1 );
newTitle = MyStrdup( message );
- if ( strncmp( partnoS, pP, pL ) != 0 || partnoS[pL] != '\0' ) {
+ if ( strncmp( partnoS, pP, pL ) != 0 || pL != strlen(partnoS) ) {
titleChanged = TRUE;
}
- if ( ! titleChanged )
+ if ( ! titleChanged ) {
+ MyFree(newTitle);
return;
+ }
if ( needUndoStart )
UndoStart( _("Change Track"), "Change Track" );
UndoModify( trk );
@@ -596,6 +619,7 @@ static void UpdateCompound( track_p trk, int inx, descData_p descUpd, BOOL_T nee
DrawCompoundDescription( trk, &tempD, GetTrkColor(trk,&tempD) );
}
/*sprintf( message, "%s\t%s\t%s", manufS, nameS, partnoS );*/
+ if (xx->title) MyFree(xx->title);
xx->title = newTitle;
xx->flipped = flipped;
xx->ungrouped = ungrouped;
@@ -717,6 +741,8 @@ void DescribeCompound(
int mL, nL, pL;
long mode;
long listLabelsOption = listLabels;
+ DynString description;
+ char *trackType;
if ( xx->flipped )
listLabelsOption |= LABEL_FLIPPED;
@@ -727,14 +753,28 @@ void DescribeCompound(
FormatCompoundTitle( listLabelsOption, xtitle(xx) );
if (message[0] == '\0')
FormatCompoundTitle( listLabelsOption|LABEL_DESCR, xtitle(xx) );
- strcpy( str, _(GetTrkTypeName( trk )) );
- str++;
- while (*str) {
- *str = tolower((unsigned char)*str);
- str++;
+
+ if (GetTrkEndPtCnt(trk) <= 1) {
+ trackType = _("Structure");
+ } else {
+ trackType = GetTrkEndPtCnt(trk) > 2 ? _("Turnout") : _("Sectional Track");
+ }
+ DynStringMalloc(&description, len);
+ DynStringPrintf(&description,
+ _("%s (%d) Layer= %d %s"),
+ trackType,
+ GetTrkIndex(trk),
+ GetTrkLayer(trk) + 1,
+ message);
+
+ if (DynStringSize(&description) > (unsigned)len) {
+ strncpy(str, DynStringToCStr(&description), len - 1);
+ strcpy(str + len - 4, "...");
+ } else {
+ strcpy(str, DynStringToCStr(&description));
}
- sprintf( str, _("(%d): Layer=%d %s"),
- GetTrkIndex(trk), GetTrkLayer(trk)+1, message );
+
+ DynStringFree(&description);
epCnt = GetTrkEndPtCnt(trk);
fix = 0;
@@ -828,11 +868,9 @@ void DescribeCompound(
compoundData.grade = fabs( (compoundData.elev[0]-compoundData.elev[1])/compoundData.length )*100.0;
else
compoundData.grade = 0.0;
- if ( compoundData.epCnt >1 ) {
- DoDescribe( compoundData.epCnt>2?_("Turnout"):_("Sectional Track"), trk, compoundDesc, UpdateCompound );
- } else {
- DoDescribe( _("Structure"), trk, compoundDesc, UpdateCompound );
- }
+
+ DoDescribe(trackType, trk, compoundDesc, UpdateCompound);
+
}