Blame bibutils/title.c

Packit 89ede9
/*
Packit 89ede9
 * title.c
Packit 89ede9
 *
Packit 89ede9
 * process titles into title/subtitle pairs for MODS
Packit 89ede9
 *
Packit 89ede9
 * Copyright (c) Chris Putnam 2004-2018
Packit 89ede9
 *
Packit 89ede9
 * Source code released under the GPL version 2
Packit 89ede9
 *
Packit 89ede9
 */
Packit 89ede9
#include <stdio.h>
Packit 89ede9
#include <stdlib.h>
Packit 89ede9
#include <string.h>
Packit 89ede9
#include "str.h"
Packit 89ede9
#include "fields.h"
Packit 89ede9
#include "title.h"
Packit 89ede9
#include "is_ws.h"
Packit 89ede9
Packit 89ede9
int
Packit 89ede9
title_process( fields *info, char *tag, char *data, int level, 
Packit 89ede9
	unsigned char nosplittitle )
Packit 89ede9
{
Packit 89ede9
	str title, subtitle;
Packit 89ede9
	char *p, *q;
Packit 89ede9
	int status;
Packit 89ede9
Packit 89ede9
	str_init( &title );
Packit 89ede9
	str_init( &subtitle );
Packit 89ede9
Packit 89ede9
	if ( nosplittitle ) q = NULL;
Packit 89ede9
	else {
Packit 89ede9
		q = strstr( data, ": " );
Packit 89ede9
		if ( !q ) q = strstr( data, "? " );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( !q ) str_strcpyc( &title, data );
Packit 89ede9
	else {
Packit 89ede9
		p = data;
Packit 89ede9
		while ( p!=q ) str_addchar( &title, *p++ );
Packit 89ede9
		if ( *q=='?' ) str_addchar( &title, '?' );
Packit 89ede9
		q++;
Packit 89ede9
		q = skip_ws( q );
Packit 89ede9
		while ( *q ) str_addchar( &subtitle, *q++ );
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	if ( strncasecmp( "SHORT", tag, 5 ) ) {
Packit 89ede9
		if ( str_has_value( &title ) ) {
Packit 89ede9
			status = fields_add( info, "TITLE", str_cstr( &title ), level );
Packit 89ede9
			if ( status!=FIELDS_OK ) return 0;
Packit 89ede9
		}
Packit 89ede9
		if ( str_has_value( &subtitle ) ) {
Packit 89ede9
			status = fields_add( info, "SUBTITLE", str_cstr( &subtitle ), level );
Packit 89ede9
			if ( status!=FIELDS_OK ) return 0;
Packit 89ede9
		}
Packit 89ede9
	} else {
Packit 89ede9
		if ( str_has_value( &title ) ) {
Packit 89ede9
			status = fields_add( info, "SHORTTITLE", str_cstr( &title ), level );
Packit 89ede9
			if ( status!=FIELDS_OK ) return 0;
Packit 89ede9
		}
Packit 89ede9
		/* no SHORT-SUBTITLE! */
Packit 89ede9
	}
Packit 89ede9
Packit 89ede9
	str_free( &subtitle );
Packit 89ede9
	str_free( &title );
Packit 89ede9
Packit 89ede9
	return 1;
Packit 89ede9
}
Packit 89ede9
Packit 89ede9
/* title_combine()
Packit 89ede9
 *
Packit 89ede9
 * Combine a main title and a subtitle into a full title.
Packit 89ede9
 *
Packit 89ede9
 * Example:
Packit 89ede9
 * 	Main title = "A Clearing in the Distance"
Packit 89ede9
 * 	Subtitle   = "The Biography of Frederick Law Olmstead"
Packit 89ede9
 * 	Full title = "A Clearing in the Distance: The Biography of Frederick Law Olmstead"
Packit 89ede9
 * Example:
Packit 89ede9
 *	Main title = "What Makes a Good Team Player?"
Packit 89ede9
 *	Subtitle   = "Personality and Team Effectiveness"
Packit 89ede9
 *	Full title = "What Makes a Good Team Player? Personality and Team Effectiveness"
Packit 89ede9
 */
Packit 89ede9
void
Packit 89ede9
title_combine( str *fullttl, str *mainttl, str *subttl )
Packit 89ede9
{
Packit 89ede9
	str_empty( fullttl );
Packit 89ede9
Packit 89ede9
	if ( !mainttl ) return;
Packit 89ede9
Packit 89ede9
	str_strcpy( fullttl, mainttl );
Packit 89ede9
Packit 89ede9
	if ( subttl ) {
Packit 89ede9
		if ( str_has_value( mainttl ) ) {
Packit 89ede9
			if ( mainttl->data[ mainttl->len - 1 ] != '?' && mainttl->data[ mainttl->len - 1] != ':' )
Packit 89ede9
				str_strcatc( fullttl, ": " );
Packit 89ede9
			else
Packit 89ede9
				str_strcatc( fullttl, " " );
Packit 89ede9
		}
Packit 89ede9
		str_strcat( fullttl, subttl );
Packit 89ede9
	}
Packit 89ede9
}