static int add_source (double ra, double dec, double weight, double energy) { Point_Source_Type *p; double cosx, cosy, cosz; /* Convert to God's units from arc-min */ ra = ra * (PI/(180.0 * 60.0)); dec = dec * (PI/(180.0 * 60.0)); if (Max_Num_Points == Num_Points) { Max_Num_Points += 32; p = (Point_Source_Type *)do_realloc ((char *)Point_Sources, Max_Num_Points * sizeof (Point_Source_Type)); if (p == NULL) { free_sources (); return -1; } Point_Sources = p; } p = Point_Sources + Num_Points; /* Note the the minus sign is to generate a vector pointing from the * source to the origin */ p->cosx = -cos (dec) * cos (ra); p->cosy = -cos (dec) * sin(ra); p->cosz = -sin (dec); p->weight = weight; p->energy = energy; Num_Points += 1; return 0; }
int user_open_source (char **argv, int argc, double area, double cosx, double cosy, double cosz) { FILE *fp; char line[1024]; char *file; unsigned int linenum; file = argv[0]; if (file == NULL) { fprintf (stderr, "UserSource Model requires FILE as argument\n"); return -1; } fp = fopen (file, "r"); if (fp == NULL) { fprintf (stderr, "Unable to open %s\n", file); return -1; } linenum = 0; while (NULL != fgets (line, sizeof (line), fp)) { double ra, dec, weight, energy; linenum++; if (4 != sscanf (line, "%lf %lf %lf %lf", &ra, &dec, &weight, &energy)) continue; if (weight <= 0.0) { fprintf (stderr, "weight on line %d of %s must be positive\n", linenum, file); free_sources (); return -1; } if (-1 == add_source (ra, dec, weight, energy)) { fclose (fp); return -1; } } fclose (fp); if (Num_Points == 0) { fprintf (stderr, "%s contains no sources\n", file); return -1; } normalize_sources (); return 0; }
/** * g_socket_listener_accept_socket: * @listener: a #GSocketListener * @source_object: (out) (transfer none) (allow-none): location where #GObject pointer will be stored, or %NULL. * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. * @error: #GError for error reporting, or %NULL to ignore. * * Blocks waiting for a client to connect to any of the sockets added * to the listener. Returns the #GSocket that was accepted. * * If you want to accept the high-level #GSocketConnection, not a #GSocket, * which is often the case, then you should use g_socket_listener_accept() * instead. * * If @source_object is not %NULL it will be filled out with the source * object specified when the corresponding socket or address was added * to the listener. * * If @cancellable is not %NULL, then the operation can be cancelled by * triggering the cancellable object from another thread. If the operation * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. * * Returns: (transfer full): a #GSocket on success, %NULL on error. * * Since: 2.22 */ GSocket * g_socket_listener_accept_socket (GSocketListener *listener, GObject **source_object, GCancellable *cancellable, GError **error) { GSocket *accept_socket, *socket; g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener), NULL); if (!check_listener (listener, error)) return NULL; if (listener->priv->sockets->len == 1) { accept_socket = listener->priv->sockets->pdata[0]; if (!g_socket_condition_wait (accept_socket, G_IO_IN, cancellable, error)) return NULL; } else { GList *sources; struct AcceptData data; GMainLoop *loop; if (listener->priv->main_context == NULL) listener->priv->main_context = g_main_context_new (); loop = g_main_loop_new (listener->priv->main_context, FALSE); data.loop = loop; sources = add_sources (listener, accept_callback, &data, cancellable, listener->priv->main_context); g_main_loop_run (loop); accept_socket = data.socket; free_sources (sources); g_main_loop_unref (loop); } if (!(socket = g_socket_accept (accept_socket, cancellable, error))) return NULL; if (source_object) *source_object = g_object_get_qdata (G_OBJECT (accept_socket), source_quark); return socket; }
void user_close_source (void) { free_sources (); }