File: sequence.c

package info (click to toggle)
garlic 1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 4,516 kB
  • sloc: ansic: 52,465; makefile: 2,254
file content (165 lines) | stat: -rw-r--r-- 4,691 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* Copyright (C) 2000, 2001 Damir Zucic */

/*=============================================================================

				sequence.c

Purpose:
	Execute  sequence command.  This command may be used to define or
	copy the sequence. The sequence is stored to the sequence buffer.
	The pointer to this buffer is a member of RuntimeS structure. The
	sequence command always requires at least one keyword.  Keywords:
	RESET,  =,  FROM, LOAD (READ) and SAVE.  All commands  (except =)
	may be abbreviated  to three characters.

Input:
	(1) Pointer to MolComplexS structure, with macromol. complexes.
	(2) The number of macromolecular complexes.
	(3) Pointer to RuntimeS structure.
	(4) Pointer to the string with command parameters.

Output:
	(1) Sequence stored to the sequence buffer.
	(2) Return value.

Return value:
	(1) Positive (command) code on success.
	(2) Negative (error) code on failure.

Notes:
	(1) The sequence  is expected in  three letters code.  One letter
	    code may be missinterpreted as valid three letters code.

========includes:============================================================*/

#include <stdio.h>

#include <string.h>
#include <ctype.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>

#include "defines.h"
#include "commands.h"
#include "typedefs.h"

/*======function prototypes:=================================================*/

int		ParseSequence_ (RuntimeS *, char *);
char		*ExtractToken_ (char *, int, char *, char *);
int		SequenceFrom_ (MolComplexS *, int, RuntimeS *, char *);
int		CopySequence_ (RuntimeS *);
int		LoadSequence_ (RuntimeS *);
int		SaveSequence_ (RuntimeS *);
int		SaveSequenceWithNumbers_ (RuntimeS *);

/*======execute sequence command:============================================*/

int Sequence_ (MolComplexS *mol_complexSP, int mol_complexesN,
	       RuntimeS *runtimeSP, char *stringP)
{
char		string_copyA[STRINGSIZE];
char		*P;
char		*sequenceP;
int		n;
char		*remainderP;
char		tokenA[SHORTSTRINGSIZE];

/* Copy the original command string: */
strncpy (string_copyA, runtimeSP->curr_commandA, STRINGSIZE - 1);
string_copyA[STRINGSIZE - 1] = '\0';

/* Check is the equality sign present in the original command string: */
if ((P = strstr (string_copyA, "=")) != NULL)
	{
	/* Prepare the pointer to the sequence string: */
	sequenceP = P + 1;

	/* Convert sequence to uppercase: */
	P = sequenceP;
	while ((n = *P++) != '\0') *(P - 1) = toupper (n);

	/* Parse and store the sequence: */
	n = ParseSequence_ (runtimeSP, sequenceP);
	if (n > 0) return COMMAND_SEQUENCE;
	else return ERROR_SEQUENCE;
	}

/* If this point is reached, the equality sign was not found */
/* in the original command string. Check for other keywords. */

/* Take the first token; it should be present: */
remainderP = ExtractToken_ (tokenA, SHORTSTRINGSIZE, stringP, " \t\n");
if (!remainderP)
	{
	strcpy (runtimeSP->messageA, "Command parameter(s) missing!");
	runtimeSP->message_length = strlen (runtimeSP->messageA);
	return ERROR_SEQUENCE;
	}

/* Reset sequence, if requested by keyword RES (RESET): */
if (strstr (tokenA, "RES") == tokenA)
	{
	runtimeSP->residuesN = 0;
	return COMMAND_SEQUENCE;
	}

/* Copy sequence from structure, if requested by keyword FRO (FROM): */
else if (strstr (tokenA, "FRO") == tokenA)
	{
	n = SequenceFrom_ (mol_complexSP, mol_complexesN,
			   runtimeSP, remainderP);
	if (n > 0) return COMMAND_SEQUENCE;
	else return ERROR_SEQUENCE;
	}

/* Copy the sequence from the main sequence buffer to the reference buffer: */
else if (strstr (tokenA, "COP") == tokenA)
	{
	CopySequence_ (runtimeSP);
	return COMMAND_SEQUENCE;
	}

/* Load seq. from file, if requested by keyword LOA (LOAD) or REA (READ): */
else if ((strstr (tokenA, "LOA") == tokenA) ||
	 (strstr (tokenA, "REA") == tokenA))
	{
	n = LoadSequence_ (runtimeSP);
	if (n > 0) return COMMAND_SEQUENCE;
	else return ERROR_SEQUENCE;
	}

/* Save sequence as three letter code, if requested by keyword SAV: */
else if (strstr (tokenA, "SAV") == tokenA)
	{
	n = SaveSequence_ (runtimeSP);
	if (n > 0) return COMMAND_SEQUENCE;
	else return ERROR_SEQUENCE;
	}

/* Save sequence as three letter code, with serial numbers: */
else if (strstr (tokenA, "SWN") == tokenA)
	{
	n = SaveSequenceWithNumbers_ (runtimeSP);
	if (n > 0) return COMMAND_SEQUENCE;
	else return ERROR_SEQUENCE;
	}

/* If keyword recognition failed: */
else
	{
	strcpy (runtimeSP->messageA, "Keyword not recognized!");
	runtimeSP->message_length = strlen (runtimeSP->messageA);
	return ERROR_SEQUENCE;
	}

/* Return the command code: */
return COMMAND_SEQUENCE;
}

/*===========================================================================*/