Code Search for Developers
 
 
  

read_package_field.c from openap at Krugle


Show read_package_field.c syntax highlighted

#include <stdlib.h>
#include <string.h>
#include "libbb.h"

/*
 * Gets the next package field from package_buffer, seperated into the field name
 * and field value, it returns the int offset to the first character of the next field
 */
int read_package_field(const char *package_buffer, char **field_name, char **field_value)
{
	int offset_name_start = 0;
	int offset_name_end = 0;
	int offset_value_start = 0;
	int offset_value_end = 0;
	int offset = 0;
	int next_offset;
	int name_length;
	int value_length;
	int exit_flag = FALSE;

	if (package_buffer == NULL) {
		*field_name = NULL;
		*field_value = NULL;
		return(-1);
	}
	while (1) {
		next_offset = offset + 1;
		switch (package_buffer[offset]) {
			case('\0'):
				exit_flag = TRUE;
				break;
			case(':'):
				if (offset_name_end == 0) {
					offset_name_end = offset;
					offset_value_start = next_offset;
				}
				/* TODO: Name might still have trailing spaces if ':' isnt
				 * immediately after name */
				break;
			case('\n'):
				/* TODO: The char next_offset may be out of bounds */
				if (package_buffer[next_offset] != ' ') {
					exit_flag = TRUE;
					break;
				}
			case('\t'):
			case(' '):
				/* increment the value start point if its a just filler */
				if (offset_name_start == offset) {
					offset_name_start++;
				}
				if (offset_value_start == offset) {
					offset_value_start++;
				}
				break;
		}
		if (exit_flag == TRUE) {
			/* Check that the names are valid */
			offset_value_end = offset;
			name_length = offset_name_end - offset_name_start;
			value_length = offset_value_end - offset_value_start;
			if (name_length == 0) {
				break;
			}
			if ((name_length > 0) && (value_length > 0)) {
				break;
			}

			/* If not valid, start fresh with next field */
			exit_flag = FALSE;
			offset_name_start = offset + 1;
			offset_name_end = 0;
			offset_value_start = offset + 1;
			offset_value_end = offset + 1;
			offset++;
		}
		offset++;
	}
	if (name_length == 0) {
		*field_name = NULL;
	} else {
		*field_name = xstrndup(&package_buffer[offset_name_start], name_length);
	}
	if (value_length > 0) {
		*field_value = xstrndup(&package_buffer[offset_value_start], value_length);
	} else {
		*field_value = NULL;
	}
	return(next_offset);
}





See more files for this project here

openap

OpenAP is the complete distribution of open-source software that is required to produce a fully 802.11b compliant wireless access point. OpenAP is also a platform on which developers and hobbyists may realize their ideas. Since the build environment and s

Project homepage: http://savannah.nongnu.org/projects/openap
Programming language(s): Assembly,C
License: gpl2

  Makefile
  README
  arith.c
  ask_confirmation.c
  chomp.c
  concat_path_file.c
  copy_file.c
  copy_file_chunk.c
  copyfd.c
  create_icmp_socket.c
  device_open.c
  dirname.c
  error_msg.c
  error_msg_and_die.c
  fgets_str.c
  find_mount_point.c
  find_pid_by_name.c
  find_root_device.c
  full_read.c
  full_write.c
  get_console.c
  get_last_path_component.c
  get_line_from_file.c
  gz_open.c
  herror_msg.c
  herror_msg_and_die.c
  human_readable.c
  inode_hash.c
  interface.c
  isdirectory.c
  kernel_version.c
  last_char_is.c
  libbb.h
  libc5.c
  loop.c
  make_directory.c
  messages.c
  mode_string.c
  module_syscalls.c
  mtab.c
  mtab_file.c
  my_getgrgid.c
  my_getgrnam.c
  my_getpwnam.c
  my_getpwnamegid.c
  my_getpwuid.c
  parse_mode.c
  parse_number.c
  perror_msg.c
  perror_msg_and_die.c
  print_file.c
  process_escape_sequence.c
  read_package_field.c
  real_loop.h
  recursive_action.c
  remove_file.c
  safe_read.c
  safe_strncpy.c
  simplify_path.c
  syscalls.c
  syslog_msg_with_name.c
  time_string.c
  trim.c
  u_signal_names.c
  unarchive.c
  unzip.c
  vdprintf.c
  verror_msg.c
  vherror_msg.c
  vperror_msg.c
  wfopen.c
  xfuncs.c
  xgetcwd.c
  xgethostbyname.c
  xreadlink.c
  xregcomp.c