342
342
for (line = header;;)
344
if (strncmp (line, field, field_len) == 0
345
&& line[field_len] == ':' && line[field_len + 1] == ' ')
347
const char *value_start;
348
const char *value_end;
351
value_start = line + field_len + 2;
352
value_end = strchr (value_start, '\n');
353
if (value_end == NULL)
354
value_end = value_start + strlen (value_start);
356
value = XNMALLOC (value_end - value_start + 1, char);
357
memcpy (value, value_start, value_end - value_start);
358
value[value_end - value_start] = '\0';
344
if (strncmp (line, field, field_len) == 0 && line[field_len] == ':')
346
const char *value_start;
347
const char *value_end;
350
value_start = line + field_len + 1;
351
if (*value_start == ' ')
353
value_end = strchr (value_start, '\n');
354
if (value_end == NULL)
355
value_end = value_start + strlen (value_start);
357
value = XNMALLOC (value_end - value_start + 1, char);
358
memcpy (value, value_start, value_end - value_start);
359
value[value_end - value_start] = '\0';
363
364
line = strchr (line, '\n');
364
365
if (line != NULL)
388
389
for (line = header;;)
390
if (strncmp (line, field, field_len) == 0
391
&& line[field_len] == ':' && line[field_len + 1] == ' ')
393
const char *oldvalue_start;
394
const char *oldvalue_end;
396
size_t header_part1_len;
397
size_t header_part3_len;
401
oldvalue_start = line + field_len + 2;
402
oldvalue_end = strchr (oldvalue_start, '\n');
403
if (oldvalue_end == NULL)
404
oldvalue_end = oldvalue_start + strlen (oldvalue_start);
405
oldvalue_len = oldvalue_end - oldvalue_start;
407
header_part1_len = oldvalue_start - header;
408
header_part3_len = header + header_len - oldvalue_end;
409
result_len = header_part1_len + value_len + header_part3_len;
410
/* = header_len - oldvalue_len + value_len */
411
result = XNMALLOC (result_len + 1, char);
412
memcpy (result, header, header_part1_len);
413
memcpy (result + header_part1_len, value, value_len);
414
memcpy (result + header_part1_len + value_len, oldvalue_end,
416
*(result + result_len) = '\0';
421
line = strchr (line, '\n');
391
if (strncmp (line, field, field_len) == 0 && line[field_len] == ':')
393
const char *oldvalue_start;
394
const char *oldvalue_end;
396
size_t header_part1_len;
397
size_t header_part3_len;
401
oldvalue_start = line + field_len + 1;
402
if (*oldvalue_start == ' ')
404
oldvalue_end = strchr (oldvalue_start, '\n');
405
if (oldvalue_end == NULL)
406
oldvalue_end = oldvalue_start + strlen (oldvalue_start);
407
oldvalue_len = oldvalue_end - oldvalue_start;
409
header_part1_len = oldvalue_start - header;
410
header_part3_len = header + header_len - oldvalue_end;
411
result_len = header_part1_len + value_len + header_part3_len;
412
/* = header_len - oldvalue_len + value_len */
413
result = XNMALLOC (result_len + 1, char);
414
memcpy (result, header, header_part1_len);
415
memcpy (result + header_part1_len, value, value_len);
416
memcpy (result + header_part1_len + value_len, oldvalue_end,
418
*(result + result_len) = '\0';
423
line = strchr (line, '\n');
687
689
char *copied_msgstr;
689
691
/* Special care must be taken of the case that msgstr points into the
690
mp->msgstr string list, because mp->msgstr may be relocated before we
691
are done with msgstr. */
692
mp->msgstr string list, because mp->msgstr may be relocated before we
693
are done with msgstr. */
692
694
if (msgstr >= p && msgstr < p_end)
693
msgstr = copied_msgstr = xstrdup (msgstr);
695
msgstr = copied_msgstr = xstrdup (msgstr);
695
copied_msgstr = NULL;
697
copied_msgstr = NULL;
697
699
for (; ; p += strlen (p) + 1, index--)
701
/* Append at the end. */
704
size_t new_msgstr_len = mp->msgstr_len + index + strlen (msgstr) + 1;
703
/* Append at the end. */
706
size_t new_msgstr_len = mp->msgstr_len + index + strlen (msgstr) + 1;
707
(char *) xrealloc ((char *) mp->msgstr, new_msgstr_len);
708
p = (char *) mp->msgstr + mp->msgstr_len;
709
for (; index > 0; index--)
711
memcpy (p, msgstr, strlen (msgstr) + 1);
712
mp->msgstr_len = new_msgstr_len;
714
if (copied_msgstr != NULL)
715
free (copied_msgstr);
709
(char *) xrealloc ((char *) mp->msgstr, new_msgstr_len);
710
p = (char *) mp->msgstr + mp->msgstr_len;
711
for (; index > 0; index--)
713
memcpy (p, msgstr, strlen (msgstr) + 1);
714
mp->msgstr_len = new_msgstr_len;
716
if (copied_msgstr != NULL)
717
free (copied_msgstr);
721
723
if (msgstr == NULL)
723
if (p + strlen (p) + 1 >= p_end)
725
/* Remove the string that starts at p. */
726
mp->msgstr_len = p - mp->msgstr;
729
/* It is not possible to remove an element of the string list
730
except the last one. So just replace it with the empty string.
731
That's the best we can do here. */
725
if (p + strlen (p) + 1 >= p_end)
727
/* Remove the string that starts at p. */
728
mp->msgstr_len = p - mp->msgstr;
731
/* It is not possible to remove an element of the string list
732
except the last one. So just replace it with the empty string.
733
That's the best we can do here. */
735
/* Replace the string that starts at p. */
736
size_t i1 = p - mp->msgstr;
737
size_t i2before = i1 + strlen (p);
738
size_t i2after = i1 + strlen (msgstr);
739
size_t new_msgstr_len = mp->msgstr_len - i2before + i2after;
737
/* Replace the string that starts at p. */
738
size_t i1 = p - mp->msgstr;
739
size_t i2before = i1 + strlen (p);
740
size_t i2after = i1 + strlen (msgstr);
741
size_t new_msgstr_len = mp->msgstr_len - i2before + i2after;
741
if (i2after > i2before)
742
mp->msgstr = (char *) xrealloc ((char *) mp->msgstr, new_msgstr_len);
743
memmove ((char *) mp->msgstr + i2after, mp->msgstr + i2before,
744
mp->msgstr_len - i2before);
745
memcpy ((char *) mp->msgstr + i1, msgstr, i2after - i1);
746
mp->msgstr_len = new_msgstr_len;
743
if (i2after > i2before)
744
mp->msgstr = (char *) xrealloc ((char *) mp->msgstr, new_msgstr_len);
745
memmove ((char *) mp->msgstr + i2after, mp->msgstr + i2before,
746
mp->msgstr_len - i2before);
747
memcpy ((char *) mp->msgstr + i1, msgstr, i2after - i1);
748
mp->msgstr_len = new_msgstr_len;
748
750
if (copied_msgstr != NULL)
749
free (copied_msgstr);
751
free (copied_msgstr);
1065
1067
if (len >= 7 && memcmp (format_type + len - 7, "-format", 7) == 0)
1066
1068
for (i = 0; i < NFORMATS; i++)
1067
1069
if (strlen (format_language[i]) == len - 7
1068
&& memcmp (format_language[i], format_type, len - 7) == 0)
1069
/* The given format_type corresponds to (enum format_type) i. */
1070
return (possible_format_p (mp->is_format[i]) ? 1 : 0);
1070
&& memcmp (format_language[i], format_type, len - 7) == 0)
1071
/* The given format_type corresponds to (enum format_type) i. */
1072
return (possible_format_p (mp->is_format[i]) ? 1 : 0);
1084
1086
if (len >= 7 && memcmp (format_type + len - 7, "-format", 7) == 0)
1085
1087
for (i = 0; i < NFORMATS; i++)
1086
1088
if (strlen (format_language[i]) == len - 7
1087
&& memcmp (format_language[i], format_type, len - 7) == 0)
1088
/* The given format_type corresponds to (enum format_type) i. */
1089
mp->is_format[i] = (value ? yes : no);
1089
&& memcmp (format_language[i], format_type, len - 7) == 0)
1090
/* The given format_type corresponds to (enum format_type) i. */
1091
mp->is_format[i] = (value ? yes : no);
1095
/* If a numeric range of a message is set, return true and store the minimum
1096
and maximum value in *MINP and *MAXP. */
1099
po_message_is_range (po_message_t message, int *minp, int *maxp)
1101
message_ty *mp = (message_ty *) message;
1103
if (has_range_p (mp->range))
1105
*minp = mp->range.min;
1106
*minp = mp->range.max;
1114
/* Change the numeric range of a message. MIN and MAX must be non-negative,
1115
with MIN < MAX. Use MIN = MAX = -1 to remove the numeric range of a
1119
po_message_set_range (po_message_t message, int min, int max)
1121
message_ty *mp = (message_ty *) message;
1123
if (min >= 0 && max >= min)
1125
mp->range.min = min;
1126
mp->range.max = max;
1128
else if (min < 0 && max < 0)
1133
/* Other values of min and max are invalid. */
1145
1189
if (len >= 7 && memcmp (format_type + len - 7, "-format", 7) == 0)
1146
1190
for (i = 0; i < NFORMATS; i++)
1147
1191
if (strlen (format_language[i]) == len - 7
1148
&& memcmp (format_language[i], format_type, len - 7) == 0)
1149
/* The given format_type corresponds to (enum format_type) i. */
1150
return format_language_pretty[i];
1192
&& memcmp (format_language[i], format_type, len - 7) == 0)
1193
/* The given format_type corresponds to (enum format_type) i. */
1194
return format_language_pretty[i];
1228
1272
ml.use_hashtable = false;
1230
1274
if (header != NULL)
1231
message_list_append (&ml, header);
1275
message_list_append (&ml, header);
1232
1276
if (mp != header)
1233
message_list_append (&ml, mp);
1277
message_list_append (&ml, mp);
1235
1279
check_message_list (&ml, 1, 1, 1, 0, 0, 0);
1259
1303
handler->xerror2;
1261
1305
if (!mp->obsolete)
1262
check_message (mp, &mp->pos, 0, 1, NULL, 0, 0, 0, 0, 0);
1306
check_message (mp, &mp->pos, 0, 1, NULL, 0, 0, 0, 0);
1264
1308
/* Restore error handler. */
1265
1309
po_xerror = textmode_xerror;
1302
1346
po_error = handler->error;
1304
1348
check_msgid_msgstr_format (mp->msgid, mp->msgid_plural,
1305
mp->msgstr, mp->msgstr_len,
1306
mp->is_format, NULL, 0, po_error_logger);
1349
mp->msgstr, mp->msgstr_len,
1350
mp->is_format, mp->range, NULL, po_error_logger);
1308
1352
/* Restore error handler. */
1309
1353
po_error = error;