Example #1
0
void INS_EDGE(CSG *csg, CSG_Node *source, CSG_Node *target) 
{ 
	CSG_Node **bucket;

	if (*(LABEL(target)) == LAST_SYMBOL) 
		SET_FINAL(source); 
	else {
		if (OUT(source) == 0) {
			source->arc = (CSG_Node **)target;
		} else  {
			if (OUT(source) == 1) {
				bucket = (CSG_Node **)malloc(sizeof(CSG_Node *)
				* 2);
				bucket[0] = (CSG_Node *)source->arc;
				source->arc = bucket;
			} else if (OUT(source) == 2) {
				source->arc = (CSG_Node **)realloc(source->arc 
				, sizeof(CSG_Node *) * 5);
			} 
			source->arc[OUT(source)] = target; 
		}
		OUT(source)++; 
		LG(target) = MAX(LG(target), (IS_INITIAL(source) 
		? 0 :  LG(source) + LEN_L(source))); 
	}
}; 
/* Everything starts here. :) */
int main ()
{
	int c, set = 1;
	bool is_immediate_decodable = true;

	while ((c = getc(stdin)) > 0)
	{
		// End of a group.
		if (c == '9')
		{
			fprintf(stdout, output[is_immediate_decodable], set);
			NEW_GROUP();
			is_immediate_decodable = true;
			++set;
		}
		else if (is_immediate_decodable)
		{
			switch (c)
			{
				// End of a code.
				case '\n':
				case ' ':
				case '\t':
				{
					// Checking if is immediate decodable.
					if (PATH_CONTINUES()) {
						is_immediate_decodable = false;
						continue;
					}
					// This is a final node for a code.
					SET_FINAL();
					// A new group takes place.
					NEW_CODE();
					break;
				}

				// 0 or 1.
				default:
				{
					c -= '0';
					GO(c);
					if (IS_FINAL())
						is_immediate_decodable = false;
				}
			}
		}
	}

	return 0;
}