File: select.c

package info (click to toggle)
garlic 1.5-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,324 kB
  • ctags: 1,378
  • sloc: ansic: 50,306; makefile: 1,088
file content (165 lines) | stat: -rw-r--r-- 4,982 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 */

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

				select.c

Purpose:
	Execute  select  command.  Select  the specified  atoms  in all
	caught  macromolecular  complexes.  Three  selection modes  are
	available:  0 = overwrite,  1 = restrict,  2 = expand  previous
        selection.

Input:
	(1) Pointer to MolComplexS structure.
	(2) Number of macromolecular complexes.
	(3) Pointer to RuntimeS structure.
	(4) Pointer to ConfigS structure.
	(5) Pointer to GUIS structure.
	(6) Pointer to NearestAtomS structure.
	(7) The number of pixels in the main window free area.
	(8) Pointer to refreshI.
	(9) The selection string.
       (10) Selection mode index.

Output:
	(1) Selection flag changed for some or all atoms.
	(2) Return value.

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

Notes:
	(1) This function resets the edit mode index.

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

#include <stdio.h>

#include <string.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:=================================================*/

char		*ExtractToken_ (char *, int, char *, char *);
long		FullSelect_ (MolComplexS *, int, char *, int);
long		SelectElement_ (MolComplexS *, int, char *, int);
long		SelectAtoms_ (MolComplexS *, int, RuntimeS *, char *, int);
long		SpecialSelect_ (MolComplexS *, int, RuntimeS *, char *, int);
long		QuickSelect_ (MolComplexS *, int, char *, int);
size_t		MainRefresh_ (MolComplexS *, int,
			      RuntimeS *, ConfigS *, GUIS *,
			      NearestAtomS *, size_t, unsigned int);
int		ControlRefresh_ (MolComplexS *, ConfigS *, GUIS *);

/*======execute select command:==============================================*/

int Select_ (MolComplexS *mol_complexSP, int mol_complexesN,
	     RuntimeS *runtimeSP, ConfigS *configSP, GUIS *guiSP,
	     NearestAtomS *nearest_atomSP, size_t pixelsN,
	     unsigned int *refreshIP,
	     char *stringP, int selection_modeI)
{
char		*remainderP;
char		tokenA[STRINGSIZE];
long		selected_atomsN;

/* The second token should contain  the selection */
/* criteria; it is called "the selection string": */
remainderP = ExtractToken_ (tokenA, STRINGSIZE, stringP, "\n\0");
if (!remainderP)
	{
	strcpy (runtimeSP->messageA, "Selection criteria missing!");
	runtimeSP->message_length = strlen (runtimeSP->messageA);
	return ERROR_SELECT;
	}

/* First try with the function which expects precise selection */
/* criteria;  the string is expected to contain three slashes: */
selected_atomsN = FullSelect_ (mol_complexSP, mol_complexesN,
			       tokenA, selection_modeI);

/* If the first attempt failed, try to intepret the command */
/* as the request to select the specified chemical element: */
if (selected_atomsN == -1)
	{
	selected_atomsN = SelectElement_ (mol_complexSP, mol_complexesN,
					  tokenA, selection_modeI);
	}

/* Try to interpret the command as the request to select */
/* the atom  which  has  the  specified  serial  number: */
if (selected_atomsN == -1)
	{
	selected_atomsN = SelectAtoms_ (mol_complexSP, mol_complexesN,
					runtimeSP, tokenA, selection_modeI);
	}

/* If  all previous functions  were unable  to interpret the */
/* selection string try with the special selection function: */
if (selected_atomsN == -1)
	{
	selected_atomsN = SpecialSelect_ (mol_complexSP, mol_complexesN,
					  runtimeSP, tokenA, selection_modeI);
	}

/* The last attempt - try with the "quick" selection: */
if (selected_atomsN == -1)
	{
	selected_atomsN = QuickSelect_ (mol_complexSP, mol_complexesN,
					tokenA, selection_modeI);
	}

/* Write the number of selected atoms to the input window: */
if (selected_atomsN >= 0)
	{
	sprintf (runtimeSP->messageA,
		 "%ld atom(s) selected", selected_atomsN);
	runtimeSP->message_length = strlen (runtimeSP->messageA);
	}

/* If all selection functions failed, prepare error message: */
else
	{
	strcpy (runtimeSP->messageA, "Selection failed!");
	runtimeSP->message_length = strlen (runtimeSP->messageA);
	return ERROR_SELECT;
	}

/* Default editing mode (0, no editing) does not */
/* require  redrawing.  Other modes  require it: */
if (runtimeSP->edit_modeI != 0)
	{
	/* Reset edit mode index: */
	runtimeSP->edit_modeI = 0;

	/* Reset edit_single_bondF flag: */
	runtimeSP->edit_single_bondF = 0;

	/* Refresh the main window: */
	(*refreshIP)++;
	MainRefresh_ (mol_complexSP, mol_complexesN,
		      runtimeSP, configSP, guiSP,
		      nearest_atomSP, pixelsN, *refreshIP);

	/* Refresh the control window: */
	ControlRefresh_ (mol_complexSP + runtimeSP->default_complexI,
			 configSP, guiSP);
	}

/* If this point is reached, everything worked fine: */
return COMMAND_SELECT;
}

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